清理可能被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]);
}
}
答案 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);
}