PHP安全抵制他人

Dav*_*801 0 php mysql sql-injection mysql-real-escape-string

我有一个php文件,在开始时,从使用$ _GET发送的内容中分配一些变量.

然后它执行一些mysql查询,处理输出,然后回显一些文本和变量.

我在代码中设置的唯一保护是mysql_real_escape_string在GET上.

这足以防止攻击吗?

还有什么可以做的?

You*_*nse 5

好吧,你mysql_real_escape_string错了.
不过这不是你的错 - 这是PHP社会中最令人讨厌的妄想之一.即使是官方手册页也说错了.

此功能与保护任何内容和特别是GET变量无关

这个函数只是转义字符串分隔符,使字符串分隔符无法破坏字符串.因此,2个最重要的后果:

  • 不仅GET变量,而且用引号查询的所有变量都应该用mysql_real_escape_string(),无论其来源或来源或可能的危险性如何处理
  • 它只会对引用的字符串产生影响.将此函数用于查询的任何其他部分,例如LIMIT子句变量是完全没用的.

因此,为了保护您的SQL查询,您必须遵循整套规则,而不仅仅是欺骗"使用mysql_real_escape_string清理您的数据".

您可以从类似主题的早期答案中学习如何保护您的SQL:在PHP中将字符串提交到数据库时,我应该使用htmlspecialchars()处理非法字符还是使用正则表达式?

更新
场景以显示mysql_real_escape_string不是银弹的原因

使用网址
http://www.example.com/news.php?offset=99999+UNION+SELECT+password+FROM+users+--

一个代码

$offset = mysql_real_escape_string($_GET['offset']);
$sql    = "SELECT title FROM news LIMIT $offset,20";
Run Code Online (Sandbox Code Playgroud)

如果不是那么自负,就像没有那么华丽的小桌子一样,但在某种程度上同样具有灾难性.