У меня есть приложение python / WSGI, которое нужно проверить, чтобы узнать, вошел ли пользователь в веб-приложение PHP. Проблема в том, что приложение PHP проверяет, вошел ли пользователь в систему, сравнивая значение в переменной $ _SESSION со значением в cookie из браузера пользователя. Я бы предпочел не изменять поведение приложения php, если это вообще возможно.
Мои вопросы:
Есть ли в любом случае я могу получить доступ к переменным сеанса изнутри python? С чего начать?
Есть ли очевидные проблемы безопасности / производительности, о которых я должен знать при принятии такого подхода?
Ага. session (по умолчанию) является обычным файлом. поэтому все, что вам нужно, – это просмотреть каталог сеанса и найти файл с именем значения cookie сеанса. затем – вы должны реализовать php-подобный serialize / unserialize и делать все, что хотите.
Неа
Зависит от приложения PHP, если он хранит данные сеанса в базе данных (возможно, MySQL), вы можете просто подключиться к базе данных и получить данные, если они используют собственные сеансы PHP, вы должны посмотреть настройку конфигурации session.save_path
в php.ini , это место, где среда выполнения сохраняет файлы с данными сеанса.
После того, как у вас есть данные, вы можете проанализировать его, чтобы получить его неэтериализованным, взгляните на то, как serialize()
и unserialize()
работают в PHP.
В настоящее время я пытаюсь запустить сервер python бок о бок с существующим Apache / php. Специальное решение, к которому я пришел, состояло в том, чтобы сохранить $ _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')
Надеюсь, это поможет кому-то, вспомните все обычные вещи о создании секретных ключей, а затем, будьте осторожны с ними!