我在一些教程/例子中读到这个函数将在数据库中保存
<a href="http://foo.com">foo</a>
<a href='"http://foo.com'">foo</a>
在我的情况下(我有magic_quotes作为许多人建议),
$text = mysql_real_escape_string($_POST['text']);
$sql="INSERT INTO test (text) VALUES ('$text')";
它被保存为<a href="http://foo.com">foo</a>
在DB中,我通过phpMyAdmin看到。
我猜这是因为magic_quotes
,因为当我打开它们时,它被保存为<a href='"http://foo.com'">foo</a>
。
关闭magic_quotes
和我上面的例子,我对SQL注入安全吗?
转义的目的是使歧义语法变得清晰。
INSERT INTO test (text) VALUES ("<a href="http://foo.com">foo</a>")
这是模棱两可的/错误的,因为数据库无法判断"
中的"
是按字面意思理解的,还是表示您想要放入数据库的字符串的结束。注意这里SO上的语法高亮显示。mysql_real_escape_string
将其转义为:
INSERT INTO test (text) VALUES ("<a href='"http://foo.com'">foo</a>")
这现在是明确的,内部"
做不信号字符串的结束。
这是唯一的转义,它不会永久地在字符串中插入反斜杠。
请阅读《伟大的逃避现实》(或:你需要知道的在文本中使用文本)
mysql_real_escape_string将节省您从SQL注入字符串。它是addslashes()的替代方法。如果你看addslashes,你会发现这就是magic_quotes的作用。它只是在各种输入源上自动调用地址斜杠。mysql_real_escape_string更适合与mysql一起使用,因为它知道mysql的字符集正在使用,并且它转义特定于mysql SQL方言的附加字符。
对于其他数据类型,您仍然需要采取预防措施…例如,如果要传递一个要存储的整数,则应该将其强制转换为int或使用sprintf和相应的类型字符串。
如前所述,最好的预防方法是使用mysqli或pdo而不是mysql,并使用绑定变量。这种方法完全不受sql注入的影响。使用mysql_real_escape_string的目的是为您的查询转义字符,因此您在数据库中看到的内容是正确的(否则,当您使用SQL SELECT时,它会给您带反斜杠的字符串)。
所以你的查询看起来像:INSERT INTO test (text) VALUES ("<a href='"http://foo.com'">foo</a>")
,它插入到文本列作为<a href="http://foo.com">foo</a>
。
'
只是告诉mysql查询你正在使用"
字符而不是关闭字符串。当你有魔术引号上它有点像做mysql_real_escape_string
两次,使变量在您的查询<a href=''"http://foo.com''">foo</a>
。这就是为什么magic_quotes被弃用,应该关闭的原因。这是不安全的,使您容易受到攻击。
回答你的问题,用魔术引号关闭和使用mysql_real_escape_string
你是安全的SQL注入