字符串$ 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 >
答案 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;
}