换句话说,目前最常用的技术是什么,用于清理输入和/或输出? 工业界(甚至个人使用)网站上的人们使用什么来解决这个问题?
换句话说,目前最常用的技术是什么,用于清理输入和/或输出? 工业界(甚至个人使用)网站上的人们使用什么来解决这个问题?
您应该参考优秀的OWASP网站,了解攻击(包括XSS)及其防御的概述。这是我能想到的最简单的解释,可能比他们的网页更易读(但可能远不如完整)。
指定字符集。首先,确保您的网页在头部或者在head
元素的最开始处指定了UTF-8字符集。HTML编码所有输入以防止UTF-7攻击在Internet Explorer中(以及旧版本的Firefox)尽管有其他预防XSS的措施。
HTML转义。请记住,您需要对所有用户输入进行HTML转义。这包括将<
替换为<
,将>
替换为>
,将&
替换为&
,将"
替换为"
。如果您将来要使用单引号的HTML属性,您还需要将'
替换为'
。典型的服务器端脚本语言如PHP提供了函数来执行此操作,我鼓励您通过创建标准函数来插入HTML元素而不是以adhoc方式插入它们。
其他类型的转义。但是,您仍然需要小心,永远不要将用户输入作为未引用的属性或解释为JavaScript的属性(例如onload
或onmouseover
)插入。显然,这也适用于script
元素,除非输入被正确地JavaScript转义,这与HTML转义不同。另一种特殊类型的转义是URL参数的URL转义(在HTML转义之前执行它以正确地将参数包含在链接中)。
验证URL和CSS值。对于链接和图像的URL(不基于已批准前缀进行验证),情况也是如此,因为存在javascript:
URL方案,还有CSS样式表URL和style
属性内的数据。 (Internet Explorer允许将JavaScript表达式作为CSS值插入,而Firefox在其XBL支持方面也存在问题。)如果您必须从不受信任的来源包含CSS值,则应该安全严格地验证或CSS转义它。
不允许用户提供的HTML。如果可以选择,请不要允许用户提供的HTML。这是导致XSS问题的简单方法,对自己的标记语言编写基于简单正则表达式替换的“解析器”也是如此。只有在HTML输出通过真正的解析器以明显安全的方式生成并使用标准转义函数转义输入中的任何文本并单独构建HTML元素时,我才会允许格式化的文本。如果您无法选择,使用验证器/净化器AntiSamy。
防止基于DOM的XSS。不要将用户输入包含在JavaScript生成的HTML代码中并将其插入文档中。相反,请使用正确的DOM方法确保它被处理为文本而不是HTML。
您的代码中只有两个主要区域需要妥善处理,以避免xss问题。
在查询中使用任何用户输入值之前,使用数据库辅助函数(如mysql_escape_string)对数据进行转义处理,然后再将其用于查询。这将保证防止xss攻击。
在将用户输入值显示回表单输入字段之前,请通过htmlspecialchars或htmlentities将它们通过。这将将所有易受xss攻击的值转换为浏览器可以显示的字符,而不会被破坏。
完成上述操作后,您将更加安全,可防范95%以上的xss攻击。然后,您可以继续从安全网站学习高级技术,并在您的站点上应用额外的安全措施。
大多数框架所做的是鼓励您不要直接编写HTML表单代码或字符串形式的查询,以使使用框架助手函数时,您的代码保持清洁,同时任何严重问题都可以通过在框架中更新一两行代码来快速解决。您可以简单地编写自己的常用函数库,并在所有项目中重复使用。