,我正在尝试阻止SQL注入 ,当我使用MySQL时,我的功能是否足够?我该如何改进呢?
感谢您的时间和耐心。
<?php
function sanitize($data) {
if (is_array($data)) {
foreach($data as $var=>$val) {
$output[$var] = sanitize($val);
}
}
else {
if (get_magic_quotes_gpc()) {
$data = stripslashes($data);
}
$data = htmlspecialchars($data);
$output = mysql_real_escape_string($data);
}
return $output;
}
?>
答案 0 :(得分:4)
这是您在代码中永远不会使用的完美示例。规则很简单:
a)使用准备好的陈述(我强烈推荐这个解决方案)
或(如果由于某种原因你不能使用PDO或mysqli)
b.1)每个(即使您从“受信任”来源获得的 没有任何例外)充当值的字符串应为{{1} } ED
b.2)每个整数应为mysql_real_escape_string
b.3)如果它是预期的,则应检查每个非整数的数字
b.4)永远不要使用用户的输入作为列/表名的替换,总是使用白名单
简单到1-2-3
因此,只有在需要时才应用消毒功能 - 您永远不会对所有变量应用某些“通用”功能
我该如何改进?
改善它的唯一方法 - 删除它
<强> UPD 强>:
什么是白名单 - 假设您接受用户输入以用作列名。例如,用于分拣设施。
因此,您需要创建(int)
并检查用户的输入是否存在于此数组中(所谓的白名单)。如果是的话 - 你可以使用它,否则 - 你不会那样做