【问题标题】:How to get permission for cookies from user in Flask如何在 Flask 中获得用户对 cookie 的许可
【发布时间】:2018-08-20 12:00:34
【问题描述】:

我有一个使用 Flask 和 Flask-Login 构建的网站,所以我知道它有时会生成 cookie。但我的问题比这更基本。

Flask 应用程序是否总是立即生成 cookie?

如果没有,是否有任何工具可以让我确定我的应用程序的哪个部分在什么时候生成了 cookie,例如,是否可以在运行网站时监控 Chrome 开发工具?

这个问题的上下文是 GDPR 合规性,特别是在开始时尝试请求许可(没有最初创建 cookie!),然后当用户单击接受时,有一个过程意味着用户(匿名或其他)不会再次看到权限请求横幅(直到本地浏览器缓存清除)

【问题讨论】:

    标签: cookies flask flask-login


    【解决方案1】:

    为了它的价值,我这样做了:

    1. 在任何页面 base.html 上强制设置横幅:
        {% if cookies_check() %}
                {# then user has already consented so no requirement for consent banner #}
        {% else %}
                {# show a cookie consent banner #}
                <div id="cookie-consent-container">
                    <button id="cookie-consent">I Consent</button>
                </div>
                <script>
                    var fn = function () {
                        document.cookie = "cookie_consent=true";
                        document.getElementById('cookie-consent-container').hidden = true;
                    };
                    document.getElementById('cookie-consent').onclick = fn;
                </script>
        {% endif %}
    
    1. 将函数注入jijna2以检查cookie:

      @app.context_processor 定义注入模板范围(): 注射 = dict()

       def cookies_check():
           value = request.cookies.get('cookie_consent')
           return value == 'true'
       injections.update(cookies_check=cookies_check)
      
       return injections
      

    我还使用开发控制台通过探索 document.cookies 来检测现有的 cookie。最初生成的唯一 cookie 似乎是 Google Analytics。

    【讨论】:

    • 谢谢你,它有效。但是,看起来 @app.app_context_processor 应该只是 @app.context_processor
    • 如果环境处于生产状态,此实现是否可以防止 CSRF 和 XSS 攻击?我还通过 Flask-Talisman 使用 CSP 来增强安全性。只是听说最好不要通过JS设置cookie,不惜一切代价限制。
    【解决方案2】:

    格式化答案出错了(至少,正如它在 Firefox 和 chrome 中显示的那样) - 文本

    var fn = function () { 
        document.cookie = "cookie_consent=true"; 
        document.getElementById('cookie-consent-container').hidden = true; 
    }; 
    document.getElementById('cookie-consent').onclick = fn; 
    

    应该放在脚本标签内。

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      相关资源
      最近更新 更多