我刚刚接手了一个充斥着SQL注入漏洞的旧PHP网站。作者将$_GET
变量直接包含在SQL语句中。
我不是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,那么real-escape函数是安全的
<?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查询中。
答案 0 :(得分:2)
是的,你可以做一个包含或只是一个像“
”这样的衬里foreach($_REQUEST as $key => $val) { $_REQUEST[$key] = mysql_real_escape_string($val); }
这假设没有发布数组式表单字段。
但是,你必须明白
但只是降低风险
答案 1 :(得分:0)
最安全的方法是下载所有源代码,打开notepad ++中的所有.php文件,并在所有打开的文件中搜索mysql_,然后验证是否必须替换它。
如果您的项目不是那么大,它不会花费太长时间,如果在一个文件中调用不完全相同,它将避免破坏您的代码。
答案 2 :(得分:0)
这意味着我可以一次性修复所有页面:)
不幸的是,它无济于事。
因为显然没有快速的方法。
仅仅因为mysql_real_escape_string决不会使变量“安全”。
如果确定您查询的每个变量不仅可以转义,而且还可以引用,那么您可以实现的唯一大致相当的安全性。