跨站请求伪造也被称为one-click attack 或者 session riding,通常缩写为CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。目前主流的防御方法就是通过Token验证,另外如果前端对存在CSRF防御的服务进行请求,会出现”400 bad request“。在写程序时有时候会让忽略CSRF问题的人莫名其妙,我就是错了好几次(我以为是我的数据格式的问题),看到了浏览器Console才恍然大悟。
1. CSRF攻击原理
当我们登录访问一个网站,登录后需要访问不同页面,服务器为了记住我们已经登录的身份,会把我们的状态临时储存在session中,并且将session_id发送给客户端存储于cookie中,由于网站是通过检查cookie中是否存在合法且匹配的session_id,来使用户保持登入状态。
这样就会出现一个问题,当用户在登录的状态下,被诱导访问了黑客的网站,黑客的网站设置一个骗你点击的页面,比如抽红包,用户点了抽奖按钮,抽奖按钮其实是指向一个交易接口的链接,这就可以伪造客户的身份,在客户不知情的情况下做一些事请。
2. 防御CSRF原理
比如服务器接受到访问存在某个表单的请求,服务器在回传这个表单之后会根据某种规则生成一个字符串一同传送给客户端,当用户操作完准提交表单,这个字符串会被一起提交给服务器,服务器验证这个字符串是否合法再做出反应。这个字符串就是Token。
3. Ajax使用Token完成CSRF防御验证
方法一
首先在你的获得数据的HTML页面创建一个 meta 标签用于接受Flask或者Django传过来的Token。
<meta name="csrf-token" content="{
{ csrf_token() }}