.NETエンタープライズ
Webアプリケーション開発技術大全

Sessionオブジェクト

マイクロソフト コンサルティング本部 赤間 信幸
2004/07/15

A. エンドユーザの自主性に委ね、アプリケーション側では対策をとらない。

 画面上に「2回ボタンを押さないでください」といったメッセージを記しておき、特にアプリケーション側では対処しない方法である(万が一2回押された場合には、運用により対処する)。

 最も簡単な方法ではあるが、アプリケーションとしては非常に危険なため、避けるべきであろう。

B. 更新処理を行うページに対してのみ、二重押しの対策を行う。

 例えば図17のような一連の処理の場合、特に一番最後の確定処理に関しては、二重押しによる重複処理が行われると、二重発注などが行われてしまう。このため、更新処理を行うページに関しては、何らかの手段でボタン二重押し対策を行っておくことが望ましい

図17 ボタン二重押し対策を行うべきページ

 具体的な手法としては、以下のようなものがある。

・ DHMTLによる二重押し防止ボタンの利用※18
  ・ 通常のボタンは何度でもクリックできてしまうが、図18のように一度押したらDisable状態に変更されるようにDTHMLを作りこむ。
  悪意のあるユーザからの二重送信を防ぐことはできないが、操作ミスによる一般ユーザからの二重送信を抑止することはできる。
 
※18 費用対効果の高い対策であるため、多くのWebアプリケーションで利用されている。ASP.NETの場合には、Webコントロールを拡張して独自のボタンWebコントロールを作成して利用するとよいだろう。
 
図18 二重押しできないボタン
 
・ トランザクションIDの事前発行
  ・ 一連の処理に対してあらかじめ一意なID(例えばGUID値)を発行しておき、サーバ側で同一IDに対する二重処理を防止するような作りこみを行う(図19)※19
 
※19 作り方によっては、1クリック攻撃に対する強化施策にもなる。
 
図19 トランザクションIDを使った二重押しへの対策

 これ以外にも、前述したようなSessionオブジェクトを利用したステート管理を行う方法もある。また、エンドユーザに対してメールを送信して確認を促す方法を組み合わせるのも有効である。

C. 画面遷移フローを強制しなくても済むように業務設計を工夫する。

 逆説的な発想だが、業務設計を工夫し、どのページに直接アクセスされても問題が発生しないようにアプリケーションを設計しておく手法もある(図20)。eコマース系のWebサイトでは、カタログ表示画面やショッピングカート表示画面に対して、URL直接指定によるアクセスが行われても問題が発生しないように業務が設計されていることが多い。

図20 画面遷移フローを強制しないアプリケーション設計

 このような設計は、商品表示ページなどをブックマークさせたり、あるいはURLをカット&ペーストして知り合いに紹介させたいようなWebサイトでよく見かけられる。業務がこのように設計されている場合には、アプリケーション側でも画面遷移フローを制御・管理する必要性がない。

D. 画面遷移フローをアプリケーションコントローラにより強制する。

 業務アプリケーションの特性によっては完全に画面遷移フローを強制したい場合があるが、Sessionオブジェクトを利用してステート管理を行う前述の方法では、開発生産性や保守性の観点から問題がある。このような場合には何らかの部品化を行ったり、画面遷移制御を行うフレームワークを活用したりすることが望まれる。ASP.NETの場合にはUIPAB(User Interface ProcessApplication Block)と呼ばれるアプリケーションブロックを活用することができる※20

※20 patterns & practicesから提供されているアプリケーションブロックの1つで、以下のアドレスからダウンロードして利用することができる。
http://msdn.microsoft.com/library/en-us/dnbda/html/uip.asp

 UIPABを利用したフロントエンド開発の概念図を図21に示す。UIPABを利用した開発では、UI画面(Webページ)上に個別の制御ロジックを作りこむことを避ける。そのかわりに、アプリケーションコントローラと呼ばれる制御支援コンポーネント(UIP / User Interface ProcessComponentとも呼ばれる)に、画面遷移制御やステート情報の管理機能を持たせる。

図21 UIPABを利用したフロントエンド開発の概念図

 このような画面遷移制御やステート情報管理を行うアプリケーションコントローラの開発は、一般的には容易ではない。しかし、UIPABを利用すると、アプリケーションコントローラの豊富な機能を持つ基底クラスなどが提供されため、以下のような機能を比較的容易に得ることができるようになる。

・ ナビゲーショングラフの強制
  ・ 指示されたナビゲーショングラフに沿わない画面遷移やURL直接指定によるアクセスが発生しても、現在のユーザ状態に応じた画面に強制的に切り替えて表示を行う。
 
・ 一時中断機能
  ・ UIPABはステート保存機能を持つ。これにより、仮にブラウザを閉じて再度これらのページ群にアクセスした場合でも、ブラウザを閉じたときの状態から作業に復帰することができる。

 一方、UIPABの難点として以下のような問題も挙げられる。

・ 独自の設計/実装モデルの強制
  ・ UIPABはフロントエンド制御フレームワークの一種であり、さらにWindowsフォームとWebフォームを抽象化する機能まで持っている。
  ・ このため、ASP.NETランタイムとは連動しない独自機能を利用しなければならない場所もある。例えば、SessionオブジェクトのかわりにStateオブジェクトを利用しなければならない等、UIPAB独自のプログラミングを強制される。

 しっかりした画面遷移制御フレームワークを開発することはかなり厄介であるため、画面遷移の完全な制御が必要とされる場合にはUIPABの適用を考えるとよいだろう。半面、画面遷移の強制制御が不要、あるいは一部分に限られるようなWebアプリケーションの場合には、UIPABの適用がかえって開発生産性を落とすことにもつながりかねない。このため、アプリケーションの特性(画面遷移を強制する度合い)を考えた上で、その適用有無を考えることが望ましい。

 以上、広範な項目に渡ってSessionオブジェクトの利用方法や注意点について述べてきたが、ここまで見てきたように、Sessionオブジェクトの使い方次第ではアプリケーション品質が大幅に変わってしまう危険性がある。アプリケーションの設計・実装に際しては、正しい使い方をするように注意しなければならない。End of Article

.NETエンタープライズWebアプリケーション開発技術大全
Vol.3 ASP.NET 応用編
定価 3,990円(税込み)

赤間 信幸(マイクロソフト株式会社コンサルティング本部) 著
B5変型判/380p
ISBN 4-89100-429-0
日経BPソフトプレス発行


日経BPソフトプレスの書籍紹介ページへ
マイクロソフトプレスの書籍紹介ページへ
 
 

 INDEX
  .NETエンタープライズWebアプリケーション 開発技術大全
  Sessionオブジェクト
    1.Sessionオブジェクトに格納可能なデータ
    2.Sessionデータの保存場所と耐障害性(ステートサービスとステートデータベース)
    3.Sessionデータのサイズ(1)
    4.Sessionデータのサイズ(2)
    5.パーソナライズ、セッション、認証済みアクセスの違いと使い分け
    6.画面遷移制御とアプリケーションコントローラ(1)
  7.画面遷移制御とアプリケーションコントローラ(2)
 
インデックス・ページヘ  「.NETエンタープライズWebアプリケーション開発技術大全」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間