2010-03-28 18 views
4

我有一個python/WSGI應用程序,需要檢查用戶是否已登錄到PHP Web應用程序。問題在於PHP應用程序通過將$ _SESSION變量中的值與用戶瀏覽器中的cookie值進行比較來檢查用戶是否已登錄。如果可能的話,我寧願避免改變php應用程序的行爲。

我的問題:

  1. 反正我可以從蟒蛇內訪問會話變量?我應該從哪裏開始看?

  2. 在採取這種方法時,我應該注意哪些安全/性能問題?

回答

3
  1. 是的。會話(默認情況下)是一個常規文件。所以你所需要的只是查看會話目錄並找到具有會話cookie值名稱的文件。那麼 - 你必須實現類似於php的序列化/反序列化,並且做你想做的任何事情。

  2. 沒了

+2

你可能想看看:http://hurring.com/scott/code/python/serialize/ – 2010-03-28 21:07:37

+0

我知道它已經實現;-) – zerkms 2010-03-28 21:13:52

+0

還有:http://pypi.python.org/pypi/phpserialize – 2011-08-08 21:41:02

1

還要看PHP應用程序,如果是在數據庫中保存會話數據(MySQL的可能),你可以連接到數據庫並獲取數據,如果是使用原生的PHP會話你應該查看php.ini中的session.save_path配置設置,這是運行時將會話數據保存到文件的位置。

一旦你有數據,你可以解析它得到它的非序列化,看看serialize()unserialize()如何在PHP中工作。

+0

我推薦並使用此解決方案。實際上編寫基於mysql的會話管理器非常簡單 - 使用自定義會話方法,您還可以將會話數據存儲爲JSON,這使得它可以通用訪問。 – 2012-09-12 07:47:51

1

我目前正在嘗試與現有的Apache/PHP並行運行python服務器。我到達的自定義解決方案是將$ _SESSION保存爲加密的cookie,讓php身份驗證像以前一樣運行,然後在兩臺服務器之間共享私鑰。

兩個問題:

  • 取決於你如何處理會話過期的東西。
  • 我並沒有打擾初始化向量,假設從我到期的東西時間戳是足夠的。見https://stackoverflow.com/a/12486940/4495503爲什麼我可能是太鬆懈的安全...

不管怎樣,我的PHP加密的Cookie功能:

session_start(); 
    $encryptToCookie = function($varToEncode,$cookieName,$privateKey){ 
     $iv = $privateKey; 
     $pass = $privateKey; 
     $method = 'aes-128-cbc'; 
     $encryptedString = openssl_encrypt(json_encode($varToEncode), $method, $pass, true, $iv); 
     setcookie($cookieName,bin2hex($encryptedString)); 
    }; 

$encryptToCookie($_SESSION,"sessionEncrypted","yohoyohoyohoyoho"); // private key must be 16bit 

我的Python端解密:

from subprocess import Popen, PIPE 
import binascii 

def decrypt(encryptedString,privateKey): 
    encryptedString = binascii.unhexlify(encryptedString) 
    pathToOpenSSL = 'C:\pysrc\openssl\openssl.exe' # MODIFY THIS!! 

    openssl = Popen([pathToOpenSSL, 
        'enc','-aes-128-cbc','-d', 
        '-nosalt','-nopad','-K', 
        privateKey.encode('hex'), 
        '-iv', 
        privateKey.encode('hex')], 
        stdin=PIPE,stdout=PIPE) 
    decryptedString = openssl.communicate(encryptedString)[0].replace('\x04','') 
    return decryptedString 

decrypt(encryptedString,'yohoyohoyohoyoho') 

希望這對某人有幫助,請記住所有關於生成私鑰然後小心的事情!