前端安全 XSS 攻击
XSS 是什么?
XSS
的全名是 Cross Site Script
(跨站脚本)的缩写。这里存在一个问题,为什么缩写是 XSS
而不是 CSS
?因为如果叫 CSS
就和层叠样式表 CSS
重音了。所以缩写为 XSS
。
XSS
攻击指的是跨站脚本攻击,是一种代码注入攻击。攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息,如 cookie
等。
XSS
的本质是因为网站没有对恶意代码进行过滤,与正常的代码混合在一起了,浏览器没有办法分辨哪些脚本是可信的,从而导致了恶意代码的执行。
XSS 攻击的类型
DOM 型 XSS 攻击
DOM
型指的是攻击者构建了特殊的 URL
,用户打开网站后,js
脚本从 URL
中获取数据,从而导致了恶意代码的执行。
反射型 XSS 攻击
反射型指的是攻击者构造了特殊的 URL
,当服务器接收到请求后,从 URL
中获取数据,拼接到 HTML
后返回,从而导致了恶意代码的执行。
存储型 XSS 攻击
存储型指的是恶意代码提交到了网站的数据库中,当用户请求数据的时候,服务器将其拼接为 HTML
后返回给了用户,从而导致了恶意代码的执行。
如何防范 XSS 攻击?
对于第一个方面,如果我们对存入数据库的数据都进行转义的处理,但是一个数据可能在多个地方使用,有的地方可能不需要转义,由于我们没有办法判断数据最后的使用场景,所以直接在输入端进行恶意代码的处理,其实是不太可靠的。
因此我们可以从浏览器的执行来进行预防,一种是使用纯前端的方式,不用服务器端拼接后返回。另一种是对需要插入到 HTML
中的代码做好充分的转义。对于 DOM
型的攻击,主要是前端脚本的不可靠而造成的,我们对于数据获取渲染和字符串拼接的时候应该对可能出现的恶意代码情况进行判断。
还有一些方式,比如使用 CSP
,CSP
的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行,从而防止恶意代码的注入攻击。
还可以对一些敏感信息进行保护,比如 cookie
使用 http-only
,使得脚本无法获取。也可以使用验证码,避免脚本伪装成用户执行一些操作。