我如何防止SQL注入,但保持“和'?

时间:2011-02-06 15:34:00

标签: php sql security sql-injection html-entities

如何在php中阻止sql注入但仍显示“和'?我正在使用的那一刻

$input = strip_tags($input);
$input = htmlentities($input);

然而输出是\“和\'。无论如何,我可以显示”和'没有斜线,但保留它们,所以我不注射?

4 个答案:

答案 0 :(得分:5)

您显示的方法不是防止SQL注入的正确方法!

始终使用您正在使用的数据库库提供的卫生方法,例如mysql_real_escape_string()如果你使用标准的mysql库。卫生方法不会改变最终结果中的任何字符。

或者,在PDO或mysqli中使用预准备语句 - 如果正确绑定传入数据,那些会自动输入卫生。

答案 1 :(得分:1)

答案 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))来编写输出以消除无关的反斜杠。