【问题标题】:Tracking unauthenticated users in Django在 Django 中跟踪未经身份验证的用户
【发布时间】:2017-05-21 09:51:12
【问题描述】:

我需要在我的 Django 网站中跟踪未注册用户。这是出于转化优化目的(例如注册漏斗等)。

到目前为止,我使用的一种方法是使用 IP 地址作为 user_id 的代理。由于各种众所周知的原因,这导致了捏造/不可靠的结果。

我可以通过在服务器端设置会话变量来充分解决我的问题吗?一个说明性的例子会很棒。


例如,目前我脑子里有几种方法。一种是做request.session["temp_id"] = random.randint(1,1000000),然后基于temp_id进行跟踪。

另一个是在每次未经授权的用户点击我的网络应用程序的登录页面时设置一个会话变量,如下所示:

if not request.session.exists(request.session.session_key):
    request.session.create()

从这里开始,我将通过request.session.session_key 简单地跟踪他们。这会是一个合理的策略吗?我需要注意哪些主要的极端情况(如果有)?

【问题讨论】:

    标签: django session


    【解决方案1】:

    Cookie 是最简单的方法,但考虑到某些用户可以在其浏览器中关闭 Cookie。

    因此,对于那些用户,您可以使用 javascript 本地存储来设置一些数据。关闭浏览器后,此信息将被删除,但可以用于汇集目的。还有一些人可以关闭 javascript。

    另一种方法是在生成模板时将自定义数据(键)放在页面的每个链接中。换句话说,您会将 session_id 存储在 html 页面中,并在单击时通过 url 参数发送。 csrf 令牌也会发生类似的情况。调查一下。

    【讨论】:

    • 关于 cookie:你的意思是像 response.set_cookie('cookie_name', 'cookie_value'),还是暗示像我在问题中提到的那样在会话中设置变量?获得该方法的说明性示例会很好。在某种程度上,后一种方法反映了您提到的 csrf 令牌方法。
    • request.session.create() 与 response.set_cookie('session_id', key) 相同。不同之处在于它还将该键的数据存储在您设置的数据库(会话表)或其他存储库中,但在 HTTP 级别它的行为相同。它们都使用 HTTP Cookie 机制。
    • 所以我们以登录为例。 Django 将在浏览器上存储一个 session_id 以及数据库中的附加信息。如果有人拦截浏览器和网络服务器之间的调用并获得 session_id,他可以使用该 session_id 调用网络服务器,服务器将他视为该用户。所以我认为它与将所有内容存储在浏览器中一样容易受到攻击。为了确保安全,您应该使用 HTTPS。
    • 存储 session_id 的一个好处是,如果您使用 HTTPS,并且客户端的计算机被黑客入侵,黑客只会获得 session_id 而不是与其相关的所有私人信息。为此,网络服务器应不时重置 session_id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2020-11-15
    • 2016-01-17
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多