同事在做数据抓取的时候,发现该提交的参数都提交了,但是返回的数据总是提醒“非法的请求或者超时”;我拿过来检查了半天也没见查出问题,无奈对比了下这个页面和另外一个页面的http头信息,端倪出来了,这页面http头信息多了个X-CSRF-Token的参数。这是什么东东,没见过,于是个谷歌科普了以下。
应对CSRF防御
简介
简单来说:CSRF全称:Cross-site request forgery,中文翻译为跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用
那么很多网站为了应对这种请求,会采取防御措施,一般采取的措施是采取token校验,比如返回给页面A的时候会生成一个token值,然后你在A界面请求界面B的时候,如果同时提交token值并且值正确的话,就当作是正常的请求进行处理。否则则认为当前请求不正常,返回错误页面。
应对方式
其实针对上述防御措施,想办法拿到token一同提交就好了,以公示系统为例子:
-
比如我用httpclient先获取A页面,A页面内容如下(部分有删减)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="_csrf_parameter" content="_csrf" /><meta name="_csrf_header" content="X-CSRF-TOKEN" /><meta name="_csrf" content="c385ce66-e97e-48aa-83eb-1f76a0942971" /> <link href="/skin/css/public3.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="/skin/js/jquery-1.9.1.min.js"></script> <script type="text/javascript" src="/skin/js/gs/utils.js" ></script> <script type="text/javascript" src="/skin/js/gs/gsgs.js" ></script> <script type="text/javascript" src="/skin/js/gs/gsjyyc.js" ></script> ....省略
-
从A页面获取csrf token值:c385ce66-e97e-48aa-83eb-1f76a0942971,请求B地址的时候加入在请求头信息header中加入token值即可,代码如下:
httppost.addHeader( “X-CSRF-Token”,”c385ce66-e97e-48aa-83eb-1f76a0942971”);
异步请求处理
针对异步请求处理,需要在http头信息做简单处理即可:
httppost.addHeader("X-Requested-With", "XMLHttpRequest");