本文主要是介绍初窥CSRF攻击方式以及Flask-WTF,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
含义
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
解释
这幅图非常形象的解释了CSRF原理的具体过程。
从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:
- 登录受信任网站A,并在本地生成Cookie。
- 在不登出A的情况下,访问危险网站B。
看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:
-
你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
-
你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了…)
-
上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。
flask 中的CSRF保护
Flask-WTF 表单保护你免受 CSRF 威胁,你不需要有任何担心。尽管如此,如果你有不包含表单的视图,那么它们仍需要额外的保护。
例如,由 AJAX 发送的 POST 请求,并没有通过表单。在 0.9.0 之前版本,你无法获得 CSRF 令牌。这就是为什么我们编写了 CSRF 模块。
实现
要对所有视图函数启用 CSRF 保护,你需要启用 CsrfProtect 模块:
from flask_wtf.csrf import CsrfProtectCsrfProtect(app)
与任何其它的 Flask 扩展一样,你可以惰性加载它:
from flask_wtf.csrf import CsrfProtectcsrf = CsrfProtect()def create_app():app = Flask(__name__)csrf.init_app(app)
如果模板中有表单,你不需要做任何事。与之前一样:
<form method="post" action="/">{{ form.csrf_token }}
</form>
但如果模板中没有表单,你仍需要 CSRF 令牌:
<form method="post" action="/"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
</form>
无论何时未通过 CSRF 验证,都会返回 400 响应。你可以自定义这个错误响应:
@csrf.error_handler
def csrf_error(reason):return render_template('csrf_error.html', reason=reason), 400
我们强烈建议你对所有视图启用 CSRF 保护。但也提供了将某些视图函数除外的途径:
@csrf.exempt
@app.route('/foo', methods=('GET', 'POST'))
def my_handler():# ...return 'ok'
参考
https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
http://docs.jinkan.org/docs/flask-wtf/csrf.html
这篇关于初窥CSRF攻击方式以及Flask-WTF的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!