我想知道如何防止HTML注入。我创建了一个网站,允许用户在HTML表单中粘贴文章。我使用过mysql_real_escape_sting
,但我想知道这是否足以阻止HTML注入。我尝试了htmlspecialchars
,但是mysql_real_escape_string
显示错误。
答案 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_tags和htmlentities。