PHP:哪个更有效地清理$ _get变量?

时间:2011-08-03 12:03:40

标签: php security sanitization

字符串$ title只能是小写字母数字或符号“ - ”。

在这种情况下,下列哪种方法可以有效抵御安全漏洞?

$title=$_GET["title"];
$title = strtolower(preg_replace("/[^a-z0-9\-]+/i", "-", $title));
< mysql query using $title goes here >

OR

$title=$_GET["title"];
$title = mysql_real_escape_string($title);
< mysql query using $title goes here >

5 个答案:

答案 0 :(得分:2)

你应该同时做这两件事。

$title = strtolower(preg_replace("/[^a-z0-9\-]+/i", "-", $title));
And then $title = mysql_real_escape_string($title);

逃避你的mysql值总是一个很好的做法,在这种情况下逃避它是没有用的,但是如果将来标题的规则发生变化并且你可以放任何角色,也许你不会记得改变它

答案 1 :(得分:0)

永远不要使用自己的转义方法来转义SQL查询;数据库服务器可以用它做得更好。

回答这个问题:正则表达式通常很慢。我想函数调用会快得多。

此外,永远不要依赖用户输入。

答案 2 :(得分:0)

我会使用mysql_real_escape_string,这将删除大部分mysql注入问题。如果标题不存在(因为,例如,某人正在尝试进行mysql注入),则不会找到任何行,因此,您显示404错误

答案 3 :(得分:0)

两者的结合。你必须记住你的正则表达可能不是很广泛。

答案 4 :(得分:0)

你没有消毒输入!

您使用适合数据目的地的方法验证输入(即接受或拒绝输入)并清理输出(即更改其表示)。

因此:

if (preg_match("/^[a-z0-9\-]+$/i", $_GET['title'])) {
   $my_title=mysql_real_escape_string(strtolower($_GET['title']));
   $sql=....'$my_title'....
} else {
   print "Invalid value for title";
   exit;
}