微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我正在通过PHP使用Django用户身份验证.这种基于cookie的身份验证方案是否安全?

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

有人使用我们的Django设置登录后,当他们进入PHP端时,我需要查看他们是否已登录并使用数据库中的用户信息.

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

我的计划是在登录时对Django会话ID,我的Django密钥和用户ID进行哈希处理.该值将被设置为其他cookie.然后,在PHP中,我将提取用户ID,对其进行哈希处理,然后将密钥与Django sessionid cookie值进行比较,并比较它们是否匹配.

我扩展了auth登录视图,以在用户成功通过身份验证后设置一个额外的cookie.代替HttpResponseRedirect,它将返回HttpResponseSetAuthCookieAndRedirect.

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,该cookie是会话ID,我的Django密钥以及与会话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在会话中获取内容,则可以直接从数据库获取相关的会话数据(使用Cookie中的会话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',
}

-当然还有您自己设置的其他会话数据

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐