0%

XSS 和 CSRF 详解及区别解析

XSS

cross site script,跨站脚本攻击(关键字:脚本)。为了与 css 冲突取名为 xss!
XSS 攻击的核心原理是:不需要你做任何的登录认证,它会通过合法的操作(比如在 url 中输入、在评论框中输入),向你的页面注入脚本(可能是 js、hmtl 代码块等)。
恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。

最后导致的结果可能是

  • 盗用 Cookie
  • 破坏页面的正常结构,插入广告等恶意内容
  • D-doss 攻击

XSS 的攻击方式

1、反射型(临时,非持久型)
发出请求时,XSS 代码出现在 url 中,作为输入提交到服务器端,服务器端解析后响应,XSS 代码随响应内容一起传回给浏览器,最后浏览器解析执行 XSS 代码。这个过程像一次反射,所以叫反射型 XSS。
客户端提交,服务器解析后响应,到客户端再执行

2、存储型(持久型)
存储型 XSS 和反射型 XSS 的差别在于,提交的代码会存储在服务器端(数据库、内存、文件系统等)。
比如先通过对一个攻击 url 进行编码(来绕过 xss filter),然后提交该 web server(存储在 web server 中), 然后用户在浏览页面时,如果点击该 url,就会触发一个 XSS 攻击。当然用户点击该 url 时,也可能会触发一个 CSRF(Cross site request forgery)攻击。

以上两种服务端参与

3、DOM based XSS
基于 DOM 的 XSS,也就是 web server 不参与,仅仅涉及到浏览器的 XSS。比如根据用户的输入来动态构造一个 DOM 节点,如果没有对用户的输入进行过滤,那么也就导致 XSS 攻击的产生。过滤可以考虑采用 esapi4js。

预防
简而言之:转义+过滤(输入过滤,输出转义

1、在 cookie 中设置了 HttpOnly 属性,那么通过 js 脚本将无法读取到 cookie 信息,这样能有效的防止 XSS 攻击

过滤

移除用户输入的和事件相关的属性。如 onerror 可以自动触发攻击,还有 onclick 等。(总而言是,过滤掉一些不安全的内容)

移除用户输入的 Style 节点、Script 节点、Iframe 节点。(尤其是 Script 节点,它可是支持跨域的呀,一定要移除)。

CSRF

用户登录 A 网站产生 cookie,此时再访问 B(危险),B 要求访问 A,并发起一个请求

此时,B(危险)就利用用户的权限在 A 进行了操作。

image

如何预防:
1、Token 验证:(用的最多)

(1)服务器发送给客户端一个 token;

(2)客户端提交的表单中带着这个 token。

(3)如果这个 token 不合法,那么服务器拒绝这个请求。

2、隐藏令牌:
把 token 隐藏在 http 的 head 头中。

响应头

image

请求头

image

ps:方法二和方法一有点像,本质上没有太大区别,只是使用方式上有区别。

CSRF 和 XSS 的区别

面试官还可能喜欢问二者的区别。

区别一:

CSRF:需要用户先登录网站 A,获取 cookie。
XSS:不需要登录。
区别二:(原理的区别)

CSRF:是利用网站 A 本身的漏洞,去请求网站 A 的 api。
XSS:是向网站 A 注入 JS 代码,然后执行 JS 里的代码,篡改网站 A 的内容。