CSRF保护和验证

什么是CSRF?
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack“或者Session Riding,通常缩写为CSRF或XSRF,是一种对网站的恶意攻击。是一种依赖web浏览器的、被混淆过的代理人攻击。
常见特性

  • 依靠用户标识危害网站
  • 利用网站对用户表识的信任
  • 欺骗用户的浏览器发送HTTP请求给目标站点
  • 可以通过IMG标签会触发一个GET请求,可以利用它来实现CSRF攻击。

攻击
CSRF通过第三方伪造表单数据,post到应用服务器上。受害服务器以为这些数据来自于自己的网站,于是大意中招。
1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时登录用户网站A成功,可以正常发送请求到网站A;
3.用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4.网站B接收到用户请求后,返回一些攻击性的代码,并发送一个请求要求访问第三方A;
5.浏览器在接收到这些攻击代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发送请求。网站A并不知道该请求其实是B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
这里写图片描述
防御
WTForms在渲染每个表单时生成一个独一无二的token,这个token将在POST请求中随表单数据一起传递,并且会在表单被接受之前进行验证。关键在于token的值取决于储存在用户会话cookeis中的一个值,而且会在一定时间之后过时(默认30分钟)。这样只有登录了页面的人才能提交一个有效的表单,而且仅仅是在登录页面30分钟之内才能这么做。
如何使用CSRF防护?

  • 视图函数中form.validate_on_submit( ),如果已经submits了,这个函数返回True并且用定义在forms.py中的验证函数来验证表单。如果一个表单已经提交并且通过验证,我们可以开始处理登录逻辑的部分了。如果它还没提交,需要传递这个表单对象给模板来进行渲染。
  • 模板中使用CSRF防护
{{ form.csrf_token }}

将渲染一个隐藏的包括防御CSRF的特殊token域,而WTForms会在验证表单时查找这个域,所以我们不用担心添加的任何特殊的验证token正确性的逻辑。
密钥验证
需要应用程序去配置一个加密密钥。Flask-WTF使用这个密钥去生成加密令牌用于验证请求表单的数据的真实性。

app=Flask(__name__)
app.config['SECRET_KEY']='westos'
  • app. config字典通常是框架、扩展或应用程序自身存放配置变量的地方,可以使用标准字典语法添加配置值到app.config中。配置对象提供方法从文件或环境导入配置值。
  • SECRET_KEY配置变量作为Flask和一些第三方扩展的通用加密密钥。加密强度取决于这个变量的值。给你构建的每个应用程序选择不同的密钥,并确保这个字符串不被其他任何人知道。

猜你喜欢

转载自blog.csdn.net/mashaokang1314/article/details/81270843