我有一个旧系统,没有检查sql注入,我想在每次用户使用DB时添加mysqli_real_escape_string()
。
所有系统都是在index.php下构建的。页面看起来像那样:
if (!isset($_GET['p'])) {
$_GET['p'] = 'main';
}
if (!file_exists($_GET['p'].".php")) {
echo "The page you are looking for isn't exist.";
} else {
if (logs()) {
include($_GET['p'].".php");
}
else {
include('not_register.php');
}
}
我想把这个代码添加到最顶层的index.php
中,我想确定我没有弄乱任何东西,所以我在这里问。
foreach ($_POST as $name => $val) {
$_POST[$name] = mysqli_real_escape_string($db, $val);
}
运行每次重新加载页面的代码都会产生负面影响吗?
THX。
答案 0 :(得分:2)
此:
我希望每次用户使用时添加mysql_real_escape_string() DB。
使用mysql_ *函数的遗留mysql代码是一个很好的目标。但是,这个:
foreach($ _POST as $ name => $ val){ $ _POST [$ name] = mysqli_real_escape_string($ db,$ val); }
是另一回事。每次用户与数据库交互时,您都不会将其添加到每次与其他任何操作完成之前每次都添加它。该函数需要连接到数据库,因此如果您在使用这些变量的页面中没有这样的连接,则会立即遇到问题。此外,您可以中断那些可能不希望在此时转义值的变量的处理 - 它们应该被转义以供DB使用,因此在将它们与数据库一起使用之前,不要在此之前使用它们。
另外,正如其他人所说,您的代码很容易被include模式注入。 file_exists可以与网络共享,文件路径以及一些url包装一起使用。引用file_exists manual entry:
从PHP 5.0.0开始,此函数也可以与某些URL一起使用 包装。请参阅Supported Protocols and Wrappers以确定哪个 包装器支持stat()系列功能。
即使没有网址包装,恶意用户也可以使用您的包含直接包含一些服务器配置和其他您不想包含的文件。
答案 1 :(得分:-1)
运行这个问题一个循环将有助于没有人。实际上,您刚刚彻底改造了一个臭名昭着的魔术引号功能,该功能已从语言中删除。出于某种原因。
使用mysql_ *函数的遗留mysql代码不是一个好目标。仅仅因为这个功能与注射无关。
如果您只有25页 - 只需查看它们并正确重写SQL处理代码