从Python (wsgi) 访问PHP $_SESSION - 可行吗?

8 投票
3 回答
5558 浏览
提问于 2025-04-15 20:57

我有一个用Python和WSGI做的应用程序,需要检查用户是否已经登录到一个PHP的网页应用。问题是,PHP应用通过比较用户浏览器中的cookie和$_SESSION变量里的值来判断用户是否登录。如果可以的话,我希望尽量不去改变PHP应用的行为。

我的问题是:

  1. 有没有办法让我在Python中访问这些会话变量?我应该从哪里开始找呢?

  2. 在采用这种方法时,有没有明显的安全或性能问题需要注意的?

3 个回答

0

我现在正在尝试让一个Python服务器和一个现有的Apache/PHP服务器同时运行。我想到的一个解决方案是把$_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')

希望这些对某些人有帮助,记得生成私钥时要注意安全哦!

1

这要看你的PHP应用程序是怎么处理会话数据的。如果它把会话数据存储在数据库里(比如MySQL),你可以直接连接到数据库去获取这些数据。如果它使用的是原生的PHP会话,你就需要查看一下php.ini文件里的session.save_path这个配置设置,这里是运行时保存会话数据文件的地方。

一旦你拿到了数据,就可以解析它,把它转换回来。可以看看PHP里的serialize()unserialize()是怎么工作的。

4
  1. 没错,默认情况下,session是一个普通的文件。所以你只需要查看session目录,找到一个名字和session cookie值相同的文件。然后,你需要实现类似PHP的序列化和反序列化,接着就可以随意处理了。

  2. 不对。

撰写回答