我刚刚接管了一个充斥着SQL注入漏洞的旧PHP网站。编写器直接在 SQL 语句中包含$_GET
变量。
我不是PHP程序员,时间很短,所以我不可能被允许使用准备/参数化的语句。
我可能有时间做的最好的事情就是这种事情:
$unsafe_variable = $_POST["user-input"];
$safe_variable = mysql_real_escape_string($unsafe_variable);
mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");
有没有办法快速对网站上的所有页面执行此操作?例如,我可以有一个include
,它围绕$_GET
数组迭代并清理或转义变量,然后用 $_GET
数组中的安全版本覆盖其不安全版本。这意味着我可以一次性修复所有页面:)
编辑
我应该注意我不是 php 程序员,我无法选择使用预准备语句,所以我没有了解关于哪些 php 函数可以安全清理输入的辩论。在进一步阅读时,我相信如果我将 mysql 字符集设置为 utf8,则真正的转义函数是安全的
<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db = mysql_select_db("world");
if (!mysql_set_charset('utf8', $conn)) {
echo "Error: Unable to set the character set.'n";
exit;
}
我也相信代码根本不处理 GET 变量,而只是将它们添加到 sql 查询中。
是的,您可以执行包含或仅执行一行行,例如:
foreach($_REQUEST as $key => $val) { $_REQUEST[$key] = mysql_real_escape_string($val); }
这假定没有发布任何类似数组的表单字段。
但是,您必须了解
它不会减轻注射
但只是降低风险
最安全的方法是下载所有源代码,在 notepad++ 中打开所有.php文件,并在所有打开的文件中搜索mysql_,然后验证它是否必须被替换。
如果您的项目不是那么大,则不会花费太长时间,并且如果一个文件中的调用不完全相同,它将避免破坏您的代码。
这意味着我可以一次性修复所有页面:)
不幸的是,它无济于事。
因为显然没有快速的方法。
仅仅因为mysql_real_escape_string绝不会使变量"安全"。
如果肯定地确保您放入查询中的每个变量不仅被转义而且也被引用,则可以实现的唯一粗略等效的安全性。