flask 跨域请求伪造阻止与SQLAlchemy高级查询
源码上是这么说的:
对于每个修改服务器上内容的请求,你应该使用一次性令牌,并存储在 cookie里,并且在发送表单数据的同时附上它。在服务器再次接收数据之后,你要比较两个令牌,并确保它们相等
1, 后端生成,csrf_token,跨域请求针对的是所有的请求!
from flask_wtf.csrf import generate_csrf # 调用函数生成 csrf_token csrf_token = generate_csrf() # 请求钩子,每次请求都会设置 csrf_token值 @app.after_request def after_request(responses): # 生成 csrf_token值 存储到 cookie 之中 csrf_token = generate_csrf() # wtf 扩展会自动将 csrf_token 存在 redis 之中 responses.set_cookie('csrf_token', csrf_token) return responses app.add_template_filter(do_index_class, 'db')
2,前端请求后端视图,后端将生成的 csrf_token 设置到 cookie 之中
前端会取出浏览器的的csrf_token 值,并且以 ajax的形式发送到后端!
$.ajax({ url: "/passport/register", type: "post", data: JSON.stringify(params), contentType: "application/json", headers: { "X-CSRFToken": getCookie("csrf_token") }, success: function (resp) { if (resp.errno == "0") { // 刷新当前界面 location.reload() } else { $("#register-password-err").html(resp.errmsg) $("#register-password-err").show() } } })
3,后端会进行csrf_token 对比,对比通过说明是当前网站访问
CSRFProtect(app)
二,SQLAlchemy 高级查询
# 先排序,再限制条数 News.query.order_by(News.clicks.desc()).limit(10) filter = [1,2,3] # 先过滤器,再排序(时间),最后分页paginate(当前页码,一页多少条,是否抛出异常) News.query.filter(*filter).order_by(News.create_time.desc()).paginate(page, per_page, False)