mysql_real_escape_string()中没有“销毁”哪些SQL注入方法;?

时间:2011-07-12 15:18:08

标签: mysql sql sql-injection mysql-real-escape-string

是否有一个SQL注入方法列表,仅使用带有utf8编码的mysql_real_escape_string();无法保护?

对于整数,我正在使用intval(); 它足够安全吗?

对于那些认为我想要“教程”来攻击任何人的人:不,我不会。我只是想知道如何使我的应用程序更安全,我想知道他们是否有99%的安全保护黑客

3 个答案:

答案 0 :(得分:3)

如果给定有效的数据库连接,mysql_real_escape_string()在所有情况下都应该是安全的字符串数据this answer中描述的罕见例外)。

然而,字符串之外的任何东西,它都不会逃脱:

$id = mysql_real_escape_string($_GET["id"]);

mysql_query("SELECT * FROM table WHERE id = $id");

仍然容易受到攻击,因为您不必“突破”字符串来添加邪恶的附加命令。

答案 1 :(得分:1)

sql注入方法不多。他们总是由于输入没有被消毒和正确逃脱。因此,虽然mysql_real_escape_string()将使任何字符串安全地包含在数据库查询中,但您应遵循以下规避技术来保护您的数据和用户免受SQL注入。

  • 永远不要以超级用户或数据库所有者身份连接到数据库。始终使用权限非常有限的自定义用户。
  • 检查给定输入是否具有预期的数据类型。
  • 如果应用程序等待数字输入,请考虑使用is_numeric()验证数据,或使用settype()静默更改其类型
  • 引用使用特定于数据库的字符串转义函数传递给数据库的每个非数字用户提供的值。因此mysql_real_escape_string()将使所有字符串都安全地包含在对mysql数据库的SQL查询中
  • 您还可以学习使用存储过程和准备好的语句,这些语句往往非常安全但具有其他影响

另请参阅:SQL注入的PHP page

答案 2 :(得分:0)

有许多内容可能无法通过标准方法(例如字符串转义,int转换)受到保护,这也取决于您使用的软件版本。例如,utf-8本身就是一个问题,作为一个很小的例子(在众多中)你应该确保请求是有效的utf-8(或将其转换为utf-8)。请参阅example

作为网站的不死行为,我认为MySQL注入保护不能被压缩成单个SO答案,因此我将这些链接作为一般起点。

http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/

还有:Search for mysql injection utf8