此代码是否100%安全sql注入:
$id = $_GET['id']
mysql_query('SELECT * FROM mytable WHERE id < ' . (int)$id);
还是我必须这样做?
$id = $_GET['id']
mysql_query('SELECT * FROM mytable WHERE id < ' . mysql_real_escape_string($id));
答案 0 :(得分:2)
这篇文章似乎是一个很好的解释mysql_real_escape_string如何保护你免受SQL注入,但它也解释了它的“漏洞”
答案 1 :(得分:2)
此
mysql_query('SELECT * FROM mytable WHERE id < ' . mysql_real_escape_string($id));
会是不好的做法。如果你想让它成为一个字符串,至少引用字符串:
mysql_query('SELECT * FROM `mytable` WHERE `id`<"'.mysql_real_escape_string($id)).'"';
(当你在它的时候,引用所有的字段和表名,因为像id
这样的东西可能会或者在某些时候成为保留关键字)
如果是整数,我更喜欢演员表。字符串版本的一个参数是有一天id可能是字母数字(在很多网站上越来越常见)。
答案 2 :(得分:2)
如果$_GET['id']
为空,或(int)$_GET['id']
评估为空,则查询仍可能爆炸。您最终会在查询中出现语法错误。盲目地逃避或输入值并将其填充到查询中是不够的。你必须检查最后的“安全”值是否真的安全,而不仅仅是奶奶穿着的狼。
答案 3 :(得分:0)
我使用sprintf
,mysql_query(sprintf('SELECT * FROM mytable WHERE id < %d', $id));
答案 4 :(得分:0)
您应该使用参数化查询。那你就不用担心逃跑了。它还使SQL更容易阅读。哦,不要使用select *,只需选择你想要的内容。
答案 5 :(得分:0)
否强>
你必须这样做:
$id = mysql_real_escape_string($_GET['id']);
//put the escaped string in a $var, so your select statement stays readable
//this will help in debugging, and make **not** forgetting those vital quotes
//easier.
$query = "SELECT * FROM mytable WHERE id < '$id'";
// ^ ^always single quote your $vars
// ^ ^ and double quote the query
$result = mysql_query($query);
//and test to see if your query ran successful.
if (!$result) { //your query gave an error, handle it gracefully.
然后你就安全了。
答案 6 :(得分:-1)
这是安全的,但你可能想要
if(is_int($id)){
mysql_query('SELECT * FROM mytable WHERE id < ' . mysql_real_escape_string($id)); // just to be safe always to escape
}