Доступ к php $ _SESSION из python (wsgi) - это возможно? - PullRequest
4 голосов
/ 29 марта 2010

У меня есть приложение на python / WSGI, которое должно проверить, вошел ли пользователь в веб-приложение PHP. Проблема заключается в том, что приложение PHP проверяет, вошел ли пользователь в систему, сравнивая значение в переменной $ _SESSION со значением в файле cookie из браузера пользователя. Я бы предпочел избегать изменения поведения приложения php, если это вообще возможно.

Мои вопросы:

  1. В любом случае я могу получить доступ к переменным сеанса из Python? Где мне начать искать?

  2. Существуют ли какие-либо очевидные проблемы с безопасностью / производительностью, о которых мне следует знать при использовании этого подхода?

Ответы [ 3 ]

3 голосов
/ 29 марта 2010
  1. да. Сессия (по умолчанию) является обычным файлом. так что все, что вам нужно, это просмотреть каталог сеанса и найти файл с именем значения cookie сеанса. затем - вам нужно реализовать php-подобную сериализацию / десериализацию и делать все, что вы хотите.

  2. Нету

1 голос
/ 02 октября 2015

В настоящее время я пытаюсь запустить сервер python бок о бок с существующим Apache / php. Индивидуальное решение, к которому я пришел, состояло в том, чтобы сохранить $ _SESSION в виде зашифрованного куки-файла, позволяя аутентификации 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 голос
/ 29 марта 2010

Зависит от приложения PHP, если оно хранит данные сеанса в базе данных (возможно, MySQL), вы можете просто подключиться к базе данных и получить данные, если оно использует собственные сеансы PHP, вы должны обратиться к настройке session.save_path php.ini, это место, где среда выполнения сохраняет файлы с данными сеанса.

Когда у вас есть данные, которые вы можете проанализировать, чтобы получить их несериализованные, посмотрите, как serialize() и unserialize() работают в PHP.

...