这是一种安全的方法来防止SQL注入吗?

时间:2011-01-13 18:36:06

标签: php mysql sql-injection

此代码是否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));

7 个答案:

答案 0 :(得分:2)

这篇文章似乎是一个很好的解释mysql_real_escape_string如何保护你免受SQL注入,但它也解释了它的“漏洞”

http://www.webappsec.org/projects/articles/091007.shtml

答案 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)

我使用sprintfmysql_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
}