zoukankan      html  css  js  c++  java
  • flask总结05(在 Flask 项目中解决 CSRF 攻击)

    一:安装 flask_wtf

    pip install flask_wtf

    二:设置应用程序的 secret_key,用于加密生成的 csrf_token 的值

    # session加密的时候已经配置过了.如果没有在配置项中设置,则如下:
    app.secret_key = "#此处可以写随机字符串#"

    三:导入 flask_wtf.csrf 中的 CSRFProtect 类,进行初始化,并在初始化的时候关联 app

    from flask.ext.wtf import CSRFProtect
    CSRFProtect(app)

    四:在表单中使用 CSRF 令牌:

    <form method="post" action="/">
        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
    </form>

    五:scrf的过程理解

    代码显示方法不被允许的代码

    #manage.py

      
    from flask import Flask, render_template, request, g
    from settings.dev import DevConfig
    from flask.ext.wtf import CSRFProtect
    
    app = Flask(__name__, template_folder="templates", static_folder="static")
    app.config.from_object(DevConfig)
    
    CSRFProtect(app)
    
    # @app.route("/csrf_test", methods=["get", "post"])
    @app.route("/csrf_test")
    def index():
        if request.method == "GET":
            return render_template("form.html")
    
        else:
            print(request.form)
    
            return "ok"
    
    if __name__ == "__main__":
        app.run()
    View Code

    templates下的form.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>csrf案例</title>
    </head>
    <body>
        <form action="" method="post">
            账号:<input type="text" name="username"><br><br>
            密码:<input type="password" name="password"><br><br>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    View Code

    运行后显示的结果是:

    然后修改manage.py中的代码,添加

    @app.route("/csrf_test", methods=["get", "post"])

    代码如下:

    from flask import Flask, render_template, request, g
    from settings.dev import DevConfig
    from flask.ext.wtf import CSRFProtect
    
    app = Flask(__name__, template_folder="templates", static_folder="static")
    app.config.from_object(DevConfig)
    
    CSRFProtect(app)
    
    @app.route("/csrf_test", methods=["get", "post"])
    def index():
        if request.method == "GET":
            return render_template("form.html")
    
        else:
            print(request.form)
    
            return "ok"
    
    if __name__ == "__main__":
        app.run()
    View Code

    再次执行:并且提交:

    说明需要在html文档中添加:csrf_token

    <input type="hidden" name="csrf_token" value="{{csrf_token()}}">

    修改后的代码是:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>csrf案例</title>
    </head>
    <body>
        <form action="" method="post">
            <input type="hidden" name="csrf_token" value="{{csrf_token()}}">
            账号:<input type="text" name="username"><br><br>
            密码:<input type="password" name="password"><br><br>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    View Code

    运行后的结果显示:

  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/one-tom/p/10673684.html
Copyright © 2011-2022 走看看