- PR -

Servlet JSPの直接起動抑止について

投稿者投稿内容
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-09-10 13:28
初めて投稿させていただきます。

現在Servlet JSPを使ったシステムを開発しています。
そこで各プログラムへの直接起動をチェックし、禁止させようとしています。

以下具体的なコーディング
---
[HogeServlet.java]
if( request.getHeader( "referer" ) == null ) {
//直接起動時の処理
return;
}
---

Servlet側の頭で上記のようにrequestからrefererを取って判定しています。


しかし、これでは一点問題が出てきました。

クライアントから本Servletを呼ぶ際、JavaScript制御により別ウィンドウに
表示させなければならいのです。

以下JavaScriptコーディング
---
function OpenWin(){
window.open('./servlet/HogeServlet');
}
---


上記のようにJavaScript経由でServletにアクセスすると
refererがnullになってしまうのです。
よって直接起動チェックではじかれます。
これはよろしくないです。


質問は主に以下の点です。
・直接起動チェックのロジックといて他にはどのような手段がありますでしょうか?
 その際、JavaScriptのwindow.open()からでもチェック回避できますでしょうか?

・直接起動チェックのロジックで広く一般的に使用されてるものはどのようなもの
 があるでしょうか?(こちらは単に興味からです・・)


以上、よろしくお願いします。
gsg
常連さん
会議室デビュー日: 2002/08/09
投稿数: 20
お住まい・勤務地: 東京都
投稿日時: 2002-09-10 13:38
referのみのチェックだと、パーソナルファイアウォールなどの機能で
Referがサーバに送られてこない環境からだと、ずっとアクセスできなく
なってしまうような気がします。

URL直打ちでの表示を防ぎたいページは、必ずある特定のページから
のみ、アクセスを許したいのでしょうか。前のページも自分が作成
しているのならば、セッションがあるかどうかで判定する様な
手段は取れるような気がします。

あるいは、何か特別なパラメータをPOSTで送ってきた場合のみ、
アクセスを許すとか・・・。

もっとよい方法もあると思いますが、とりあえずこのくらいが
思い浮かびましたので書いてみました。どうでしょうか。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-09-10 14:05
>gsg様

早速の返答ありがとうございます。

ファイアウォールなどの知識は疎いもので、そのような弊害
を予測できてませんでいた。ありがとうございます。

確かにアクセス元のページは私が作り、運用でも基本的に
そのページからのみのアクセスになると思います。
よって、セッションによる制御を少し考えてみます。


本システムではBeanを使ってServletとJSPで情報を共有しています。
その関係でSessionは使用しています。

ここで疑問なのですが

Sessionのある、なしでの判定になると
if( Session == null )という判定を使うのだと想像します。

この場合、確かに直接起動時はSessionがなくはじくことができると思います。
しかし、例えばあるWebページ(login画面でも検索画面でもなんでも)からServlet
にアクセスする場合、初回アクセス時

HttpSession session = req.getSession()

する箇所は必ずnullなのではないでしょうか?
そこで通常は

HttpSession session = req.getSession( true )

とすることで「セッションがない場合には新たに生成する」と
やるのが通常だと思っていました。

この場合Sessionによる直接起動チェックができるものか
ちょっと不安な部分もあるのです。

要は、初回起動(正常)によるSessionがない、および直接起動(異常)による
Sessionがないのをどう判別したらいいのか。

すいません、僕の認識が激しく間違っているのであれば指摘お願いしたい・・。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2002-09-10 14:17
最初に起動されるサーブレットで
HttpSession session = request.getSession(true)
セッション オブジェクトを生成して

それ以降のサーブレットでは このようにすればよいのでは

HttpSession session = request.getSession(false);

if (session == null){
response.sendRedirect("/index.htm");
return;
};

御爺庵
常連さん
会議室デビュー日: 2002/02/06
投稿数: 33
お住まい・勤務地: 大阪府
投稿日時: 2002-09-10 14:24
七味唐辛子さんの書かれた通りかと思います。
若干補足するなら、JSPのsession属性をfalseにする必要があるケースを忘れずに。
ですね。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-09-10 14:24
cookie にシリアル番号つけて、毎リクエストごとに違う番号送って、session にも「次にくるべき番号」を貯めておき、リクエストがきたらそれと照合。

こんなんでどすか。

複数の窓を開かれたりするとアウトですが。

画面遷移を完全に制御したいなら、hidden でページ ID を持たせて毎回 POST するしかないですかね。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2002-09-10 15:06
>七味唐辛子様、御爺庵様
返答ありがとうございます。
その場合、ログインの考え方でしょうか。
ログイン処理によりセッション生成(req.getSession( true ))
それ以降の処理は既存セッション使用(req.getSession( false ))

上記の場合、「初めのServlet」が必要になりますよね。
ログインであればlogin処理をするServletでしょう。

しかし私が関わっているシステムでは、ある大きなシステムの中の
サブシステムなのです。
ログインは私が触れられる部分ではありません。

例えば、ある業務システムで様々な検索機能を提供する場合、
実績検索、支店検索、人員検索、project検索色々あるとします。

       ログイン
         |
 -------------------------------
 |     |     |     |
検索A 検索B  検索C   検索D


私が関係しているのは下の、位置付けてきには皆並列な「検索機能」です。
ここでは「初めのServlet」がありません。
よって現在は各検索機能の「検索ボタン押下」によって各々Sessionを生成
しています。

直接起動抑止って結構むずかしいですね。



>しょむ様
確かに完全に制御したい場合は、そのような方法しかないのでしょうか。
もっとスマートな方法ってないかなぁ。悩む。
御爺庵
常連さん
会議室デビュー日: 2002/02/06
投稿数: 33
お住まい・勤務地: 大阪府
投稿日時: 2002-09-10 16:33
1.正しい手段で“検索”が呼ばれる場合は、全てPost MethodでのRequestとする
2.検索Servletでは...
  ・doGetは直接起動されたものと判断してはじく
  ・doPostのみ処理する...
根本解決にはならんのですが、少しは有効かも

スキルアップ/キャリアアップ(JOB@IT)