【问题标题】:Blocking referer on specific routes in Flask在 Flask 中阻止特定路由上的引用
【发布时间】:2014-10-24 22:36:30
【问题描述】:

是否可以在 Flask 中阻止来自站点本身外部的引用者的特定路由(例如 /data)?

【问题讨论】:

    标签: routes flask http-referer


    【解决方案1】:

    request.referrer 包含请求的引用者,因此您可以在此基础上应用一些逻辑。

    from flask import Flask, request, redirect, url_for, render_template_string
    
    app = Flask(__name__)
    
    @app.route('/')
    def home():
        return render_template_string('''
            <a href="{{ url_for('data') }}">Correctly Referred</a>
        ''')
    
    @app.route('/data')
    def data():
        print request.referrer
        if request.referrer != 'http://127.0.0.1:5000/':
            return abort(403) # Forbidden
            # or maybe: return redirect(url_for('home'))
        return 'Woo!'
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    我敢肯定,操作系统和设备中的不同浏览器会对引荐来源做出一些奇怪的事情,因此值得了解一下它们的特性。也许在他们访问您的主页/入口路径时设置一个会话值会更好,然后使用before_request 检查会话值是否设置,几乎就像自动登录一样。

    所以如果你想保护你的所有页面,除了你的home 路由——你可以这样:

    @app.before_request
    def check_session():
        print request.endpoint
        if not session.get("legit") and request.endpoint is not 'home':
            return redirect(url_for('home'))
    

    然后在您的回家路线上,只需添加session["legit"] = True。现在,每当用户访问该站点时,如果他们是新用户,或者会话仍处于活动状态,他们将被重定向回主页,他们将能够看到所有内容。有点像酒店/咖啡厅的无线热点。

    【讨论】:

    • 谢谢!由于我使用多种设备进行调试,因此我使用了您通过入口路径传递的自动登录用户建议的方法。我还没有使用before_request(目前仍在使用 JSON 数据而不是真正的数据库),所以我看不出它如何改善这种情况。但是,我可以在要阻止的路线上使用装饰器,但我不确定这就是您使用 before_request 的意思
    • 添加了before_request 的示例以保护除home 之外的所有内容
    猜你喜欢
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2014-10-27
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多