8

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

我的问题:

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

  2. 采用这种方法时,是否有任何明显的安全/性能问题我应该注意?

4

3 回答 3

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

于 2010-03-28T21:06:39.120 回答
1

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

获得数据后,您可以对其进行解析以使其反序列化,看看 PHP 是如何serialize()工作unserialize()的。

于 2010-03-28T21:08:59.140 回答
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')

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

于 2015-10-02T09:48:28.127 回答