セッション ID
更新 : 2007 年 11 月
ブラウザ セッションは、SessionID プロパティに格納されている一意の ID によって識別されます。セッション ID により、ASP.NET アプリケーションは、特定のブラウザを、Web サーバー上の適切なセッション データおよび情報に関連付けることができます。セッション ID の値は、ブラウザと Web サーバー間で Cookie として転送されますが、Cookie なしのセッションが指定されている場合は URL として送信されます。
注意 : |
---|
P:System.Web.SessionState.HttpSessionState.SessionID 値は、Cookie としても URL の一部としてもクリア テキストで送信されます。仮に望ましくないソースが SessionID 値を取得し、それをサーバーへの要求に含めれば、他のユーザーのセッションにアクセスできます。そのため、個人情報や機密情報をセッション状態に格納する場合は、SSL を使用して、SessionID を含む、ブラウザとサーバー間の通信を暗号化することをお勧めします。 |
Cookie なしのセッション ID
SessionID は、既定では、ブラウザの無期限セッション Cookie に格納されます。セッション ID が Cookie に格納されないようにするには、Web config ファイルの sessionState セクションで、cookieless 属性に True を設定します。
メモ : |
---|
アプリケーションのセキュリティを向上するには、ユーザーがアプリケーションからログアウトできるようにし、ログアウトする時点で、アプリケーションが Abandon メソッドを呼び出すようにする必要があります。これにより、望ましくないソースが URL 内の一意の ID を取得し、セッションに格納されているユーザーの個人データを取得する危険性が低減されます。 |
ASP.NET は、一意のセッション ID をページの URL に自動的に挿入して、Cookie なしのセッション状態を保持します。たとえば、次の URL は ASP.NET によって変更され、lit3py55t21z5v55vlm25s55 という一意のセッション ID が挿入されています。
http://www.example.com/s(lit3py55t21z5v55vlm25s55)/orderform.aspx
要求されたページに、アプリケーションへの相対パスを使用するリンクが含まれている場合、ASP.NET は、それらのリンクにセッション ID 値を埋め込み、リンクを変更してから各ページをブラウザに送信します (明示的なパスは変更されません)。セッション状態は、ユーザーが ASP.NET アプリケーションから提供されたリンクのパスに従っている限り、保持されます。ただし、アプリケーションから提供された URL をクライアントが書き直した場合、ASP.NET は、セッション ID を解決して要求を既存のセッションに関連付けることができなくなり、その結果、要求に対して新しいセッションが開始される可能性があります。
セッション ID は、URL 内のアプリケーション名の後のスラッシュと、残りのファイル ID または仮想ディレクトリ ID の間に埋め込まれます。これにより、ASP.NET は、アプリケーション名を解決してから、SessionStateModule を要求に含めることができます。
次の例は、Cookie なしのセッション ID を使用するように ASP.NET アプリケーションを構成する Web.config ファイルを示しています。
<configuration>
<system.web>
<sessionState cookieless="true"
regenerateExpiredSessionId="true" />
</system.web>
</configuration>
期限切れのセッション ID の再生成
既定では、Cookie なしのセッションで使用されるセッション ID 値はリサイクルされます。つまり、期限切れのセッション ID によって要求が行われた場合、その要求に含まれている SessionID を使用して新しいセッションが開始されます。この結果、Cookie なしの SessionID を含むリンクが、検索エンジンやその他のプログラムを通じて複数のブラウザで共有される場合には、セッション データが不適切に共有される可能性があります。セッション データが複数のクライアントによって共有される可能性を低減するには、セッション ID のリサイクルを無効にします。セッション ID のリサイクルを無効にするには、sessionState 構成要素の regenerateExpiredSessionId 属性に true を設定します。このようにすると、期限切れのセッション ID によって Cookie なしのセッション要求が行われると、新しいセッション ID が生成されるようになります。
メモ : |
---|
期限切れのセッション ID による要求が HTTP POST メソッドを使用して行われたときに、regenerateExpiredSessionId が true の場合、ASP.NET はリダイレクトを実行し、ブラウザが URL に新しいセッション ID を確保できるようにするため、ポストされているデータがすべて失われます。 |
カスタム セッション ID
SessionID 値を提供し、検証するためにカスタム クラスを実装するには、SessionIDManager クラスを継承するクラスを作成し、CreateSessionID メソッドと Validate メソッドを独自のカスタム実装によってオーバーライドします。SessionIDManager クラスをオーバーライドし、これらのメソッドを実装する例については、CreateSessionID メソッド用に示す例を参照してください。
ISessionIDManager インターフェイスを実装するクラスを作成すると、SessionIDManager 全体を置き換えることができます。たとえば、Web アプリケーションで、ISAPI フィルタを使用する HTML ページやイメージなど、ASP.NET 以外のページに一意の ID を関連付けることができます。この一意の ID を ASP.NET セッション状態で使用するには、カスタム SessionIDManager クラスを実装します。カスタム クラスが Cookie なしのセッション ID をサポートしている場合は、URL 内のセッション ID を送信および取得するためのソリューションを実装する必要があります。