CSP
CSP(Content-Security-Policy)指的是内容安全策略,它的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截由浏览器自己来实现。
通常有两种方式来开启 CSP,一种是设置 HTTP 首部中的 Content-Security-Policy,一种是设置 meta 标签的方式
CSP 也是解决 XSS 攻击的一个强力手段
CSP 的主要目标是减少和报告 XSS 攻击 ,XSS 攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方。
CSP 通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除 XSS 攻击所依赖的载体。一个 CSP 兼容的浏览器将会仅执行从白名单域获取到的脚本文件,忽略所有的其他脚本 (包括内联脚本和 HTML 的事件处理属性)。
作为一种终极防护形式,始终不允许执行脚本的站点可以选择全面禁止脚本执行。
使用CSP
除限制可以加载内容的域,服务器还可指明哪种协议允许使用;比如 (从理想化的安全角度来说),服务器可指定所有内容必须通过 HTTPS 加载。
配置内容安全策略涉及到添加 Content-Security-Policy HTTP 头部到一个页面,并配置相应的值,以控制用户代理(浏览器等)可以为该页面获取哪些资源。
你可以使用 Content-Security-Policy HTTP 头部 来指定你的策略,像这样:
Content-Security-Policy: policy
policy 参数是一个包含了各种描述你的 CSP 策略指令的字符串。
CSRF
CSRF,全名 Cross Site Request Forgery,跨站请求伪造。很容易将它与 XSS 混淆,对于 CSRF,其两个关键点是跨站点的请求与请求的伪造,由于目标站无 token 或 referer 防御,导致用户的敏感操作的每一个参数都可以被攻击者获知,攻击者即可以伪造一个完全一样的请求以用户的身份达到恶意目的。
类型:
按请求类型,可分为 GET 型和 POST 型。
按攻击方式,可分为 HTML CSRF、JSON HiJacking、Flash CSRF 等。
HTML CSRF
利用 HTML 元素发出 CSRF 请求,这是最常见的 CSRF 攻击。
HTML 中能设置 src/href 等链接地址的标签都可以发起一个 GET 请求
还有 CSS 样式中的:
@import “”
background:url(“”)
…
也可使用表单来对 POST 型的请求进行伪造。
Flash CSRF
Flash 也有各种方式可以发起网络请求,包括 POST。
import flash.net.URLRequest;
import flash.system.Security;
var url = new URLRequest(“http://target/page”);
var param = new URLVariables();
param = “test=123”;
url.method = “POST”;
url.data = param;
sendToURL(url);
stop();
Flash 中还可以使用 getURL、loadVars 等方式发起请求。
req = new LoadVars();
req.addRequestHeader(“foo”, “bar”);
req.send(“http://target/page?v1=123&v2=222”, “_blank”, “GET”);
CSRF 的防御
- 验证码
- Referer Check
- Token
Token
CSRF 能够攻击成功的本质原因是重要操作的所有参数都可以被攻击者猜测得到。
保持原参数不变,新增一个参数 Token,值是随机的,在实际应用中,Token 可以放在用户的 Session 中,或浏览器的 Cookies 中。
Token 一定要足够随机。此外,Token 的目的不是为了防止重复提交,所以为了使用方便,可以允许在一个用户的有效生命周期内,在 Token 消耗掉之前都使用同一个 Token,但如果用户已经提交了表单,则这个 Token 已经消耗掉,应该重新生成 Token。
Token 还应注意其保密性,如果 Token 出现在 URL 中,则可能会通过 Referer 泄露,应尽量把 Token 放在表单中,把敏感操作由 GET 改为 POST,以表单或 AJAX 的形式提交,避免 Token 泄露。