我刚刚接管了一个旧的PHP网站,它充斥着SQL注入漏洞。作者在SQL语句中直接包含$_GET
变量。快速修复SQL注入漏洞的旧PHP网站的方法?
我不是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函数对于消毒输入是安全的。在futher阅读中,我相信真正的逃逸功能是安全的,如果我设置了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查询。
“我可以有一个包含迭代周围的GET数组,并清理或转义变量,然后用GET数组中的安全版本覆盖它的不安全版本” - 这取决于。你打算使用GET的数据来处理* SQL以外的任何事情吗? (大多数人都这么做)。 – Quentin
我会使用rename_function和override_function来重命名并重写mysql_query以首先清理查询,然后使用已清理的var的覆盖内的原始mysql_query函数。看到第一个评论在这里:http://www.php.net/manual/en/function.override-function.php#50821 –
不,没有办法自动转换所有的代码。你可以尝试使用一个基本的字符串搜索/替换,但它会错过太多,可能也会过度磨损。此外,在_GET级别进行消毒是毫无意义的 - 无法保证_GET中的内容将直接用于sql中。任何中间处理步骤都可以杀死您所做的任何转义。例如这就是为什么magic_quotes是一个彻头彻尾的愚蠢疯狂的想法。 –