修复充斥着SQL注入漏洞的旧PHP网站的快速方法


Quick way to fix old PHP website riddled with SQL injection vulnerabilities?

我刚刚接管了一个充斥着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绝不会使变量"安全"。

如果肯定地确保您放入查询中的每个变量不仅被转义而且也被引用,则可以实现的唯一粗略等效的安全性。