TomcatでHTTPメソッドを許可しない場合、大文字と小文字が区別されますか?


11

アプリケーションのweb.xmlに以下を入れて、PUT、DELETEなどを禁止しようとしました。

 <security-constraint>
 <web-resource-collection>
  <web-resource-name>restricted methods</web-resource-name>
  <url-pattern>/*</url-pattern>
  <http-method>DELETE</http-method>
  <http-method>PUT</http-method>
  <http-method>SEARCH</http-method>
  <http-method>COPY</http-method>
  <http-method>MOVE</http-method>
  <http-method>PROPFIND</http-method>
  <http-method>PROPPATCH</http-method>
  <http-method>MKCOL</http-method>
  <http-method>LOCK</http-method>
  <http-method>UNLOCK</http-method>
  <http-method>delete</http-method>
  <http-method>put</http-method>
  <http-method>search</http-method>
  <http-method>copy</http-method>
  <http-method>move</http-method>
  <http-method>propfind</http-method>
  <http-method>proppatch</http-method>
  <http-method>mkcol</http-method>
  <http-method>lock</http-method>
  <http-method>unlock</http-method>
 </web-resource-collection>
 <auth-constraint />
 </security-constraint>

わかりましたので、今:

メソッドでリクエストを行うとDELETE、403が返されます。

メソッドでリクエストを行うとdelete、403が返されます。

だが

メソッドでリクエストを行うと、DeLeTeOKになります!

これらの大文字と小文字を区別しないようにするにはどうすればよいですか?

編集:私はそれをC#プログラムでテストしています:

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = "making request";
        System.Threading.Thread.Sleep(400);
        WebRequest req = WebRequest.Create("http://serverurl/Application/cache_test.jsp");
        req.Method = txtMethod.Text;
        try
        {
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

            textBox1.Text = "Status: " + resp.StatusCode;

            if (resp.StatusCode == System.Net.HttpStatusCode.OK)
            {
                WebHeaderCollection header = resp.Headers;
                using (System.IO.StreamReader reader = new System.IO.StreamReader(resp.GetResponseStream(), ASCIIEncoding.ASCII))
                {
                    //string responseText = reader.ReadToEnd();
                    textBox1.Text += "\r\n" + reader.ReadToEnd();
                }
            }
        }
        catch (Exception ex)
        {
            textBox1.Text = ex.Message;
        }
    }

txtMethod.Textメソッド名を入力するテキストボックスです。403がある場合、キャッチブロックでキャッチされる例外がスローされます。

cache_test.jspには次が含まれます。

<%
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","no-cache");

out.print("Method used was: "+request.getMethod());
%>

どのようにテストしますか?
ザビエルルーカス

その質問に追加@XavierLucas、
developerwjk

1
テストプログラムに欠陥があります。HttpWebRequestます大文字と小文字を区別せずに 認識して変換する大文字に標準のHTTPメソッドを。さらに、標準のHTTPメソッドのみを許可するものとして文書化されています。最適なオプションは、未加工のTCPストリームを使用することです(たとえば、netcat、またはPuTTY raw、またはtelnetなど)。
ボブ

1
@Bob、私はVisual C#2005 Expressの.NET 2.0でそれを行いましたが、これらの問題には遭遇しませんでした。入力したとおりに送信します。そのため、後のバージョンでそれを変更したに違いありません。
developerwjk

1
@ボブ、笑 Microsoftのドキュメントは間違っている/誤解を招くものです。.NET 2.0バージョンの場合、「メソッドプロパティは、HTTP 1.1プロトコルの動詞のいずれかに設定できます:GET、HEAD、POST、PUT、DELETE、TRACE、またはOPTIONS」。しかし、それは実際には決してそれに限定されません。
developerwjk

回答:


13

HTTP標準に関するTomcatの不正な動作に関係なく、ブラックリストではなくホワイトリストを使用して特定のメソッドを許可する必要があります。

たとえば、次のホワイトリストは、大文字と小文字を区別する GETおよびを除くすべてのメソッドをブロックしますHEAD

<security-constraint>
    <web-resource-collection>
        <web-resource-name>restricted methods</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method-omission>GET</http-method-omission>
        <http-method-omission>HEAD</http-method-omission>
    </web-resource-collection>
    <auth-constraint />
</security-constraint>

(注:Tomcat 7以降が必要です。古いバージョンを使用している場合は、サーブレットフィルターなどの他のソリューションを調査する必要があります。)

参照


POSTも含めてそれを行うと、サイトのページに移動し(リンクまたはブックマークをクリックするだけ)、405が表示

実際にはHTTP私にステータス403を与える-要求されたリソースへのアクセスが拒否されました
developerwjk

サーバーのweb.xmlで試してみましたが、省略は無視され、すべてがブロックされました。それを取りました。アプリケーションのweb.xmlで試してみましたが、すべてのメソッドをブロックし、省略を無視しました。
developerwjk

また、上記とまったく同じように試しましたが、取り出してから<auth-constraint />、すべてが許可されます。
developerwjk

2
@developerwjk http-method-omissionは、Tomcat 7+によって実装されるサーブレットAPI 3.0で最初に定義されました:tomcat.apache.org/whichversion.html。残念ながら、これはこれがTomcat 6以前では機能しないことを意味します(注:5はすでにEOLです)。あなたは2つの別々のを設定することを推奨するリンクされたSOの質問で他の提案された解決策を試すことができますsecurity-constraint-私は7で動作することを確認できませんでしたので、この答えにそれを含めませんでした。
ボブ

13

さて、Server: Apache-CoyotteHTTP応答にヘッダーシグネチャを保持しているいくつかのランダムサーバーで簡単にテストした後get / HTTP/1.1\r\nHost: <target_IP>\r\n\r\n、400 HTTPコードを受信する必要があるたびに、単純なnetcat接続で送信するのが正しいと思われます。

例えば ​​:

$ { echo -en "get / HTTP/1.1\r\nHost: <target_IP>:8080\r\n\r\n" ; } | nc <target_IP> 8080

01:14:58.095547 IP 192.168.1.3.57245 > <target_IP>.8080: Flags [P.], seq 1:42, ack 1, win 115, options [nop,nop,TS val 4294788321 ecr 0], length 41
E..]C.@.@..Y......p.....A..v.......s.......
..D.....get / HTTP/1.1
Host: <target_IP>:8080

[...]

01:14:58.447946 IP <target_IP>.8080 > 192.168.1.3.57245: Flags [.], seq 1:1409, ack 43, win 65494, options [nop,nop,TS val 7981294 ecr 4294787971], length 1408
E...f...i.....p.............A..............
.y....C.HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Tue, 27 Jan 2015 00:15:14 GMT

ここで少しショックを受けたと言わざるを得ず、そのような場合にその動作がすべてのHTTP / 1.1メソッドに拡張されるのを見て驚かないでしょう。

バグ追跡ツールにバグレポートを記入し、適切なメーリングリストにメールを送信する必要があります。これは、悪い結果を伴うRFC 2616(以下を参照)の1つのviolationい違反です。

5.1.1方法

  The Method  token indicates the method to be performed on the
  resource identified by the Request-URI. The method is case-sensitive.

      Method         = "OPTIONS"                ; Section 9.2
                     | "GET"                    ; Section 9.3
                     | "HEAD"                   ; Section 9.4
                     | "POST"                   ; Section 9.5
                     | "PUT"                    ; Section 9.6
                     | "DELETE"                 ; Section 9.7
                     | "TRACE"                  ; Section 9.8
                     | "CONNECT"                ; Section 9.9
                     | extension-method
      extension-method = token

3
注:RFC 2616は、RFC 7230-7235に置き換えられました。RFC 7230§3.1.1:「リクエストメソッドでは大文字と小文字が区別されます。」RFC 7231§4:「慣例により、標準化されたメソッドはすべて大文字のUS-ASCII文字で定義されています。」と回答の同じリストが続きます。
ボブ

1
応答ステータスコードは、実際には405 Method Not Allowedである必要があります。
ライライアン

3
@LieRyanいいえ、これはメソッドトークンがRFCに適合し、サーバーがこのリソースでの使用を許可しないためです。RFC 2616§10.4.1:[400 Bad Request] 不正な構文のために、サーバーは要求を理解できませんでした。RFC 2616§10.4.6 [405メソッドは許可されていません] メソッドのリクエストラインで指定はRequest-URIによって識別されるリソースに対して許可されていません。トークンは、HTTP メソッドではありません(上記のRFC 2616§5.1.1の抜粋を参照)get
Xavier Lucas

@XavierLucas:小文字のメソッドを使用することは構文エラーではありません。RFC2616セクション5を確認してください。ABNFにextension-methodtoken、RFCに具体的にリストされているメソッドだけでなく、すべての英数字と一部の記号を含む構文があります。独自の小文字メソッドの定義を含め、クライアントとサーバーの両方がどのように拡張されているかに同意する限り、HTTPのほぼすべての部分は拡張可能です。要求行「get / HTTP / 1.1」は構文的には問題ありません。メソッド名では大文字と小文字を区別する必要があるため、RFCに違反しています。
ライライアン

@LieRyan extension-methodは、次のRFCへの扉を開いたままにするためのものであり、独自のメソッドをRFCのスコープから追加してHTTP / 1.1準拠サービスを実行しているふりをするためのものではありません。したがって、最新のRFCにはそのようなメソッドがまだ登場していないため、400が返される必要があります。つまり、今日では無効なトークンです。トークンが現在のメソッドリストに関して有効であり、サーバー側に実装されているが許可されていない場合、405が返されます。メソッドが有効であるがサーバー側に実装されていない場合、501が返されます。
ザビエルルーカス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.