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)

 

posted @ 2018-05-30 23:36  十七楼的羊  阅读(168)  评论(0编辑  收藏  举报