这是否可以防止注射攻击?

时间:2011-03-22 17:09:43

标签: php security

这是否可以防止SQL注入攻击?

function sanitize($value) {
    // Stripslashes
    if (is_array($value)) {
        if (get_magic_quotes_gpc()) {
            $value = array_map("stripslashes", $value);
        }
        $value = array_map("mysql_real_escape_string", $value);
    } else {
        if (get_magic_quotes_gpc()) {
            $value = stripslashes($value);
        }
        $value = mysql_real_escape_string($value);
    }
    return $value;
}

$_REQUEST = array_map('sanitize', $_REQUEST);
$_GET = array_map('sanitize', $_GET);
$_POST = array_map('sanitize', $_POST);
$_COOKIE = array_map('sanitize', $_COOKIE);

我可以添加什么来清理()来防止跨站点脚本? 还有哪些其他渠道可以让攻击者插入恶意代码?

4 个答案:

答案 0 :(得分:2)

单字答案是“是”。但是:

  1. 如果$value是包含其他数组的数组,则无法正确处理。你应该循环$value对你找到的每个数组进行sanitize的递归调用。
  2. 最好使用预备语句而不是这样做。当然,如果您已经有一个完整的应用程序而且没有从头开始构建,那么这可能会有问题。
  3. 最后,有人可以破坏您的应用程序的其他方式是跨站点脚本(也称为CSS或XSS)和跨站点请求伪造(CSRF)。 SO和互联网上有很多资源可以用来加快速度。作为起点,针对XSS的保护涉及在您输出的任何内容上调用htmlspecialchars,而针对CSRF的保护涉及要求特权用户在您的站点上执行的每项操作的特定于会话的ID代码。

    阵列安全sanitize版本

    function sanitize($value) {
        if (is_array($value)) {
            foreach($value as &$item) {
                $item = sanitize($item);
            }
        } else {
            if (get_magic_quotes_gpc()) {
                $value = stripslashes($value);
            }
            $value = mysql_real_escape_string($value);
        }
        return $value;
    }
    

    <强>更新

    为了提高知名度:Bjoern与这个问题(What's the best method for sanitizing user input with PHP?)的链接非常好。

答案 1 :(得分:2)

没有

使用PHP Data Objects或者...使用Database Abstraction Layer或......执行此操作的某个框架。

不要自己编写,因为:

  • 其他人
  • 他们的代码工作正常
  • 您可以免费使用他们的代码
  • 他们想到了你还不知道的所有问题。
  • 要完成这项工作需要做很多工作,已经完成了,只花了二十分钟就找出了其他人的代码。

答案 2 :(得分:1)

如果在之后应用了数据库连接,那么它会正确地转义初始输入数据。

现在,您将无法使用此类转义值进行HTML输出。它不能防止二阶SQL注入(查询数据库,然后按原样使用这些值进行第二次查询)。更重要的是,大多数应用程序都在处理输入值。如果你进行任何类型的重写或字符串匹配,你可以撤消一些转义。

因此,为什么通常建议在汇编查询之前应用转义权限。尽管如此,代码本身对于一般情况是有用的,如果你不能重写遗留代码的大量则是可取的。

答案 3 :(得分:0)

您应该添加html_entities。大多数情况下,您将$ _POST变量放入文本框中,例如:

<textarea><?php echo $_POST['field']; ?></textarea>

他们可以通过填写并做任何他们想做的事来弄乱你的HTML。