[[Open棟梁>https://github.com/OpenTouryoProject]] wiki
「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>アプリケーション設計のポイント]]
-戻る
--[[機能一覧 - フレームワーク]]
--[[アプリケーション設計のポイント]]

*目次 [#z9baef0b]
#contents

*概要 [#h829495d]
-wwwブラウザの標準の機能では、業務アプリケーションのニーズに合った不正操作の制御・抑止方法が用意されていない。

-このため、案件によっては、JavaScriptなどを使用してwwwブラウザを制御する場合もある。

-ただし、JavaScriptを使用した不正操作の制御・抑止処理をクロス ブラウザに完全に対応させることは難しいので、~
サーバ側で不正操作を検出し、以降の処理を中断し、システムに問題がおこらないように制御することもできる。

★ 不正操作の制御・抑止に関する要件を明確にしておくこと。

*”Open棟梁”の不正操作防止に使用できる機能 [#c7267f68]
”Open棟梁”のASP.NET用P層フレームワークでは、~
以下の不正操作防止に関する機能を使用できる。

-[[不正操作防止機能]]
-[[二重送信防止機能]]
-[[画面遷移制御機能]]
**[[不正操作防止機能]] [#qbeda740]
**[[二重送信防止機能]] [#p78099fc]
**[[画面遷移制御機能]] [#ka245eee]
**[[ブラウザ・ウィンドウ別Session領域]] [#mbe940de]

*不正操作の種類 [#s313e5f6]
**新規ウィンドウの作成 [#z4f55627]
同一の業務を、wwwブラウザの同一プロセス上の複数ウィンドウで操作するとSessionの競合が発生する可能性がある。

※ ”Open棟梁” ASP.NET用P層フレームワークの「[[ブラウザ・ウィンドウ別Session領域]]」を使用することで、この問題を回避することができる 。
***window.openでnameを付与する。 [#g5414679]
1枚のブラウザ ウィンドウでの表示のみ許可するのであれば、~
GET要求をログイン時(もしくは任意の業務開始時)の1回のみ許可して~
名称付きのブラウザ ウィンドウにメニュー画面を表示させると良い。~
(ウィンドウ名を付与すると、2重に画面が開けなくなる。)

※ 仮に、1枚のブラウザ ウィンドウでの表示のみ許可するのであれば、~
>GET要求をログイン時(もしくは任意の業務開始時)の1回のみ許可して名称付きのブラウザ ウィンドウにメニュー画面を表示させる。
-window.open()でnameを指定する場合の注意事項 - masaakibの日記~
http://d.hatena.ne.jp/masaakib/20091027/1256652411
-window.open - Web API インターフェイス | MDN~
https://developer.mozilla.org/ja/docs/Web/API/window.open

>以降、全ての画面遷移を
-POST + Transferで実装してGET要求を拒否する
-もしくは、 ”Open棟梁”のASP.NET用P層フレームワークの「[[画面遷移制御機能]]」を使用する
***[[画面遷移制御機能]]と[[ブラウザ・ウィンドウ別Session領域]]を使用する。 [#sf5d2c59]
-ASP.NET用P層フレームワークの[[ブラウザ・ウィンドウ別Session領域]]機能を~
使用することで、Sessionの競合の問題を回避することができる 。

-また、以降、全ての画面遷移を
--POST + Transferで実装してGET要求を拒否する
--もしくは、ASP.NET用P層フレームワークの「[[画面遷移制御機能]]」を使用する

>ことで、1枚のウィンドウの制限を実現できる。

**URLの直打ち [#sc2f76c0]
-URLの直打ちによる画面表示が可能なように造られていない画面ではエラー が発生する可能性がある。
-例えば、画面遷移時の引渡し情報(Form情報、HTTPContext情報、Session情報.etc)の不足によるNull Reference例外など。

※ ”Open棟梁”のASP.NET用P層フレームワークの「[[画面遷移制御機能]]」を使用することで、この問題を回避することができる。
***アドレスバーを表示させない。 [#r8d5a154]
アドレスバーを非表示にさせれば、URLの直打ちを防止可能。

-参考
--window.open - Web API インターフェイス | MDN > ツールバー~
https://developer.mozilla.org/ja/docs/Web/API/window.open
---menubar
---toolbar
---location ★
---personalbar

***[[画面遷移制御機能]]を使用する。 [#hc70ae03]
ASP.NET用P層フレームワークの「[[画面遷移制御機能]]」を~
使用することで、URLの直打ちの問題を回避することができる。

**二重送信 [#nd813739]
-レコードの追加時:キー重複エラー、二重追加
-レコードの更新時:二重更新(タイムスタンプ アンマッチ)
-その他、Sessionの不整合として、更新エラーやNull Reference例外。

などが発生する可能性がある。

Gecko系のWWWブラウザ(Firefoxなど)ではデフォルトで二重送信が抑止されているものもあるが、IE6.0、7.0、8.0では抑止されていない。
Gecko系のWWWブラウザ(Firefoxなど)ではデフォルトで~
二重送信が抑止されているものもあるが、IE6.0、7.0、8.0では抑止されていない。

※ ”Open棟梁”のASP.NET用P層フレームワークの「[[二重送信防止機能]]」を使用することで、クライアント側で二重送信を防止できる。~
>また、「[[不正操作防止機能]]」を使用することで、(クライアント側で漏れた場合も、)サーバ側で「二重送信」を防止できる 。
***[[二重送信防止機能]]を使用する。 [#u065d36f]
ASP.NET用P層フレームワークの「[[二重送信防止機能]]」を~
使用することで、クライアント側で二重送信を防止できる。~

***[[不正操作防止機能]]を使用する。 [#l8eefc2d]
また、「[[不正操作防止機能]]」を使用することで(クライアント側で漏れた場合も)~
サーバ側で「二重送信」を防止できる(サーバー側で例外を発生させる)。

**戻る(バック サブミット) [#q83aabfd]
二重送信と同様の現象を発生させる可能性がある。

***戻る操作を無効にする。 [#i6dcdfe3]
-戻る操作を無効化させれば、戻る(バック サブミット)を防止可能。
--戻るボタンの非表示
--戻るショートカットの無効化

-参考
--window.open - Web API インターフェイス | MDN > ツールバー~
https://developer.mozilla.org/ja/docs/Web/API/window.open
---menubar ★
---toolbar ★
---location
---personalbar
--キーイベント抑止、ショートカットの処理(IE限定版)~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples/WebApp_sample/WebForms_Sample/WebForms_Sample/Scripts/touryo/ie_key_event.js

***キャッシュを無効化する。 [#ed3c5123]
これには、HTTPレスポンスのヘッダに「Cache-Control: no-cache」を設定しキャッシュ無効することで対応できるが、
-プロキシ サーバが存在する場合がある
-IEの「インターネット一時ファイルの設定」の「自動的に確認する」がファジーな動作を示す場合がある

など、制御し難いケースも発生し得る。

また、キャッシュ無効化だけの場合は、以下のケースで全画面に戻れてしまう。
また、キャッシュ無効化だけの場合は、以下のケースで前画面に戻れてしまう。

-バックボタン押下時に前画面を取得したHTTPリクエストを再送して前画面を取得するという仕様となっているので全画面に戻れてしまう。
-バックボタン押下時に[[前画面を取得したHTTPリクエストを再送>#eb2f2050]]して~
前画面を取得するという仕様となっているので前画面に戻れてしまう。

-これを抑止するために「ページの有効期限切れ」を表示させることもできる。~
しかし、これは前画面の取得がPOSTメソッドで、HTTPレスポンスのヘッダに「Expires: -1」が設定されている必要がある。

また、こちらも同様に挙動がファジーである。

※ ”Open棟梁”のASP.NET用P層フレームワークの「[[不正操作防止機能]]」を使用することで、サーバ側で「バック サブミット」を防止できる。
***[[不正操作防止機能]]を使用する。 [#k20c9b15]
ASP.NET用P層フレームワークの「[[不正操作防止機能]]」を使用することで、~
サーバ側で「バック サブミット」を防止できる(サーバー側で例外を発生させる)。

**更新(リロード) [#eb2f2050]
当該画面のレスポンスに対応する旧リクエストがサーバに再送されるため、二重送信と同様の現象を発生させる可能性がある。
-当該画面のレスポンスに対応する旧リクエストがサーバに再送されるため、二重送信と同様の現象を発生させる可能性がある。

ASP.NETの画面遷移直後の動作について:
-PostBack ---> Server.Transferの画面遷移直後の更新(リロード)の場合、「PostBackのPOST」から再送される。
-PostBack ---> Response.Redirectの画面遷移直後の更新(リロード)の場合、「RedirectのGET」が再送される。
-ASP.NETの画面遷移直後の動作について:
--PostBack ---> Server.Transferの画面遷移直後の更新(リロード)の場合、「PostBackのPOST」から再送される。
--PostBack ---> Response.Redirectの画面遷移直後の更新(リロード)の場合、「RedirectのGET」が再送される。

このため、Response.Redirectの場合は、初期表示か否かで動作が異なる場合がある(画面初期表示のGet再送、ポストバックのPost再送)。
-このため、Response.Redirectの場合は、初期表示か否かで、更新(リロード)時の~
HTTPメソッドが異なる場合がある(画面初期表示のGet再送、ポストバックのPost再送)。

必要に応じて、「メニュー非表示」・「ファンクション キー抑止」などで対応可能だが、クロス ブラウザでの対応は難しい可能性がある。
-この特性を利用して、二重送信防止に、PRG(Post-Redirect-Get)パターンを適用する方法もある。

※ ”Open棟梁”のASP.NET用P層フレームワークの「[[不正操作防止機能]]」を使用することで、サーバ側で(リロード)を防止できる。
***更新(リロード)操作を無効にする。 [#k0eeab8e]
更新(リロード)操作を無効化させれば、更新(リロード)を防止可能。
-更新(リロード)ボタンの非表示
-更新(リロード)ショートカット、F5キーの無効化

***[[不正操作防止機能]]を使用する。 [#mb930322]
ASP.NET用P層フレームワークの「[[不正操作防止機能]]」を使用することで、~
サーバ側で「リロード」を防止できる(サーバー側で例外を発生させる)。

**読み込みの停止後の操作 [#f3141c33]
-読み込みを停止して、再びサブミットすることにより、二重送信と同様の現象を発生させる可能性がある。
-必要に応じて、「メニュー非表示」・「ファンクション キー抑止」などで対応可能だが、クロス ブラウザでの対応は難しい可能性がある。
読み込みを停止して、再びサブミットすることにより、~
二重送信と同様の現象を発生させる可能性がある。

※ ”Open棟梁”のASP.NET用P層フレームワークの「[[不正操作防止機能]]」を使用することで、(読み込みの停止後の操作)を防止できる。
***読み込みの停止操作を無効にする。 [#a814ade1]
読み込みの停止操作を無効化させれば、読み込みの停止を防止可能。
-更新(リロード)ボタンの非表示
-更新(リロード)ショートカットの無効化

***[[不正操作防止機能]]を使用する。 [#g8c6c5f1]
ASP.NET用P層フレームワークの「[[不正操作防止機能]]」を使用することで、~
読み込みの停止後の操作を防止できる(サーバー側で例外を発生させる)。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS