Flask-Admin SecureForm和CSRF保护如何工作

时间:2018-04-12 19:41:24

标签: python flask csrf flask-wtforms flask-admin

我目前正在使用Flask-Admin编写一个简单的博客应用程序来执行管理任务。我想启用CSRF保护,并按照文档中Advanced Functionality页面上的说明进行操作。

但是,这似乎并不能阻止我的虚拟CSRF攻击成功,并且不清楚Flask-Admin如何遵循WTForms文档中概述的CSRF protection实现。

关于我的虚拟CSRF攻击,我的方法遵循OWASP CSRF article中建议的POST请求示例:

<body onload="document.forms[0].submit()">
<form action="http://localhost:5000/admin/blogpost/new?url=%2Fadmin%2Fblogpost%2F" method="POST">
    <input type="hidden" name="title" value="Evil title"/>
    <input type="hidden" name="content" value="Evil content"/>
    <input type="submit" value="Save"/>
</form>

其中,操作地址是从Flask-Admin的create.html模板中提取的新帖子创建页面。

当我从separate origin(localhost:3000)加载恶意表单并在文档加载时提交它时,我发现尽管表单配置了上面链接的Flask-Admin SecureForm设置,但请求仍然存在。

我尝试过咨询Flask-Admin源代码,但在相关模板中找不到WTForms csrf_token,尽管SecureForm包含了预期的CSRF设置。

Flask-Admin是否与CSRF保护的WTForms实施文件有所不同?如果是这样,怎么样?

更实际地说,除了在基于ModelView的类中使用Flask-Admin的SecureForm之外,是否还有其他配置可用于启用CSRF保护?

另请注意,this answer中描述的技术在我尝试使用跨站点(再次来自localhost:3000)的公开管理URL来执行需要身份验证的操作时也适用于我。

这导致我要求跟进:是否可以在非形式的Flask-Admin页面上实现CSRF,即用于GET请求,以保护用于注销或帐户删除操作等操作的公开管理URL?< / p>

0 个答案:

没有答案