【问题标题】:Accessing php $_SESSION from python (wsgi) - is it possible?从 python (wsgi) 访问 php $_SESSION - 有可能吗?
【发布时间】:2011-02-01 20:01:25
【问题描述】:

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

我的问题:

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

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

【问题讨论】:

    标签: php python session wsgi


    【解决方案1】:

    我目前正在尝试将 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')
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我推荐并使用这个解决方案。编写基于 mysql 的会话管理器实际上非常简单 - 并且使用自定义会话方法,您还可以将会话数据存储为 JSON,这使得它可以普遍访问。
      【解决方案3】:
      1. 是的。 session(默认)是一个常规文件。所以你所需要的就是查看会话目录并找到具有会话 cookie 值名称的文件。然后 - 你必须实现类似 php 的序列化/反序列化并做任何你想做的事情。

      【讨论】:

      猜你喜欢
      • 2020-10-13
      • 2016-02-17
      • 2011-11-19
      • 1970-01-01
      • 2018-07-27
      • 2013-09-24
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多