2014-04-03 107 views
2

我刚刚接管了一个旧的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查询。

+0

“我可以有一个包含迭代周围的GET数组,并清理或转义变量,然后用GET数组中的安全版本覆盖它的不安全版本” - 这取决于。你打算使用GET的数据来处理* SQL以外的任何事情吗? (大多数人都这么做)。 – Quentin

+1

我会使用rename_function和override_function来重命名并重写mysql_query以首先清理查询,然后使用已清理的var的覆盖内的原始mysql_query函数。看到第一个评论在这里:http://www.php.net/manual/en/function.override-function.php#50821 –

+0

不,没有办法自动转换所有的代码。你可以尝试使用一个基本的字符串搜索/替换,但它会错过太多,可能也会过度磨损。此外,在_GET级别进行消毒是毫无意义的 - 无法保证_GET中的内容将直接用于sql中。任何中间处理步骤都可以杀死您所做的任何转义。例如这就是为什么magic_quotes是一个彻头彻尾的愚蠢疯狂的想法。 –

回答

2

是的,你可以做一个包括或只是一个衬垫,如:

foreach($_REQUEST as $key => $val) { $_REQUEST[$key] = mysql_real_escape_string($val); } 

这不承担任何阵列式的表单域被公布。

但是,你要明白,

它无法减轻注射

,但只是降低了风险做这将是下载中心所有源

+0

Yep:单独留下函数调用,并在顶部输入[filter](http://www.php.net/manual/en/book.filter.php)。 – bishop

+0

是的,你的Common Sense所说的是绝对正确的。它也可能引入回归问题。它仅仅降低了风险。 – Jef

0

最保险的办法,打开所有的.php文件在记事本++中搜索mysql_的所有打开的文件,然后验证它是否必须被替换。

如果你的项目不是那么大,它不会花太长时间,如果在一个文件中调用不完全相同,它将避免打破你的代码。

0

这意味着我可以解决所有页面一气呵成:)

不幸的是,它不会帮助。

由于显然没有快捷方式。

只是因为mysql_real_escape_string不会使变量变得“安全”。

唯一安全的粗略等价的,如果做出积极确保你把每查询一个变量不仅逃脱,但也引述也可以实现。