从Python (wsgi) 访问PHP $_SESSION - 可行吗?
我有一个用Python和WSGI做的应用程序,需要检查用户是否已经登录到一个PHP的网页应用。问题是,PHP应用通过比较用户浏览器中的cookie和$_SESSION变量里的值来判断用户是否登录。如果可以的话,我希望尽量不去改变PHP应用的行为。
我的问题是:
有没有办法让我在Python中访问这些会话变量?我应该从哪里开始找呢?
在采用这种方法时,有没有明显的安全或性能问题需要注意的?
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
没错,默认情况下,session是一个普通的文件。所以你只需要查看session目录,找到一个名字和session cookie值相同的文件。然后,你需要实现类似PHP的序列化和反序列化,接着就可以随意处理了。
不对。