8

私は現在、私のWebサイトのすべてのページに次のコードを持っています。これがPHPセッションを開始して続行するための良い習慣であるかどうかを誰かが確認できますか?

//************************************************************
//Session Settings
//************************************************************

$session_name = 'PHPSESSID'; 
$session_exp_time = 10000; 

$previous_name = session_name($session_name);

//Set garbage collection parameters
ini_set('session.gc_maxlifetime',   $session_exp_time);
ini_set('session.gc_probability', '1');
ini_set('session.gc_divisor', '100');

ini_set('session.name', $session_name);
ini_set('session.cookie_domain', ''); //Session set to not be available to subdomains
ini_set('session.cookie_lifetime', 0);

//Set the session cookie parameters
session_set_cookie_params($session_exp_time, '/', '');

//Start or continue a session...
@session_start();

if (isset($_COOKIE[$session_name]))
setcookie($session_name, $_COOKIE[$session_name], 2147483647, '');

このスクリプトはすべてのページに含まれていることに注意してください。

別の関連する質問:

カスタムセッション保存パスを設定する必要がありますか、それともサーバーのデフォルトのセッション保存パスを使用する必要がありますか?長所と短所は何ですか?私が理解していることから、カスタムセッションの保存パスを設定しない場合、共有ホスティングで何らかの競合が発生する可能性がありますか?啓発にご協力ください。

前もって感謝します!

4

1 に答える 1

4

ステートメントの多くには、セッション構成設定が含まれています。これらは通常、サーバーphp.iniまたはトップレベル.htaccess(Apache) のいずれかに移動できます。

session.name = PHPSESSID
session.gc_maxlifetime = 10000

session.gc_probability = 1
session.gc_divisor = 1000

session.cookie_domain =
session.cookie_path = /
session.cookie_httponly = 1
session.cookie_lifetime = 0

セッションをそれほど長くするべきではありません (2038 年に有効期限が切れます)。セッションは通常、セッション Cookie で永続化されます (技術的には、ブラウザーが閉じられるまで持続します)。「remember me」機能を実装したい場合は、ここで説明されているように、セッションの上に追加することをお勧めします: http://jaspan.com/improved_persistent_login_cookie_best_practice

新しいセッションの開始と既存のセッションの再開を区別することが重要だと思います。特に、セッションがサインイン プロセスの一部としてのみ作成される場合はそうです。セッションを再開できない場合、何か問題が発生したため、ユーザーをログイン ページ (またはホームページ) にリダイレクトする必要があります。

PHP はその違いを理解せずsession_start、セッションが存在しない場合は自動的にセッションを作成します。さらに悪いことに、任意のセッション ID が指定されると、後者は、http: //gihyo.jp/dev/serial/01/php-security/0025で概説されているように、セッション採用攻撃を可能にします- 日本語なので、ブラウザで翻訳する必要があります。

セッションを再開できるかどうかを調べるには、特別なキー (例: $_SESSION['_id'] = session_id()) を追加して、すべての新しいセッションを準備する必要があります。そのキーが見つかった場合、セッションは既に存在し、再開できます。そうでない場合は、セッションが存在しなかったか、誰かが間違った ID を入力しようとしている可能性があります。

新しいセッションを開始するには、まず再開できるかどうかを確認します。そうでない場合は、session_regenerate_id(true)セッション ID を変更します (これにより、攻撃者がセッションをハイジャックするのが難しくなります)。

最後に、共有サーバー上のセッション保存パスは、自分のホーム フォルダーの下に書き込むことができますが、これは、共有ホストが仮想ホストごとの専用ユーザー (つまりsuexec) で実行されている場合にのみ意味があります。それ以外の場合、スヌーピング攻撃からセッションを保護するには、セッション データ (および場合によってはキーも) をエンコードする必要があります。mcrypt拡張子を確認してください: http://sg.php.net/mcrypt - オンラインで例を見つけることができるはずです。

これが多かれ少なかれあなたの質問に答えることを願っています。何かおかしいと思うことがあれば教えてください。

于 2012-05-12T06:22:38.390 に答える