从python(wsgi)访问php $ _SESSION - 有可能吗?

时间:2010-03-28 20:55:13

标签: php python session wsgi

我有一个python / WSGI应用程序需要检查用户是否已登录到PHP Web应用程序。问题是PHP应用程序通过将$ _SESSION变量中的值与用户浏览器中cookie中的值进行比较来检查用户是否已登录。如果可能的话,我宁愿避免改变php应用程序的行为。

我的问题:

  1. 无论如何我可以从python中访问会话变量吗?我应该从哪里开始看?

  2. 采用这种方法时,我应该注意哪些明显的安全/性能问题?

3 个答案:

答案 0 :(得分:3)

  1. 是的。 session(默认情况下)是常规文件。所以你需要的只是查看会话目录并查找具有会话cookie值名称的文件。然后 - 你必须实现类似php的序列化/反序列化并做任何你想做的事。

  2. 没了

答案 1 :(得分:1)

取决于PHP应用程序,如果它将会话数据保存在数据库中(可能是MySQL),您只需连接到数据库并获取数据,如果它使用本机PHP会话,您应该查看session.save_path配置在php.ini中设置,这是运行时使用会话数据保存文件的地方。

获得数据后,您可以对其进行解析以使其反序列化,请查看serialize()unserialize()在PHP中的工作方式。

答案 2 :(得分: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')

希望这对某人有所帮助,记住有关生成私钥然后小心使用它们的所有常用内容!