CSRF全称是Cross Site Request Forgery,翻译过来是跨站请求伪造的意思,它攻击的是客户端,利用用户合法身份访问精心编制的一串url去触发一段具有某功能的脚本或CGI程序,攻击者盗用了客户的身份,并以他的名义发送恶意请求,包括:以假冒身份发送邮件,发消息,盗取用户账号,购买商品,虚拟货币转账,造成个人隐私泄露以及财产安全。特别是随着WEB2.0的普及人们越来越意识到它的攻击威力。如下是一段攻击流程:

.访问了www.example.org
2.此页面用标签隐含了一段url,但访问时被触发访问请求
3.这段url以Get方式提交了一段具有某功能执行的请求,比如:银行转账、网上购物等
通过上图我们清晰地了解CSRF的攻击方式是利用合法用户的身份来执行恶意动作,当然利用Get方式更容易实施,但POST方式也难逃厄运,比如下一段:
合法链接?
如果把链接改成图片,并且动作设定为onmouseover就更危险了。
目前在WEB服务端抑制CSRF攻击有几种方式:
1.增加一个HASH后的cookie;
2.一次性令牌;
3.加入验证码机制,缺点是这种机制给正常用户的客户体验受损。
以上方式第3种是非常好的的,比如每次请求重要功能的页面时(转账、删除等动作)会嵌入一个生成验证码图片的脚本,随机生成值(数字、ASIIC字符、中文等)让用户填写后发送到服务器并保存在session空间。但很多网站的程序员在编写时疏忽了完成每一次会话后去及时清空这个值,那么用户只要成功登陆过一次并填写了验证码之后,以后的会话就无需重新验证了,所以还是容易被利用攻击。
接着,我们来看看WAF的实现方式,相对于用特征集的静态防护,用动态防护CSRF的攻击更具职能性和灵活性,基本思路是通过WAF随机产生的隐含表单来打断一个不变的会话,也就是说即使攻击者获取到了用户身份,但是随机变化的验证码让攻击者无法构造一个不变的报文。
如下图所示,在配置WAF防护的规则之前需要设置referee的规则,然后配置域名和要防护的页面路径即可生效。

在应用了WAF的csrf防护规则之后我们可以通过抓包观察(见下图),在POST报文时发现会多了一个随机生成的隐含表单值,这个值会发送到 WAF中进行匹配计算,如果不想符合则认为是攻击者构造的报文。由于这个值每次会话都变化,且长度都不同,很难被攻击者猜测到利用,具有相当高的安全性。

结束
从以上介绍,我们了解WAF对于繁杂多样的攻击能条理地归类出共性,并在WEB系统前端直接分析和过滤,由于篇幅限制,不能一一列举WAF所有防护功能的实现原理,其他的包括比如防御CC、SYN_flood等类型的拒绝服务攻击、网页挂马、防止页面篡改、WEB访问加速等,不再详述。