《XSS CSRF》

228 阅读4分钟

一. XSS攻击

Cross Site Scripting 跨站脚本攻击

1. 原理

攻击者向一个网页注入恶意代码(JS代码等等),当其他用户浏览该网页时,由于这段代码没有经过过滤,就会直接在用户的网页上执行。就有可能窃取用户的cookie

攻击者对客户端网页注入的恶意脚本一般包括 JavaScript,有时也会包含 HTML 和 Flash。 如 <script>alert(document.cookie)</script>

2. 防御

1. 对用户的输入,服务器的输出进行过滤,转义

只允许输入合法的值,其他值都过滤掉。

function escape(str) {
	str = str.replace(/&/g, "&amp;");
	str = str.replace(/</g, "&lt;");
	str = str.replace(/>/g, "&gt;");
	str = str.replace(/"/g, "&quto;");
	str = str.replace(/'/g, "&#39;");
	str = str.replace(/`/g, "&#96;");
    str = str.replace(/\//g, "&#x2F;");
    return str
}

那么当用户输入<script>alert(1)</script> 时,通过对这段字符串转义,就变成了&lt;script&gt;alert(1)&lt;&#x2F;script&gt; 这样一段文本。这样浏览器会以文本的形式展示,而不是执行它。

2. HttpOnly防止劫取 Cookie

浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie

3. 浏览器的Content-Security-Policy 内容安全策略

HTTP 响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源。

Content-Security-Policy: default-src https:

策略指令,它允许的值

参考文章: 浅说 XSS 和 CSRF

二. CSRF攻击

Cross Site Request Fogery 跨站请求伪造

1. 原理

攻击者经常会利用目标网站的漏洞,比如后台一些有规律的接口,构造一个请求地址。当用户登录了目标网站后,诱导用户去点击或者直接以<img> 标签的形式,在用户加载页面时自动请求这个地址,以这种方式冒充用户身份,在用户不知情的情况下,伪造用户的请求,对服务器发起请求。然后在用户已经登录状态下,服务器会误以为这是用户的合法操作。

比如攻击者在对目标网站的信息进行过滤后发现,一个删除用户id的接口。只需要在用户登录的状态下,向一个地址如http://xxx.com/delete?id=1 发起请求,服务器就会把id=1的用户删掉。然后攻击者就诱导用户点击这个链接,或者直接在页面嵌入一个img,src请求这个地址。那么用户就会在不知情的情况下,向服务器发了一个请求,导致删除了一个用户信息。

2. 防御方法

1. Referer

在HTTP头中有一个字段叫Referer,用于记录该HTTP请求的来源地址。

服务器判断每一个请求的referer,看看是不是来自自己的网站。如果攻击者构造了一个请求,让用户点击像银行网站发起请求,那攻击者只能在自己的网站构造请求,所以用户发出去的请求的来源地址也是攻击者的网站。正常情况下用户应该是登录银行自己的网站发起请求的(转账等),所以后台可以通过判断referer值,判断这个请求是不是来自其他网站,如果是,就有可能是CSRF攻击,那就拒绝请求。

2. token

CSRF攻击之所以能成功,就是在于攻击者可以伪造用户的请求,他并不是直接获取用户信息,而是在不知道这些用户验证信息的情况下,直接利用用户自己的cookie,冒充用户。所以防御CSRF的关键就是,用户浏览器可以保存一个不在cookie里的数据,而且攻击者无法伪造。

在表单里添加一段隐藏的唯一的token值(请求令牌)

服务器收到请求时,生成一个随机数,在渲染页面时,把随机数埋入页面,一般是form表单(<input type="hidden" name="_csrf_token" value="xxxx">)。

然后也把这个随机数设置setCookie,放到cookie里。

然后当用户发送请求时,如果是正常请求,这个表单的里数据就会一并被提交到服务器。而如果这个请求是攻击者伪造的,攻击者是无法拿到表单里的这个token值的,所以就没有token提交到服务器。服务器就可以通过验证这个"_csrf_token" 是否有以及是否正确,判断这个请求是不是CSRF攻击。

参考文章:

「每日一题」CSRF 是什么?