簡體   English   中英

我正在使用PHP的Django用戶身份驗證。 這種基於cookie的身份驗證方案是否安全?

[英]I'm using Django user authentication with PHP. Will this cookie based authentication scheme be secure?

我有一個用PHP編寫的網站,並使用Python和Django添加新功能。 部分內容是使用標准的contribs.auth包進行Django身份驗證。

一旦有人使用我們的Django設置登錄,當他們來到PHP端時,我需要看到他們已登錄並使用數據庫中的用戶信息)。

使用此Django sessionid cookie值獲取用戶ID並證明Django會話ID在PHP中有效的最佳方法是什么?

我的計划是在登錄時制作Django會話ID,我的Django密鑰和用戶ID的哈希值。 該值將被設置為額外的cookie。 然后在PHP中,我將提取用戶ID,對其進行散列以及密鑰加上Django sessionid cookie值,並比較它們是否匹配。

一旦用戶成功通過身份驗證,我就會擴展auth登錄視圖以設置額外的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,它是會話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',
}

- 當然還有你自己設定的其他會話數據

你知道是否有可能建立一個相反的解決方案,即,這使得登錄PHP應用程序並使用此登錄信息登錄Django應用程序而無需再次輸入用戶名/密碼成為可能?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM