gpt4 book ai didi

php - 我在 PHP 中使用 Django 用户身份验证。这种基于 cookie 的身份验证方案是否安全?

转载 作者:搜寻专家 更新时间:2023-10-31 20:53:49 24 4
gpt4 key购买 nike

我有一个用 PHP 编写的网站,我正在使用 Python 和 Django 添加新功能。其中一部分是使用标准 contribs.auth 包的 Django 身份验证。

一旦有人使用我们的 Django 设置登录,当他们来到 PHP 端时,我需要看到他们已经登录并使用数据库中的用户信息。

使用此 Django sessionid cookie 值从 PHP 获取用户 ID 并证明 Django session ID 有效的最佳方法是什么?

我的计划是对 Django session ID、我的 Django key 和登录时的用户 ID 进行哈希处理。该值将被设置为附加 cookie。然后在 PHP 中,我将提取用户 ID,对其和 key 加上 Django sessionid cookie 值进行哈希处理,然后比较它们是否匹配。

我扩展了授权登录 View ,以便在用户成功通过身份验证后设置一个额外的 cookie。它将返回 HttpResponseSetAuthCookieAndRedirect,而不是 HttpResponseRedirect。

HttpResponseSetAuthCookieAndRedirect 获取 request.session.session_id 和 user_id 作为参数。

class HttpResponseSetAuthCookieAndRedirect(HttpResponse):
""" a cookie enhanced version of HttpResponseRedirect """
status_code = 302

def __init__(self, user_id, session_id, redirect_to):
HttpResponse.__init__(self)
self['Location'] = iri_to_uri(redirect_to)

my_hash=hashlib.sha512('{0}|-|{1}|-|{2}'.format(settings.SECRET_KEY,user_id,session_id)).hexdigest()

cookie_hash="{0}::{1}".format(user_id,my_hash[:64])

self.set_cookie('check', value=cookie_hash, max_age=172800, path='/', domain=None)

这会设置一个 cookie,它是 session ID、我的 Django key 和与 session ID 匹配的经过身份验证的用户 ID 的哈希值。

在 PHP 中,

$check_cookie=$_COOKIE['check'];
$django_cookie=$_COOKIE['sessionid'];

$check_cookie=str_replace('"','',$check_cookie);
$django_cookie=str_replace('"','',$django_cookie); //they have quotes for some reason

$parts=explode('::',$check_cookie);

$sent_user_id=(int)$parts[0];
$sent_hash=$parts[1];

$cookie_hash=hash('sha512',"$secret_key|-|$sent_user_id|-|$dj_cookie_sessionid");
$reconstructed_security_hash=$sent_user_id.'::'.substr($cookie_hash,0,64);

if($reconstructed_security_hash==$cookie_hash)
{
return $sent_user_id; //cookies are valid, and user id is the one set by Django for this session id.
}

return false; //cookies do not match

到目前为止,这是有效的。

这个想法合理吗?

最佳答案

如果您可以在 PHP 中解开 Django 腌制到 session 中的内容,那么您可以直接从数据库中获取相关的 session 数据(使用来自 cookie 的 session ID),然后您将获得哪个用户已登录的直接信息Django 站点 - 如果有的话。

编辑:

这是 Django 使用的“加密”:

http://code.djangoproject.com/browser/django/tags/releases/1.2.4/django/contrib/sessions/backends/base.py#L86

“解密”后你应该得到类似的东西:

{
'_auth_user_id': 123,
'_auth_user_backend': 'django.contrib.auth.backends.ModelBackend',
}

-- 当然还有你自己设置的其他 session 数据

关于php - 我在 PHP 中使用 Django 用户身份验证。这种基于 cookie 的身份验证方案是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4827701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com