如何在php中阻止sql注入但仍显示“和'?我正在使用的那一刻
$input = strip_tags($input);
$input = htmlentities($input);
然而输出是\“和\'。无论如何,我可以显示”和'没有斜线,但保留它们,所以我不注射?
答案 0 :(得分:5)
您显示的方法不是防止SQL注入的正确方法!
始终使用您正在使用的数据库库提供的卫生方法,例如mysql_real_escape_string()
如果你使用标准的mysql库。卫生方法不会改变最终结果中的任何字符。
或者,在PDO或mysqli中使用预准备语句 - 如果正确绑定传入数据,那些会自动输入卫生。
答案 1 :(得分:1)
利用准备好的陈述
http://de2.php.net/manual/en/pdostatement.bindparam.php
OR
http://de2.php.net/manual/en/mysqli-stmt.bind-param.php
答案 2 :(得分:1)
首先,该代码不会剥离反斜杠,当然它们仍然存在。使用stripslashes()来取出反斜杠,但不要这样做。 如果你在数据库中看到那些斜杠,并且你已经使用了mysql_real_escape_string,那么你可能已经启用了magic_quotes_gpc,而你只是添加了另一组slahses。首先删除那些自动添加,然后应用mysql_real_escape_string,它们不会以这种方式显示,但仍然存在,并且可以安全地用于查询数据库。
答案 3 :(得分:0)
粗心大意没有神奇的解决方案。
此外,这些斜线不会阻止SQL注入。它们的存在表明另一个问题,magic_quotes。魔术引号是PHP2中的一个便利功能,从未打算作为安全功能。 (在数据库不支持多字节字符集的情况下,它们在1997年左右是安全的。)
无论如何,禁用magic_quotes。使用手动转义(mysql_real_escape_string)或更好用PDO更方便的预备语句。
如果你想要懒惰,请禁用magic_quotes。但是使用$_GET = array_map("mysql_real_escape_string", $_GET);
并在脚本开头和建立数据库连接后对$ _POST和$ _REQUEST执行相同的操作。
然后应用htmlentities(stripslashes($input))
来编写输出以消除无关的反斜杠。