我有一个python / WSGI应用程序需要检查用户是否已登录到PHP Web应用程序。问题是PHP应用程序通过将$ _SESSION变量中的值与用户浏览器中cookie中的值进行比较来检查用户是否已登录。如果可能的话,我宁愿避免改变php应用程序的行为。
我的问题:
无论如何我可以从python中访问会话变量吗?我应该从哪里开始看?
采用这种方法时,我应该注意哪些明显的安全/性能问题?
答案 0 :(得分:3)
是的。 session(默认情况下)是常规文件。所以你需要的只是查看会话目录并查找具有会话cookie值名称的文件。然后 - 你必须实现类似php的序列化/反序列化并做任何你想做的事。
没了
答案 1 :(得分:1)
取决于PHP应用程序,如果它将会话数据保存在数据库中(可能是MySQL),您只需连接到数据库并获取数据,如果它使用本机PHP会话,您应该查看session.save_path
配置在php.ini中设置,这是运行时使用会话数据保存文件的地方。
获得数据后,您可以对其进行解析以使其反序列化,请查看serialize()
和unserialize()
在PHP中的工作方式。
答案 2 :(得分:1)
我目前正在尝试与现有的Apache / php并行运行python服务器。我得到的一个自定义解决方案是将$ _SESSION保存为加密cookie,让php身份验证像以前一样运行,然后在两个服务器之间共享一个私钥。
两个问题:
无论如何,我的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')
希望这对某人有所帮助,记住有关生成私钥然后小心使用它们的所有常用内容!