• 締切済み

Servlet/JSPのアクセス制限

Apache 2.2.x + Tomcat 5.5.xでサーバをたてています。 そこに、とあるサーブレット、ないしはJSPのファイルがあるとします。  www.somewhere.com/apps/servlet_or_jsp これを、通常は、同一サイト内にあるhtmlファイルのフォームから呼び出しています。  www.somewhere.com/foo.html   <form action="apps/servlet_or_jsp" ...> ここで、別サイトにあるhtmlファイルのフォームから、上記のファイルを呼び出そうとしてみます。  www.somewhereelse.com/bar.html   <form action="www.somewhere.com/apps/servlet_or_jsp" ...> すると、件のファイルを実行できてしまうのですが、これを外部サイトから実行できないようにするにはどうすれば良いのでしょうか? もしかしたら、とてつもなくくだらないことなのかもしれませんが、入門書を見たりWebで検索してみても答えが見つからなかったので、質問させてください。

みんなの回答

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.1

そもそもそのサイトへの「はじめの第一歩」は、クライアントからの要求で動作するのでしょうから、一番最初は、別サイトからの要求となってしまいますよね。 なので、無理なんじゃないでしょうか。。 やるとしたら、同一サイトのHTMLの中に特殊なパラメータをつけておいて、それが存在することを確認するとか・・ request.getRemoteAddr() とか request.getHeader("CLIENTIP")とかで対応できるかと思ったんですが、これだと本当にクライアントのIPアドレスしか返らないのですよね。。

Imagine128
質問者

お礼

ご回答ありがとうございます。 質問しておいてなんですが、私も何だか無理(というか、仕様として存在しない)のような気がしてきました。でなければ、「クロスサイトスクリプティング」なんて攻撃も出てこないでしょうし・・ >そもそもそのサイトへの「はじめの第一歩」は、 >クライアントからの要求で動作する ですね。ただ、質問の例でいうと、サーブレットやJSPを呼び出すのに使われた(フォームのある)htmlファイルがあるので、このファイル名を取得して、それが自サイト内にあるかどうかを確認してやればどうにかなるんじゃないかと思いました。 で、APIを見ていたところ、HttpServletRequestのgetRequestURLメソッドが使えそうだと気付きました。同メソッドの説明には「クライアントが要求を作成するために使用した URL を再構築します。」とあるので、そこに自ドメイン名が含まれていなければ処理を中断する、とかいう対処はできそうです("<% out.println(request.getRequestURL().toString()); %>"で確認してみましたが、何とかなりそうです)。 とはいえ、あまりスマートな解決法ではないので、引き続き情報を募集させていただきます。 最後になりましたが、getRemoteAddr()やgetHeader()については知りませんでした。参考にさせていただきます。

Imagine128
質問者

補足

一晩経って気付きましたが、getRequestURLではクライアントが呼び出したURLが返ってくるので意味ないですね(どこから呼び出されようが、自ドメインを含むURLが返ってくる・・)。

関連するQ&A

専門家に質問してみよう