前端安全

XSS

定义

跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许攻击者将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。

攻击形式

  1. 非持久型攻击
    有些网站的网页内容与url参数相关,攻击者找到漏洞地址后,修改其中的url,然后发给别人,诱使别人点击,从而通过执行脚本,获取对方的cookie。攻击者得到对方的cookie后,就可以为所欲为了。这种方式往往是一次性的。

  2. 持久型攻击
    有些内容生成网站,比如博客站,有非常多的用户输入页。用户敲了一篇博客,存到网站数据库,然后网站读出内容,呈现给其他用户。此时,如果不对用户输出的内容加以过滤,攻击者就可以注入一些js脚本内容。这样,别人点击这篇博客时,已经在执行攻击者所写的js脚本了。

危害

  1. 获取他人隐私信息;
  2. 破坏、修改网站原本页面内容;
  3. 跳转到其他恶意页面;
  4. 如果页面影响大,可以对其他网站发起DDoS攻击。

预防

  1. 过滤用户输入:
    对于网站上有用户输入的部分,如各种表单内容、富文本内容,都应该对js脚本进行过滤,直接去除或者替换修改。

  2. 对不可信输出转义、编码:
    对用户输入的内容进行输出时,对其进行转义、编码,防止其中含有恶意脚本。

  3. 安全Cookie:
    将cookie设置HttpOnly后,js就无法获取到该网站的cookie。自然也没办法将其他用户的隐私信息传到自己的服务器。

  4. 提高防范意识、多测试:
    利用XSS测试工具对网站进行测试,找出漏洞并及时补救。

CSRF

定义

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

攻击形势

  1. 通过GET请求攻击:
    对于一些资源操作请求,比如留言等,使用GET请求时,攻击者可以通过网站伪装成用户,向用户刚刚浏览过的网站服务器发送一条GET请求,修改其中的参数以使服务器按照攻击者的意图执行。

  2. 通过XSS进行攻击:
    攻击者通过XSS很容易获取到Cookie中的用户信息。通过这些信息,攻击者很容易伪装成用户对服务端进行恶意访问。

预防

  1. 规范请求类型:
    避免使用GET发起资源操作请求;

  2. 检查Referer / Origin:
    检查请求来源是否为可信任网站;

  3. 设置请求Token:
    访问页面时,服务端会在页面写入一个随机token值,并设置token生命周期。之后我的请求就必须带上此次token值,请求过的token就会失效,无法再用。登录时的验证码就是在此原理基础之上实现的。

  4. 防住第一道防线-XSS
    防止Cookie通过XSS被恶意窃取,防止攻击者伪装成用户进行正常访问。

CSP

定义

CSP指的是内容安全策略。为了缓解很大一部分潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略(CSP)的一般概念。这将引入一些相当严格的策略,会使扩展程序在默认情况下更加安全,开发者可以创建并强制应用一些规则,管理网站允许加载的内容。CSP实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。

使用

在浏览网页的过程中,尤其是移动端的网页,经常看到有很多无关的广告,其实大部分广告都是所在的网络劫持了网站响应的内容,并在其中植入了广告代码。为了防止这种情况发生,我们可以使用CSP来快速的阻止这种广告植入。而且可以比较好的防御dom xss。

使用meta标签

直接在页面添加meta标签:

1
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:"/>

CSP内容匹配的规则:规则名称 规则 规则;规则名称 规则 …

规则 说明 案例
‘self’ 当前域名下 -
*.xx.com 支持多级域名, 可以不填写http协议 *.huangyufeng.com
default-src 所有资源的默认策略,如果声明了其他资源策略,默认策略将被覆盖 default-src 'self'
script-src JS等脚本的加载策略 script-src *.huangyufeng.com
style-src 样式表加载策略 style-src *.huangyufeng.com
‘unsafe-inline’ 允许执行内联的JS代码,默认为不允许,如果有内联的代码必须加上这条 script-src: 'unsafe-inline'
‘unsafe-eval’ 允许执行eval script-src: 'unsafe-eval'
xxxx: 自定义协议 script-src httx:
upgrade-insecure-requests https协议下自动把http请求转为https -

这种方式最简单,但是也有些缺陷,每个页面都需要添加,而且不能对限制的域名进行上报。

在服务端配置csp

  1. Apache :
    Add the following to your httpd.conf in your VirtualHost or in an .htaccess file:
    Header set Content-Security-Policy “default-src ‘self’;”

  2. Nginx :
    In your server {} block add:
    add_header Content-Security-Policy “default-src ‘self’;”;

在服务端配置所有的页面都可以不需要改了,而且还支持上报。

参考

《常见网络攻击–XSS && CSRF》
《CSP内容安全策略》