Web 安全之 xss和csrf攻击

xss 和 csrf 可以说是最常见的攻击手段,面试也很大概率会问到这两个东西,下面我们可以了解一下他们是什么。

xss

xss 也叫跨站脚本攻击。是一种非常常见的攻击手段,我们可以把它看做是一个html注入攻击。和我们长听到的sql注入非常的类似。

常见的 xss 攻击方式。

通过 url 注入

比方说A网站有个内容是通过url中的参数来显示的,并且没有对其做任何的xss防范,那么攻击者就可以通过url将攻击脚本注入到网页中,然后将带有攻击脚本的url进行特殊处理,然后将处理后的url发给第三者完成攻击

通过一些表单输入做注入

最常见得就是富文本评论,因为需要保持html的原样,所以就很容易被人注入攻击脚本,当其他用户访问了被注入攻击脚本的页面的时候就会被攻击。

防御方式

对xss的防御思路,主要有两种,可以看我们具体的需求来决定使用哪一种。

http-only

这个东西主要针对的是cookie,在 xss 注入的时候可能会有js盗取cookie,我们可以将 cookie 设置为http-only,这样 js 就会无法操作cookie,不过这也仅仅防范了这一种可能性,还是无法防御其他手段的 xss 攻击

设置黑名单

通过设置黑名单,将一些特殊的字段进行删除或者转译来达到防御的手段,比方说 <script>,黑名单的实现比较简单,但是 xss 攻击的花样非常的多,我们很难知道所有的攻击手段,很有可能会造成攻击漏洞。

设置白名单

白名单的思路也很简单,我们根据我们的需求设置允许使用的标签和属性,然后把不在白名单中的标签或者属性都去掉,在实现上会比黑名单复杂一点,需要把进行防御的内容转为树状结构进行遍历然后处理掉白名单以为的标签和属性。

CSP (Content Security Policy)

内容安全策略,用于指定哪些内容可以被执行。通过设置 Content-Security-Policy 响应头我们可以设置哪些内容是可以执行的。

csp 本质上也是一个白名单,我们通过配置告诉浏览器哪些内容是可以安全执行的。

具体的配置我们可以去 MDN 上查看 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy__by_cnvoid/default-src

相关知识可以看看阮老师的这篇文章 http://www.ruanyifeng.com/blog/2016/09/csp.html

CSRF

csrf 也叫跨站请求伪造。攻击方式就是第三方的网站可以在用户不知情的情况下发送请求到被攻击的网站上。比方说网站A,我们有一个网站B会偷偷帮用户发请求到A,发送的时候浏览器会自动的挟带上A的cookie,而A又是对cookie做验证,这就导致了 csrf 攻击

防御方式

sameSite 可以禁止来自第三方网站的请求携带 cookie,他有两个值

  • Strict 禁止一切请求携带 cookie
  • Lax 允许一部分请求携带 cookie,比方说链接

不过目前这还是一个试验箱的属性,只有部分浏览器支持这个值。

增加验证

验证的方式有很多,可以有如下几种

  • 验证码,不过验证码可能会带来比较不好的用户体验
  • token,在表单或者请求头中增加一个token做验证
  • referer验证,referer需要在后端进行,这个单词其实拼写错误的,原本应该是referrer,我们可以通过referer来判断请求是否来源于当前网站,如果不是则判定为非法请求