web的脚本安全-CSRF
CSRF,即Cross-site request forgery,中文一般叫跨站请求伪造。
攻击原理是,用户在A网站(登录,之后打开一个B网站,B网站的脚本(或HTML标签)向A网站发送一个请求,这个请求会自动携带用户的COOKIE,如果这时A网站验证成功,则完成了攻击。
那么,具体的攻击过程是什么?
1)用户登录A网站。
A网站提供一个修改用户名的api,例如http://A.com/modName?newname=test1。这个api会验证cookie,验证通过之后则修改用户名。
2)之后用户登录B网站,B网站的里有一段代码如下(可以成功把用户在A网站的名字修改为test2,因为发往A.com的请求都会自动带上A.com的cookie):
<img src="http://A.com/modName?newname=test1" />
很简单吧,但这就完成了一次跨站请求伪造的攻击。我们可以看出攻击要点在:
1)A网站的服务器对cookie的简单直接验证。
2)用户登录网站A之后能引导TA打开B网站。
攻击简单,解决方案也很简单:
1,保证A网站的所有api接口都不只是通过验证cookie就完成用户确认。
2,前端与后端配合,使用同一个算法,在发送请求前,居于cookie再产生一个编码(也可以叫token)发送到服务器端,服务器端对这个token进行验证。
为什么能解决问题?因为网站B虽然能伪造请求(即修改参数),但网站B获取不了A网站的cookie,这样网站B就伪造不出这个token,A网站获取不到这个token则无法完成用户确认。
PS:当然,服务器端还可以通过检测refer这个属性来防范CSRF,但这个可能会把部分用户正常请求当成非法请求,例如https转到http。