我想知道如何防止HTML注入。我已经创建了一个网站,允许用户将文章粘贴到HTML表单中。我使用过mysql_real_escape_sting,但我想知道这是否足以防止HTML注入。我尝试了htmlspecialchars,但在mysql_real_escape_string上显示错误。
发布于 2011-07-30 21:16:10
您应该绝对确保使用prepared statements来防止sql注入。
摘自文档(请阅读粗体部分)
许多比较成熟的数据库都支持预准备语句的概念。他们是什么?它们可以被认为是应用程序想要运行的SQL的一种编译模板,可以使用变量参数进行自定义。准备好的语句提供了两个主要好处:
准备好的语句非常有用,以至于它们是PDO为不支持它们的驱动程序模拟的唯一特性。这确保了无论数据库的功能如何,应用程序都能够使用相同的数据访问范例。
如果您想要阻止XSS (跨站点脚本),那么当您想要向浏览器输出来自用户输入或来自任何不安全来源的内容时,都应该使用函数htmlspecialchars()。始终将任何未知源视为不安全的
echo htmlspecialchars($string, ENT_QUOTES, 'UTF-8');发布于 2011-07-30 21:32:18
不,mysql_real_escape_sting只准备安全地插入到MySQL字符串声明中的数据,以防止在该特定上下文中的SQL注入。它不会阻止其他注入,如HTML注入或跨站点脚本(XSS)。
HTML注入和XSS都发生在不同的上下文中,其中有不同的上下文特殊字符需要处理。在超文本标记语言中,尤其是<、>、&、"和'分隔不同的超文本标记语言上下文。考虑到JavaScript,您还需要了解不同的XSS上下文及其特殊字符。
htmlspecialchars应足以应对前一种攻击,而json_encode可用于JavaScript的安全子集。有关此主题的详细信息,另请参阅XSS (Cross Site Scripting) Prevention Cheat Sheet以及my answer to 和相关问题。
发布于 2011-07-30 21:48:30
不是的。事实上,我认为对于高级程序员来说,您不应该使用mysql_real_escape_string()作为拐杖。
对于数据库查询中需要使用的每个值,请认真考虑可能出现的字符。如果是美元金额,则应接受的字符只有数字、句点和前面可能的美元符号。如果它是一个名字,你应该只允许字母,一个连字符,可能还有一个句号(对于像Joseph A. Bank这样的全名)。
一旦确定了一个值可以接受的严格字符范围,就可以编写一个正则表达式来匹配该值。对于任何不匹配的值,显示一个假错误,并将该值连同用户的IP一起记录在一个文本文件中(读取:而不是db)。经常检查此文件,以便您可以查看用户尝试的值是否为黑客尝试。这不仅会发现您需要调整Regex的有效输入,而且还会揭示试图在您的站点上发现SQL漏洞的黑客的IP地址。这种方法确保了mysql_real_escape_string()可能无法立即解决的新旧SQL漏洞将被阻止。
https://stackoverflow.com/questions/6883310
复制相似问题