PHPのセッションは、前回使用したときから変更されているように見えたので、セッションを使用する簡単な方法を探していますが、同時に、比較的安全であり、優れた一般的な方法である必要があります。
7 に答える
セッション管理は少し前に変更されました (4.4 前後だったと思います)。古いメカニズムは引き続き機能しますが、非推奨です。かなり紛らわしいので、避けておくことをお勧めします。今日では、グローバル変数 $_SESSION (配列です) にアクセスしてセッションを使用します。そこにオブジェクト インスタンスを配置できますが、次のページでセッションを開始する前に、それらのオブジェクトのクラス定義をロードする必要があります。autoloadを使用すると、ここで役立ちます。
$_SESSION を使用する前に、セッションを開始する必要があります。セッションを開始するとヘッダーが送信されるため、以前は何も出力できません。これは、次の 2 つの方法のいずれかで解決できます。スクリプトの開始時に常にセッションを開始します。または、すべての出力をバッファリングし、スクリプトの最後に送信します。
良いアイデアの 1 つは、リクエストごとにセッションを再生成することです。これにより、ハイジャックの可能性が大幅に低くなります。
サイトにアクセスできなくなる可能性があるため、これは (少し) 悪いアドバイスです。ただし、ユーザーの権限が変更されるたびに、セッション ID を再生成する必要があります。一般に、これはログインするたびに行われることを意味します。これは、セッション固定 (セッション ハイジャックの一種) を防ぐためです。この件に関する詳細については、この最近のスレッド @ Sitepointを参照してください。
cookie ベースのセッションのみを使用することは問題ありませんが、ログイン時にセッション ID を再生成すると、追加のセキュリティは追加されず、アクセシビリティが少し低下します。
シンプルさに関しては、次の点に勝るものはありません。
# Start the session manager
session_start();
# Set a var
$_SESSION['foo'] = 'whatever';
# Access the var
print $_SESSION['foo'];
データベースはセッションに対してより安全かもしれませんが、最初にセッションに保存しているものに焦点を当てる必要があります-実際にはユーザーを識別するID以外は何も含めるべきではありません(ファーストネームまたはページ間の一時変数である可能性があります) )。
デフォルトの Cookie をそのまま使用することをお勧めします。データベース セッションでは、すべてのページで追加のヒットが発生します。すべてのサイトがスラッシュドットであるとは限りませんが、このような単純なものを事前に最適化しても害はありません。
使用法については、標準のグローバル変数をお勧めします。
$_SESSION['yourvar'] = 'somevalue';
すべてのコードでそのメソッドを使用すると、後でsession_set_save_handlerを使用してバックエンドを簡単に変更できます。これにより、セッション バックエンドを実装する統一された方法が得られます。オブジェクトを使用してすべてのセッション処理を含めることができることに注意してください。単純に各エントリに配列を指定します - array('Staticclass', 'staticmethod')。
より詳細な使用法については、セッションがKohanaPHPでどのように処理されるかをご覧になることをお勧めします。
この本で説明されているように、PHPセッションをデータベースに保存できます 。私はこの方法を使用しましたが、安全で実装が簡単であることがわかったので、お勧めします。
$SESSION 配列を Session() オブジェクトにカプセル化します。これにより、自動セキュリティ フィルター、フラッシュ変数 (一度使用されてから破棄される var) など、同様の (まだ分離可能な) 方法で、セッションから変数を取得し、取得および投稿できます。およびデフォルト値セッター。
その点で Symfony の動作を見てください。非常に役に立ちます。
最初の Web アプリケーションを開発していたとき、ログイン認証の問題を解決するのにセッションが役立ったので、セッションは私の PHP 知識の重要な部分でした。
session_start();
if( isset($_POST['username']) && isset($_POST['password']) )
{
if( auth($_POST['username'], $_POST['password']) )
{
//Authentication passed
$_SESSION['user'] = $_POST['username'];
// redirect to required page
header( "Location: index.php" );
}
else
{
//Authentication failed redirect to login
header( "Location: loginform.html" );
}
}
else
{
//Username and Password are required
header( "Location: loginform.html" );
}
まず、非常に具体的なビジネス上の理由がない限り、Cookieベースを使用します。プロジェクトのためだけにURLベースのセッションを主張するクライアントがいました。非常に不安定で、作業するのが面倒です。
1つの良いアイデアは、リクエストごとにセッションを再生成することです。これにより、ハイジャックの可能性がはるかに低くなります。例えば。
session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();
システムの一部としてある種のユーザーログインを実行している場合は、ログアウト時にセッションデータを完全に無効にして空にして、ユーザーがシステムから本当にログアウトされていることを確認することをお勧めします。セッションCookieを削除するだけでログアウトが実行されるシステムを見てきました。