XSS或跨站点脚本攻击是一个Web应用程序漏洞,它使攻击者可以将易受攻击的JavaScript内容注入网站。攻击者通过在没有或没有很好地对用户控制的内容进行消毒的网站上进行注入来利用此漏洞。通过注入易受攻击的内容,用户可以执行(但不限于),
- Cookie窃取。
- 污损网站。
- 绕过CSRF保护等,
Web应用程序可以通过多种方式保护自己免受跨站点脚本问题的侵害。其中一些包括,
- 黑名单过滤。
- 白名单过滤。
- 上下文编码。
- 输入验证。
- 内容安全政策。
1.黑名单过滤
实施一种仅部分保护网站免受XSS问题影响的过滤技术很容易。它基于有限XSS向量的已知列表工作。例如,大多数XSS向量使用事件侦听器属性,例如onerror , onmouseover和onkeypress等。使用此事实,可以解析给定HTML属性的用户以及这些事件侦听器属性。这将减轻有限的XSS向量集,例如。
对于像 XSS 这样的向量,可以从用户指定的HTML中删除javascript :, data :, vbscript:方案。
好处:
- 这些过滤器很容易在Web应用程序中实现。
- 这些过滤器过滤的安全用户内容的误报率几乎为零
缺点:
但是,由于XSS向量不是有限的,因此不能轻易维护,因此可以轻松地绕过此过滤。这是此过滤器的一些有效旁路的列表。此筛选不能完全保护网站。
2.白名单过滤
白名单过滤与基于黑名单的过滤相反。白名单过滤没有列出不安全的属性并使用此列表清除用户HTML,而是列出了一组设置的HTML标签和属性。已知可以确保安全的实体将得到维护,其他所有内容都将被过滤掉。
这最大程度地降低了XSS的可能性,并且仅当过滤器本身中存在将某些不安全实体视为安全的漏洞时,才开放XSS。可以在客户端和服务器端进行此过滤。白名单过滤是现代Web应用程序中最常用的过滤器。
好处:
- 在很大程度上减少了XSS的可能性。
- 一些白名单过滤器(例如Antisamy过滤器)会使用安全规则重写用户内容。这些导致使用严格的HTML语言标准重写HTML内容。
缺点:
多数情况下,这是通过接受不安全或未经消毒的HTML进行工作,对其进行解析并构造安全的HTML并返回给用户的。这是性能密集型的。这些过滤器的大量使用可能会对您的现代Web应用程序产生隐藏的性能影响。
3.上下文编码
另一种常见的缓解技术是将所有用户给定的数据视为文本数据,而不是HTML内容,即使它是HTML内容也是如此。可以对用户数据执行HTML实体编码。编码
test h1>可能会转换为< test>测试< /> pre>然后,浏览器将正确解析此内容并将 test h1>呈现为文本,而不是将其呈现为h1 HTML标签。
优点:
如果做得正确,上下文编码将完全消除XSS风险。
缺点:
它将所有用户数据视为不安全。因此,不管用户数据是安全还是不安全,所有HTML内容都将被编码并将呈现为纯文本。
4.输入验证
在输入验证技术中,正则表达式适用于每个请求参数数据,即用户生成的内容。仅当内容通过安全的正则表达式时,才允许使用。否则,请求将在服务器端失败,并带有400个响应代码。
好处:
输入验证不仅可以减少XSS,而且可以保护由于信任用户内容而可能产生的几乎所有漏洞。
缺点:
- 通过进行数字正则表达式验证,可以减轻电话号码字段中的XSS,但对于名称字段,则可能不可行,因为名称可以使用多种语言,并且可以使用希腊语或拉丁字母的非ASCII字符。
- 正则表达式测试是性能密集型的。对服务器的所有请求中的所有参数必须与正则表达式匹配。
5.内容安全政策
现代浏览器允许使用CSP或内容安全策略标头。使用这些标头,可以指定只能从中加载JavaScript内容的域列表。如果用户尝试添加易受攻击的JavaScript,则CSP标头将阻止该请求。
好处:
CSP是XSS保护机制的最先进形式。它消除了不受信任的来源,可以以任何形式将数据输入网站。
缺点:
要定义CSP标头,网站不得使用内联JavaScript代码。 JS应该被外部化并在脚本标签中引用。这些加载静态内容的域集必须在CSP标头中列入白名单。
编码与滤波–
缓解XSS的一个常见问题是确定是否对用户数据进行编码或过滤(清理)。如果必须将用户驱动的内容呈现为HTML,但如果不执行javascript,则该内容必须通过过滤器。如果不需要将用户数据呈现为HTML,并且如果文本呈现就足够了,则建议对用户数据中的字符进行HTML编码。
推荐的XSS缓解技术–
黑名单过滤器已经被多次利用,并且由于HTML内容的不断增长,使用黑名单过滤器始终是不安全的。尽管适当的输入验证和CSP标头可以在很大程度上减轻XSS的影响,但始终建议根据用例根据白名单策略对实体进行编码或过滤。输入验证和CSP标头可以添加为额外的保护层。
参考– https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP
test h1>呈现为文本,而不是将其呈现为h1 HTML标签。
优点:
如果做得正确,上下文编码将完全消除XSS风险。
缺点:
它将所有用户数据视为不安全。因此,不管用户数据是安全还是不安全,所有HTML内容都将被编码并将呈现为纯文本。
4.输入验证
在输入验证技术中,正则表达式适用于每个请求参数数据,即用户生成的内容。仅当内容通过安全的正则表达式时,才允许使用。否则,请求将在服务器端失败,并带有400个响应代码。
好处:
输入验证不仅可以减少XSS,而且可以保护由于信任用户内容而可能产生的几乎所有漏洞。
缺点:
- 通过进行数字正则表达式验证,可以减轻电话号码字段中的XSS,但对于名称字段,则可能不可行,因为名称可以使用多种语言,并且可以使用希腊语或拉丁字母的非ASCII字符。
- 正则表达式测试是性能密集型的。对服务器的所有请求中的所有参数必须与正则表达式匹配。
5.内容安全政策
现代浏览器允许使用CSP或内容安全策略标头。使用这些标头,可以指定只能从中加载JavaScript内容的域列表。如果用户尝试添加易受攻击的JavaScript,则CSP标头将阻止该请求。
好处:
CSP是XSS保护机制的最先进形式。它消除了不受信任的来源,可以以任何形式将数据输入网站。
缺点:
要定义CSP标头,网站不得使用内联JavaScript代码。 JS应该被外部化并在脚本标签中引用。这些加载静态内容的域集必须在CSP标头中列入白名单。
编码与滤波–
缓解XSS的一个常见问题是确定是否对用户数据进行编码或过滤(清理)。如果必须将用户驱动的内容呈现为HTML,但如果不执行javascript,则该内容必须通过过滤器。如果不需要将用户数据呈现为HTML,并且如果文本呈现就足够了,则建议对用户数据中的字符进行HTML编码。
推荐的XSS缓解技术–
黑名单过滤器已经被多次利用,并且由于HTML内容的不断增长,使用黑名单过滤器始终是不安全的。尽管适当的输入验证和CSP标头可以在很大程度上减轻XSS的影响,但始终建议根据用例根据白名单策略对实体进行编码或过滤。输入验证和CSP标头可以添加为额外的保护层。
参考– https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP