Доступ к php $_SESSION из python (wsgi) — возможно ли это?

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

Мои вопросы:

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

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


person Bill Zimmerman    schedule 28.03.2010    source источник


Ответы (3)


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

  2. Неа

person zerkms    schedule 28.03.2010
comment
Ссылка в комментарии Дэвида не работает. Вместо этого я нашел эту суть: gist.github.com/scragg0x/3894835 - person skarap; 27.05.2013

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

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

person Daniel Dinu    schedule 28.03.2010
comment
Я рекомендую и использую это решение. На самом деле очень просто написать диспетчер сеансов на основе mysql — и, используя пользовательские методы сеанса, вы также можете хранить данные сеанса в формате JSON, что делает их общедоступными. - person Alfred Bratterud; 12.09.2012

В настоящее время я пытаюсь запустить сервер Python рядом с существующим сервером Apache/php. Личное решение, к которому я пришел, заключалось в том, чтобы сохранить $_SESSION в виде зашифрованного файла cookie, позволяя аутентификации php работать, как и раньше, а затем совместно использовать закрытый ключ между двумя серверами.

Две проблемы:

  • Вам решать, как обращаться с истечением срока действия сеанса.
  • Я не беспокоился о векторе инициализации, предполагая, что отметка времени из моего материала с истечением срока действия достаточна. См. https://stackoverflow.com/a/12486940/4495503, чтобы узнать, почему я могу быть слишком слабым в плане безопасности...

В любом случае, моя функция cookie с шифрованием php:

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')

Надеюсь, это поможет кому-то, помните все обычные вещи о создании закрытых ключей, а затем будьте осторожны с ними!

person leontrolski    schedule 02.10.2015