-1

,我正在尝试防止 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;
    }
    ?>
4

1 回答 1

4

这是您永远不应该在代码中使用的完美示例。规则非常简单:

a)使用准备好的语句(我强烈推荐这个解决方案)

或(如果由于某种原因您不能使用 PDO 或 mysqli)

b.1)每个(甚至是您从“受信任”来源获得的,没有任何例外)作为值的字符串应该被mysql_real_escape_string编辑
b.2)每个整数都应该被(int)编辑
b.3)每个不是整数的数字都应该检查是否符合预期
b.4) 永远不要使用用户的输入作为列/表名称的替代,始终使用白名单

就像 1-2-3 一样简单

因此,您仅在需要时才应用消毒功能 - 您永远不会将某些“通用”功能应用于您拥有的所有变量

我该如何改进它?

改进它的唯一方法是删除它

更新

什么是白名单 - 假设您接受用户输入以用作列名。例如用于分拣设施。

所以你需要创建array('col1', 'col2')并检查用户的输入是否出现在这个数组中(所谓的白名单)。如果是这样 - 你可以使用它,否则 - 你不会那样做

于 2012-05-18T07:32:32.807 回答