【问题标题】:django Sessions are not maintaing in an iframedjango 会话不在 iframe 中维护
【发布时间】:2019-05-06 17:05:02
【问题描述】:

我正在使用 django 创建一个对话聊天机器人。为了保持聊天机器人中的聊天流程,我正在使用 django 会话。但是当我在 iframe 中使用聊天机器人的链接时,它不会存储任何会话并且流程会中断。我想要一个即使在 iframe 中也能帮助维护会话的功能。

对于 iframe

<html>
<head></head>
<body>
<embed style=" width: 384px; height: 525px; margin-right: 0px !important; bottom: 0px; float: right; position: absolute; bottom: 30px; width: 100%;" frameborder="0" scrolling="no" id="iframe" src="http://*********.com/********/*******.html">


</body>
</html>

维护会话的代码

@staticmethod
    def extract_data(request, input_data):
        from chat import validations
        if 'city' not in request.session:
            response_data = {'extra': {}, 'data': {}}
            response_data['extra']['statement'] = 'Select Car Model which you like to rent?'
            response_data['extra']['type'] = 'carmodel'
            response_data['data'] = Cars.city_check(request,response_data, input_data)

        elif 'veh_name' not in request.session:

            response_data = Cars.veh_name_check(request, input_data)

        elif 'days' not in request.session:
            response_data = validations.days_check(request, input_data)

        elif 'phone' not in request.session:
            response_data = validations.phone_check(request, input_data)

        elif 'email' not in request.session:

            response_data = validations.mail_check(request, input_data)

        elif 'name' not in request.session:
            response_data = validations.name_check(request, input_data, 'Car')

        return response_data

【问题讨论】:

  • 嗨,有人解决了这个问题吗?
  • 我认为这是因为对 3rd 方 cookie 的限制?
  • 您能否显示设置这些会话变量的代码。谢谢
  • 它与跨域cookie有关。启用浏览器的第三方 cookie 并再次尝试您的 Web 应用程序

标签: django iframe django-sessions


【解决方案1】:

这与 django 关系不大。浏览器目前偏执于让框架/嵌入访问 cookie,即使它们是 cookie 的来源。此外,许多用户会阻止第三方 cookie(通常包括框架 cookie)或所有 cookie。您可以在框架源中嵌入会话 id,如 this answer suggests,会话 id 由 django 模板或客户端 javascript 在包含框架的页面上生成(完全随机或来自 cookie) 可能有权访问 cookie。

您可能还想考虑完全放弃嵌入/框架以支持 django 包含块,它将聊天内容窗口作为 div 或类似内容插入到包含页面中,因此可以更好地访问 cookie 或其他会话变量.在这种情况下,我会将 javascript 与 html 分开,并将 js 脚本标记放在头部。

作为最后的尝试,您可以将对 cookie 的依赖替换为客户端的公共 ip 和用户代理的组合,也可能是包含页面的 URI(在模板的情况下)。

编辑关于安全性:(@EthanKeller 发表评论后)

浏览器试图保护框架免受主要内容的影响,反之亦然。这完全取决于是否包含任何敏感信息。如果是这样,那么我建议通过将框架放在它自己的窗口/选项卡中来分离它们,可能通过弹出调用。然而,在聊天机器人的情况下,我怀疑是否有任何敏感的东西。经销商的选择。

【讨论】:

  • Ooof - 所有这些选项都暴露了其他安全漏洞。我知道第 3 方 cookie 预防(请参阅我之前的评论。)感谢您的建议 - 我认为这里最好的答案是“不要这样做!”
  • @EthanKeller 我同意这是一个潜在的安全问题。框架之类的总是如此。见编辑替代。
【解决方案2】:

要允许来自 iframe 的 cookie,您必须使用 SameSite=NoneSecure 选项设置 cookie。

Set-Cookie: session=your_session; SameSite=None; Secure 

来源:https://medium.com/trabe/cookies-and-iframes-f7cca58b3b9e

要使用 Django 执行此操作,您必须更新以下设置:

SESSION_COOKIE_SAMESITE = 'None'  # As a string
SESSION_COOKIE_SECURE = True

不幸的是,SESSION_COOKIE_SAMESITE'None' 值仅从 Django 3.1 开始可用,并且有 no plan to backport it in 3.0 and 2.2

另请注意,您的网站必须通过 HTTPS 提供服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 2023-03-14
    • 2018-10-03
    • 2011-11-08
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多