XSS
定义
跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许攻击者将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
攻击形式
非持久型攻击
有些网站的网页内容与url参数相关,攻击者找到漏洞地址后,修改其中的url,然后发给别人,诱使别人点击,从而通过执行脚本,获取对方的cookie。攻击者得到对方的cookie后,就可以为所欲为了。这种方式往往是一次性的。持久型攻击
有些内容生成网站,比如博客站,有非常多的用户输入页。用户敲了一篇博客,存到网站数据库,然后网站读出内容,呈现给其他用户。此时,如果不对用户输出的内容加以过滤,攻击者就可以注入一些js脚本内容。这样,别人点击这篇博客时,已经在执行攻击者所写的js脚本了。
危害
- 获取他人隐私信息;
- 破坏、修改网站原本页面内容;
- 跳转到其他恶意页面;
- 如果页面影响大,可以对其他网站发起DDoS攻击。
预防
过滤用户输入:
对于网站上有用户输入的部分,如各种表单内容、富文本内容,都应该对js脚本进行过滤,直接去除或者替换修改。对不可信输出转义、编码:
对用户输入的内容进行输出时,对其进行转义、编码,防止其中含有恶意脚本。安全Cookie:
将cookie设置HttpOnly后,js就无法获取到该网站的cookie。自然也没办法将其他用户的隐私信息传到自己的服务器。提高防范意识、多测试:
利用XSS测试工具对网站进行测试,找出漏洞并及时补救。
CSRF
定义
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
攻击形势
通过GET请求攻击:
对于一些资源操作请求,比如留言等,使用GET请求时,攻击者可以通过网站伪装成用户,向用户刚刚浏览过的网站服务器发送一条GET请求,修改其中的参数以使服务器按照攻击者的意图执行。通过XSS进行攻击:
攻击者通过XSS很容易获取到Cookie中的用户信息。通过这些信息,攻击者很容易伪装成用户对服务端进行恶意访问。
预防
规范请求类型:
避免使用GET发起资源操作请求;检查Referer / Origin:
检查请求来源是否为可信任网站;设置请求Token:
访问页面时,服务端会在页面写入一个随机token值,并设置token生命周期。之后我的请求就必须带上此次token值,请求过的token就会失效,无法再用。登录时的验证码就是在此原理基础之上实现的。防住第一道防线-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
Apache :
Add the following to your httpd.conf in your VirtualHost or in an .htaccess file:
Header set Content-Security-Policy “default-src ‘self’;”Nginx :
In your server {} block add:
add_header Content-Security-Policy “default-src ‘self’;”;
在服务端配置所有的页面都可以不需要改了,而且还支持上报。