mysql_real_escape_string 真的可以安全使用吗? [复制]

Posted

技术标签:

【中文标题】mysql_real_escape_string 真的可以安全使用吗? [复制]【英文标题】:Is mysql_real_escape_string is really safe to use? [duplicate] 【发布时间】:2011-09-16 00:33:11 【问题描述】:

好的,在我开始在我的学校项目中编写 mysql 之前,我有一个问题。 mysql_real_escape_string 真的可以安全使用吗?我听说使用它仍然不是很安全。那么是否有任何调整可以使 SQL 查询安全?我以前用过mysql_real_escape_string很多次,但不是我在为我的学校建一个网站,所以我首先要检查的是安全性。

【问题讨论】:

我想你真正想知道的是:“使用mysql_real_escape_string() 是我唯一需要担心的安全问题吗?”答:不,但这是一个好的开始。 这可能会有所帮助:importance of link identifier in mysql_real_escape_string() mysql_real_escape_string 已经很老套了,php 版本现在是 5.3 及以上:使用 PDO ! 我想知道为什么使用它不安全。 @tandu - 没有人说使用不安全,正如 hornetbzz 所说,只有更好的方法。 【参考方案1】:

更新:据我所知,以下答案在撰写本文时是正确的。事实是 mysql_real_escape_string 不安全,而且从来没有真正安全过。您应该始终使用准备好的语句。

由于 mysql_* 在 PHP 7 中已被完全删除,情况变得没有意义。出于历史目的,我在下面留下了我的原始答案。


mysql_real_escape_string 如果使用得当(即,在您将PHP 变量插入查询的任何地方),使用是安全的,但正如在cmets 中所指出的,这不是您唯一需要担心的事情。例如,可以将 html 标记插入您的数据库并用于跨站点脚本攻击。

您可能还想考虑将准备好的语句作为 mysql_real_escape_string 的替代方案,因为它们会自动为您转义输入,因此不会意外忘记转义参数。

【讨论】:

如果您必须坚持在 php 中使用旧的 mysql 遗留数据库库,请务必使用 mysql_real_escape_string() 而不是坏的旧 mysql_escape_string() @Ray 我知道你的评论已经过时了,但是如果你因为一些奇怪的原因需要在 PHP 中使用旧的遗留 MySQL 库,至少使用 MySQL 的原生 Prepared SQL Statement Syntax (MYSQL 5.5+) 来防止 SQL 注入 EXECUTE stmt1 USING @<variable>方法是安全的.. 但请记住使用CONCAT() 手册如何使用它可能再次容易发生 SQL 注入。

以上是关于mysql_real_escape_string 真的可以安全使用吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

mysql_real_escape_string() 坏了吗?

如何在 PDO 中使用/编写 mysql_real_escape_string? [复制]

sqli-labs less37 POST- Bypass MYSQL_real_escape_string (POST型绕过MYSQL_real_escape_string的注入)

使用准备好的语句时是不是需要 mysql_real_escape_string()?

什么是 mysql_real_escape_string() 而addslashes() 没有?

MySQL QUOTE() 与 mysql_real_escape_string()?