mysql_real_escape_string是否足以阻止HTML注入?

时间:2011-07-30 13:12:58

标签: php mysql html

我想知道如何防止HTML注入。我创建了一个网站,允许用户在HTML表单中粘贴文章。我使用过mysql_real_escape_sting,但我想知道这是否足以阻止HTML注入。我尝试了htmlspecialchars,但是mysql_real_escape_string显示错误。

5 个答案:

答案 0 :(得分:3)

您应该使用prepared statements来绝对确保阻止 sql 注入。

取自文档(以粗体阅读部分)

  

许多更成熟的数据库支持预准备语句的概念。这些是什么?它们可以被认为是应用程序想要运行的SQL的一种编译模板,可以使用变量参数进行自定义。准备好的陈述有两个主要好处:

     
      
  • 查询只需要解析(或准备)一次,但也可以   使用相同或不同的参数执行多次。什么时候   准备好查询,数据库将进行分析,编译和   优化它执行查询的计划。对于复杂的查询   进程可能会占用足够的时间,明显会减慢速度   应用程序,如果需要多次重复相同的查询   具有不同的参数。通过使用准备好的声明   应用程序避免重复分析/编译/优化循环。这个   意味着预准备语句使用更少的资源,从而运行   更快。
  •   
  • 不需要引用准备语句的参数;该   驱动程序自动处理此如果应用程序专门使用   准备好的语句,开发人员可以肯定没有SQL注入   将发生(但是,如果正在构建查询的其他部分   使用未转义的输入,仍然可以进行SQL注入。)
  •   
     

准备好的语句非常有用,它们是PDO为不支持它们的驱动程序模拟的唯一功能。这确保了应用程序将能够使用相同的数据访问范例,而不管数据库的功能如何。

如果您打算阻止 XSS (跨站点脚本),只要您想向浏览器输出来自用户输入或任何非安全的内容,就应该使用函数htmlspecialchars()资源。 始终将任何未知来源视为不安全

 echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');

答案 1 :(得分:3)

不,mysql_real_escape_sting仅准备将数据安全地插入到MySQL字符串声明中,以防止在该特定上下文中进行SQL注入。它不会阻止其他注入,如HTML注入或跨站点脚本(XSS)。

HTML注入和XSS都发生在不同的上下文中,其中存在需要处理的不同上下文特殊字符。在HTML中,特别是<>&"'分隔不同的HTML上下文。考虑到XSS,您还需要了解不同的JavaScript上下文及其特殊字符。

htmlspecialchars应足以处理前一次攻击,而json_encode可用于安全的JavaScript子集。有关此主题的详细信息,另请参阅XSS (Cross Site Scripting) Prevention Cheat Sheet以及my answer to Are these two functions overkill for sanitization?及相关问题。

答案 2 :(得分:1)

没有。事实上,我相信对于高级程序员,你不应该使用mysql_real_escape_string()作为拐杖 对于您需要在数据库查询中使用的每个值,请认真考虑可能出现的字符。如果是一个美元金额,您应该接受的唯一字符是数字,句点和可能的前一个美元符号。如果它是一个名字,你应该只允许字母,连字符和可能的句号(对于像Joseph A. Bank这样的全名)。
一旦确定了值可接受的严格字符范围,请编写一个Regex以匹配该值。对于任何不匹配的值,显示虚假错误并将值记录在文本文件中(读取:不是数据库)以及用户的IP。经常检查此文件,以便您可以查看用户尝试过的值是否无法正常进行黑客攻击。这不仅会发现您需要调整正则表达式的有效输入,还会显示试图在您的网站上查找SQL漏洞的黑客IP。 此方法可确保阻止mysql_real_escape_string()可能无法立即解决的新旧SQL漏洞。

答案 3 :(得分:0)

不,不是。请参阅docs

它没有逃脱&lt;或&gt;。

答案 4 :(得分:0)

简单回答:否

mysql_real_escape_string只能帮助你摆脱 SQL注入不是XSS 和html注入。要避免这些,您需要更复杂的输入验证。首先查看strip_tagshtmlentities