如何防止 XSS 攻击

136 阅读3分钟

JavaScript 是现代web应用程序的一个重要组成部分,这也导致跨站点脚本(XSS)成为一个常见的安全漏洞,使XSS攻击如果成功的话影响很大。

JavaScript 代码不再局限于通过少数脚本提供一些额外的客户端功能,现在可以在整个应用程序堆栈中运行,包括服务器端Node.js。除此之外,任何有自重的网站在运行时都会加载大量的外部依赖项,面对的是一个由相互关联的脚本组成的错综复杂的网络,其中一些脚本可能是易受攻击的,甚至是恶意的。

跨站点脚本是web应用程序安全中一个复杂而混乱的领域,这使得几乎不可能100%的阻止每一次攻击。(顺便说一句,虽然JavaScript是迄今为止最流行的攻击工具,但XSS也可以与其他脚本类型一起使用,甚至包括CSS中的XSS。)幸运的是,通过在开发和部署中遵循一些安全实践,可以防止大多数XSS漏洞和由此产生的攻击。

跨站点脚本漏洞的复杂世界

从本质上讲,XSS 是一种类似于 SQL 注入的注入攻击,只不过注入的是 JavaScript 代码而不是 SQL 指令。但与 SQL 注入不同的是,在SQL注入中扰乱的是SQL查询,而跨站点脚本则有许多不同类型,这取决于恶意代码的传递和执行方式。但从广义上讲,XSS 攻击主要有三种类型:

反射型 XSS 攻击:经典的 XSS 漏洞是从 HTTP 请求中获取原始输入参数值并直接在输出中使用它,从而反射来自输入的任何恶意代码,并在受害者的浏览器中执行它。虽然这是最常见的XSS类型,但它的效果仅限于单个用户和浏览器。

存储的 XSS 攻击:为了将 JavaScript 注入多个浏览器,恶意攻击者可以尝试将 XSS 有效负载插入到将由许多用户访问的后端资源中。如果有效负载按原样存储,并且 Web 服务器在加载时未对其进行清理,则数据库或序列化文件中的单个条目在加载该条目时可能会导致数千个浏览器出现 XSS。

基于DOM的XSS攻击:许多web应用程序不是一次预加载所有页面代码,而是在应用程序执行时重写其内部文档对象模型(DOM),而无需重新加载页面。如果攻击者设法将恶意JavaScript代码注入DOM并使其执行,那么该代码将只存在于用户的浏览器中,从而使这些攻击在服务器端不可见(并且无法阻止)。

XSS 攻击防御清单

遵循以下最佳实践可以防止绝大多数跨站点脚本攻击:

设置 HTTP 安全标头:定义正确的内容安全策略 (CSP) HTTP 响应标头,在第一时间阻止加载恶意脚本。

将所有输入视为不可信:始终清理用户输入(包括API输入和输出),执行输入验证,并使用与上下文相关的输出编码。

使用安全的编码实践:避免使用内联脚本,并正确使用应用程序框架提供的任何抗 XSS 功能,例如自动编码函数。

定期进行漏洞检测:使用漏洞扫描器定期重新扫描网站和应用程序,以便及时发现漏洞,同时使用静态代码检测工具在开发时检测XSS漏洞,并及时进行修复。

参读链接:

www.invicti.com/blog/web-se…