• 締切済み

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で検索してみても答えが見つからなかったので、質問させてください。

  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

  • 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

  • WTP,JSP,Servlet

    WTPを使って開発をしています。 設定まではうまくいきました。 一応環境をお知らせします。 ・WindowsVista ・WTP ・Tomcat6.0 ・Java6.0 ○実現したい事 JSP画面のフォームから送信ボタンでServletを呼ぶ。 ○困っていること JSP画面からServletが呼べない。 どうも <form method="post" action="com.Servlet"> のactionの指定が間違っているようです。 ○ソース環境 JSP : ルート/WebContent/JSP画面 Servlet : ルート/src/com/Servlet.java class : ルート/build/classes/com/Servlet.class ○エラー HTTPステータス 404 - /ルート/com.Servlet Actionの指定をいろいろと試したのですがダメでした。 Sevletの代わりにJSP画面と同じフォルダ内の他のJSPファイルを指定したらうまくいってます。 情報が足りなかったらすいません。 どうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • servletとjspの連携について

    昨日も質問したため、ほぼ連投になってしまって申し訳ありません 現在ブラウザ上で計算を行うプログラムを組んでいます jspから、form actionでサーブレットのパスを指定して、引数を渡すと同時にサーブレットを実行といった感じなんですが、サーブレットに飛ぼうとするとダイアログが出てきてしまいます。 これはどういったことが原因なんでしょうか? ページではなくファイルとして認識されているというのは大体判るんですが、解決方を教えていただけると幸いです。

  • Servlet+JSP連携

    Tomcat6.0を用いてSSL通信のテストプログラムを作成しています。 以下の順で実行するとサーブレットのdoPostが実行されずHTTP 404でエラーとなってしまいます。 1の地点で証明書がエラーになっているのが問題なのでしょうか? httpの場合は通常に遷移するため何か設定が必要なのでしょうか? 1.https://localhost:8443/Testを実行するとindex.jspが実行されます。 2.index.jsp内から <form action="TestServlet" method="POST"><input type="submit" value="a"/> でサーブレットに遷移したいです。  URLはhttps://localhost:8443/Test/TestServletとなっているため問題ないと思われます。

    • ベストアンサー
    • Java
  • jsp から servlet に

    パラメータをJSPからServlet に渡す所で、どうしても、null になってしまします‥。 主要な部分だけ書きます。 --jsp-- <jsp:useBean id="beanId" class="Bean" scope="request" /> <form method="POST" action="servlet"> <input type="submit" value="送信"> <input type="text" size="10" name="name"> --servlet-- import Bean; Bean bean = (Bean)request.getAttribute( "beanId" ); // ↑ここが、nullになってしまう。 --Bean-- public String getName() { return name; } public void setName( String name ) { this.name = name; } 考え方が違ってるかも知れないのですが‥。 よろしくお願いします。

    • ベストアンサー
    • Java
  • JSP、Servlet、設計について

    今回Webアプリの設計を行っていますが、そこで発生した疑問について質問させて頂きます。 このアプリは、大きく分けてログイン画面とメイン画面の二つがあり、各メイン画面ではフレーム部分と内側の部分が存在し、各メイン画面のフレーム部分のデザインは統一したいと思っています。 また、出来るだけMVCモデルを守り、スプリクトレットはできる限り用いず、カスタムタグは使用せず、JavaとServletが理解できれば全体が把握できるような形にしたいと思っています。 ○疑問1 メイン画面のデザインを統一させるためにどのような流れにするか? ・案1 サーブレット、フレーム部分のjsp、内側のjspのファイル、この3つをメイン画面の各機能分作る。 サーブレットで要求を受け、フレーム部分jspにフォワードし、フレーム部分jspから内側jspをインクルードする。 ・案2 サーブレット、フレーム部分のjsp、フレームからインクルードするファイルを決める分岐用サーブレット、この3つを一つづつ作り、内側のjspファイルを各機能分作る。 サーブレットで要求を受け、フレーム部分jspにフォワードし、フレーム部分jspから分岐用サーブレットをインクルードし、分岐用サーブレットから内側jspをインクルードする。 ・考察 案2では、フレーム部分jspを一つに限定できるのでそちらのほうが良いように思えますが、流れが若干複雑になります。案1ではシンプルですが、フレーム部分jspファイルが複数できてしまいます。 機能によっては、サーブレットとJSPがお互いを呼び出すような事が5回ぐらいネストされると思います。 このようなやり方が普通なのか、判断できません。 ○疑問2 ログイン情報を用いた動的メニューを、メイン画面で共通のフレームに追加したい。 ・案1 ViewHelperパターン?のような形にする 一例 <jsp:useBean id="menu" scope="request" class="MenuBean" /> <%= menu.getMenu() %> サーブレットでMenuBeanにログイン情報を設定し、JSPからメニューのHTMLを構成したStringを返してもらう。 ・案2 Servletにする <jsp:include page="MenuServlet" /> JSPからインクルードされたMenuサーブレットで、ログイン情報を取得してメニューのHTMLを構成し、out.printlnする。 ・考察 案1はサーブレットでMenuを作成しなくてはならず、一つ手間が増える。案2は、コントローラであるはずのServletでout.printlnしなくてはならないので何か違和感がある。(他のサーブレットでは、out.printlnする箇所は全くない) どちらが良いのか、または別の方法があるのか。 Servletで実現できるならViewHelperの用途とは何か? よろしくお願い致します。

  • EclipseでServlet/JSP

    エクリプス2.0.2を使っていますが、Servlet/JSPを使った開発でひとつ疑問があります。 ちなみに、 http://www.atmarkit.co.jp/fjava/rensai2/eclipse03/eclipse03.html で各種設定いたしました。 JSPを作成するのは問題ないのですが、 Servletのクラスを作るときに、新規→クラスで、ソースフォルダがプロジェクト名か、j2srcのどちらかしか選択できません。コンパイルして、そのクラスをclassesに移動してやりましたが、それを実行するときに、 http://localhost:8080/myWeb/servlet/Hello とすると、Helloクラスをダウンロードするような形になってしまうのです。URLはなんパターンか変えてやってみましたが、できません・・・。 どうすればうまくサーブレットを作って実行できるのでしょうか? 宜しくお願いします。

  • JSPからServletへの遷移

    今回、eclipseで開発をすることになりました。 しかしながら、動的Webプロジェクトという使い慣れないプロジェクトでの作成を しなくてはならなくなり、混乱しています。 tomcatとWTPのことについては、先の質問で教えて頂き解決したのですが、 もう一つ困ったことがあったので、再度質問させて頂きます。 --------------------------------------- 環境 Windows7 Ultimate eclipse Indigo tomcat 5.5 --------------------------------------- まずは、JSPを作成し、それを実行し、ブラウザ上に表示することは出来ました。 その後にServletに<form action ="/test" method = "POST">という形で投げるのですが、 それがうまくいかず、404エラーが出てしまいます。 階層としては、JSPはSample(プロジェクト名)/WebContent/NewFile.jspに配置しています。 そして、Servletについては、Sample(プロジェクト名)/src/test/Test.javaに配置しています。 web.xmlについては、Sample(プロジェクト名)/WebContent/WEB-INF/web.xmlにあります。 まず、JSPのソースは以下の様に書かれています。 ----------------------------------------------------- <%@ page contentType="text/html;charset=Windows-31J" language="java"%> <%@ page pageEncoding="Windows-31J"%> <html> <head><title>タイトル</title></head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <%request.setCharacterEncoding("Windows-31J");%> <body> <form method="POST" action="/test"> <%--ここに処理を記述 --%> <input type = "submit" name="submit" value = "送信"> </form> </body> </html> ----------------------------------------------------- Servletについては、以下の様に、型だけ記述しています。 ----------------------------------------------------- package test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Test */ public class Test extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Test() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } } ---------------------------------------------------- そして、web.xmlについては、以下の様に記述しています。 ---------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>SampleWeb</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>test</servlet-name> <servlet-class>test.Test</servlet-class> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> </web-app> ----------------------------------------------------- その状態で、JSPの中から <form action ="/test" method = "POST"> <input type ="submit" name = "submit" value="送信"> </form> とやっても、404が出てしまいます。 Java自体が久々で、根本的に間違っているかもしれませんが、 ご教授お願い致します。

    • ベストアンサー
    • Java
  • jspからServletにデータを送るには?

    javaを使って開発をしているのですが、 jspからServletにデータを送るのってform型のsubmitでしかできないですか? <a href="~">で行うことは無理でしょうか? ちなみに、form型だと以下のようにしています <form method="post" action ="hogeServlet" > <input type="hidden" name="id" value =<%=hoge.getid() %>> <input type="submit" id="button1" value="ほげ"> </form>

  • JSPが表示されません

    Apache2+Tomcat4.1+j2sdk1.4.2_06+EclipseでJSPとサーブレットのページを作ろうとしています。 HTMLファイルのフォームの内容をJSPファイルに送り、ServletでDBと参照、登録という流れを作ろうとしています。 aaa.html(ユーザーがデータを入力) ↓(1)フォームの内容を転送 bbb.jsp((2)htmlからの入力をccc.classに中継、(7)返り値を表示) ↓(3)メソッド呼び出し ↑(6)返り値を返す ccc.class(重複の有無確認やDBへの登録メソッド) ↓(4)SQL ↑(5)結果 DB(PostgresSQL) 本に書いてあるのを真似たらlocalhost上ではちゃんと動くようになりました。 つまり、下記のようにaaa.htmlからの転送先をlocalhost:8080/bbb.jspに指定するとうまく作動します。 <form name="form1" method="post" action="http://localhost:8080/bbb.jsp"> しかしながらこれではローカルでしか使えないので転送先を相対パスで指定したらうまくいきません。 <form name="form1" method="post" action="../bbb.jsp"> 外部から参照できるURL(サーバのIPアドレス)でもダメです。 <form name="form1" method="post" action="http://***.***.**.**/bbb.jsp"> 症状としては.jspファイルの最初のHTMLの記述はちゃんと動いているようで画面の色等はちゃんと変わります。 <%.....%>で囲まれたJAVAの記述がまったく作動しません。 /work/org/apache/jspに発生する中間ファイルもlocalhostのときには出来るのですが相対パスにすると出来ません。 どうしたらいいのでしょうか? ひょっとしたらとても初歩的なことかもしれませんがご存知の方がいらっしゃいましたらご教授願いたいと思います。

    • ベストアンサー
    • Java
  • JSPから値を送ったときのServletでの受け取り方について

    JSPから<form>で値を送って、それをServletでgetParameterで受け取る処理を しているのですが、 JSPから送る値がいくつあるかわからない場合、Servlet側ではどのように 受け取る方法があるでしょうか? 例えば、 <form action="<%= response.encodeURL("/mimi/abc") %>" method="post"> <% for(int i=0;i<attr.size();i++) { //attr.size()にはいくつ入ってるか不明として String strNameAtr = (String)attr.elementAt(i) ; %> 値 <input type="text" value="<%= strNameAtr %>" name="xmlValueAttr_"+"<%= i %>"><br> <% } %> <input type="submit" value="変更" name="getText"> </form> これを、Servletで受け取る場合、どのように受け取れるでしょうか? xmlValueAttr_iの"i"の部分はいくつまで入っているかわからないので、 普通の処理だと、対応できません。 いい方法があったら、教えてください、お願いします。

    • ベストアンサー
    • Java