PHP函数来清理所有数据

时间:2010-09-14 00:40:56

标签: php mysql sql-injection

清理可能被sqlinjected的所有数据是一个好的或愚蠢的想法吗?我写了一个应该这样做的功能,但是我从来没有看过它,并且想知道这是不是一个糟糕的主意。 我写的功能:

function sanitizeData()
{
    $_SERVER['HTTP_USER_AGENT'] = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);
    foreach(array_keys($_COOKIE) as $key)
    {
          $_COOKIE[$key] = mysql_real_escape_string($_COOKIE[$key]);
    }
    foreach(array_keys($_POST) as $key)
    {
          $_POST[$key] = mysql_real_escape_string($_POST[$key]);
    }    
    foreach(array_keys($_GET) as $key)
    {
          $_GET[$key] = mysql_real_escape_string($_GET[$key]);
    }
}

2 个答案:

答案 0 :(得分:6)

一个坏主意;这基本上是弃用的magic_quotes的另一个版本。大部分数据可能不会最终进入数据库,因此您最终会不必要地逃避,并可能会双重逃避。

相反,请根据需要使用预准备语句。查看mysqli_stmt(mysqli的一部分)和PDOStatement(PDO的一部分)。

答案 1 :(得分:0)

理解mysql_real_escape_string不清理任何东西也很重要 通过应用此功能,您不会使任何数据安全。这是一个非常普遍的误解 此函数仅转义字符串分隔符。因此,它仅适用于字符串,引用分隔的字符串。 因此,真正的消毒可能只是这样:

$_GET[$key] = "'".mysql_real_escape_string($_GET[$key])."'";

即使这个也不够。

但正如马特所提到的,这将是非常糟糕的做法。甚至更多:事实上,不仅输入数据应该被正确格式化/参数化。它是数据库功能,而不是用户输入!它与用户输入无关。有些数据可能不是来自用户输入,而是来自文件或其他查询或某些服务 - 所有数据都应该正确格式化。理解这一点非常重要。

此外,您使用一种奇怪的方式来迭代数组 这个更常见:

foreach($_GET as $key => $value)
{
      $_GET[$key] = mysql_real_escape_string($value);
}