8

ユーザーが PHP Web アプリにログオンしているかどうかを確認する必要がある python/WSGI アプリがあります。問題は、PHP アプリが $_SESSION 変数の値をユーザーのブラウザーからの Cookie の値と比較して、ユーザーがログオンしたかどうかを確認することです。可能であれば、php アプリの動作を変更することは避けたいと思います。

私の質問:

  1. Python内からセッション変数にアクセスできる方法はありますか? どこから見始めるべきですか?

  2. このアプローチを採用する際に知っておくべき明らかなセキュリティ/パフォーマンスの問題はありますか?

4

3 に答える 3

4
  1. はい。session (デフォルト) は通常のファイルです。必要なのは、セッションディレクトリを調べて、セッション Cookie 値の名前を持つファイルを見つけることだけです。次に、php のようなシリアル化/シリアル化解除を実装し、必要なことを行う必要があります。

  2. いいえ

于 2010-03-28T21:06:39.120 に答える
1

PHP アプリによって異なります。セッション データをデータベース (MySQL など) に保持している場合は、データベースに接続してデータを取得できます。ネイティブ PHP セッションを使用している場合はsession.save_path、php.ini の構成設定を確認する必要があります。ランタイムがセッション データを含むファイルを保存する場所。

データを取得したら、それを解析してシリアル化を解除し、PHPでの作業方法serialize()と作業方法を確認してください。unserialize()

于 2010-03-28T21:08:59.140 に答える
0

私は現在、Pythonサーバーを既存のApache/phpサーバーと並べて実行しようとしています。私がたどり着いたカスタム ソリューションは、$_SESSION を暗号化された Cookie として保存し、php 認証を以前と同じように動作させ、2 つのサーバー間で秘密鍵を共有することでした。

2 つの問題:

  • セッションの有効期限を処理する方法はあなた次第です。
  • 期限切れのものからのタイムスタンプで十分だと仮定して、初期化ベクトルを気にしませんでした。セキュリティが緩すぎる理由については、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 に答える