一:CSRF介绍
CSRF(Cross-site request forgery) 简称跨站请求攻击,攻击者盗用了你的身份,以你的名义发送恶意请求,通过脚本或第三方工具带着你的身份数据 请求你的api地址造成资金或数据泄露危险
二:防范方法
目前主要有两种常用方法防治增加token/referer验证 beego内置了csrf防范机制,当然你也可以后台自己创建一个token令牌进行验证,在这里我们主要介绍beego内置的防范方法
1:你需要在应用配置文件中加上 enablexsrf
也可以在入口文件引入一个模块添加上也行
enablexsrf = true 开启验证
xsrfkey = 61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o 令牌key
xsrfexpire = 3600 有效时间
2:开启防御后 所有POST PUT DELET 请求中没有 _xsrf值都会被拒绝,这样如果破坏者通过其他方式请求就会被防御,如果想通过需要在模板中设置xsfr值具体设置需要通过
XSRFFormHTML() 函数来配合使用
func (c *IndexController) Index(){
c.Data["xsrfdata"]=template.HTML(this.XSRFFormHTML())
}
在表单中使用
<form action="/new_message" method="post">
{{ .xsrfdata }}
<input type="text" name="message"/>
<input type="submit" value="Post"/>
</form>
在js中也可以单独获取到xsrf值进行提交也会通过
<input type="hidden" id="xsrf" value="{{.xsrf_token}}" />
var xsrftoken = $('#xsrf').val(');
$.post(url,{id,id,name:name,_xsrf:xsrftoken},function(data){} )
3:屏蔽xsrf请求防御
有时候会遇到有些请求不需要进行xsrf验证 可以单独屏蔽某个controller 不进行验证
type AdminController struct{
beego.Controller
}
func (a *AdminController) Prepare() {
a.EnableXSRF = false //关闭验证
}