Tomcat'te HTTP yöntemlerine izin verilmemesi büyük / küçük harfe duyarlıdır?


11

Ben PUT, DELETE, vb izin vermemek için benim uygulama web.xml aşağıdaki koydu:

 <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>

Tamam, şimdi:

Eğer yöntem ile bir istek DELETEyaparsam 403 geri alırım.

Eğer yöntem ile bir istek deleteyaparsam 403 geri alırım.

FAKAT

Ben yöntem ile bir istek DeLeTeyaparsam ben OK olsun!

Bu büyük / küçük harfe duyarsız hale nasıl getirebilirim?

Düzenleme: Ben bir C # programı ile test:

    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.Textyöntem adını yazdığım bir metin kutusudur. 403 olduğunda, yakalama bloğunda yakalanan bir istisna atılır.

Cache_test.jsp içeriği:

<%
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());
%>

Nasıl test edersiniz?
Xavier Lucas

@XavierLucas, Bunu soruya ekledi
developerwjk

1
Test programınız hatalı. HttpWebRequestolacaktır harf-duyarsızca tanımak ve dönüştürmek büyük harfe standart HTTP yöntemlerini. Ayrıca, yalnızca standart HTTP yöntemlerine izin verildiği belgelenmiştir . En iyi seçenek ham TCP akışı kullanmaktır (örneğin netcat, PuTTY raw veya telnet vb.).
Bob

1
@Bob, Visual C # 2005 Express'te .NET 2.0'da yaptım ve bu sorunların hiçbirine rastlamadım. Tam olarak yazdıklarımı gönderiyor. Yani bunu daha sonraki bir versiyonda değiştirmiş olmalılar.
developerwjk

1
@ Bob, Lol. Microsoft'un belgeleri yanlış / yanıltıcı. .NET 2.0 sürümü için ayrıca "Method özelliği HTTP 1.1 protokol fiillerinden birine ayarlanabilir: GET, HEAD, POST, PUT, DELETE, TRACE veya OPTIONS." Ancak pratikte hiçbir şekilde bununla sınırlı değildir.
developerwjk

Yanıtlar:


13

Tomcat'in HTTP standardıyla ilgili yanlış davranışından bağımsız olarak, bir kara liste yerine belirli yöntemlere izin vermek için bir beyaz liste kullanmalısınız.

Örneğin, aşağıdaki beyaz liste büyük / küçük harfe duyarlı GET ve dışındaki tüm yöntemleri engeller 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>

(Not: Tomcat 7+ gerekir. Daha eski sürümleri kullananlar, örneğin sunucu uygulaması filtresi gibi diğer çözümleri araştırmak zorundadır.)

Ref


Ben de dahil POST ile bunu yaptığım zaman, ben sadece bir bağlantı veya yer imine tıklayarak sitedeki bir sayfaya gitmek ve bana bir 405 verir.
developerwjk

Aslında bana HTTP Durumu 403 veriyor - İstenen kaynağa erişim reddedildi
developerwjk

Sunucunun web.xml dosyasında denedim ve eksiklikleri görmezden geldi ve her şeyi engelledi. Çıkardı. Uygulamanın web.xml dosyasında denedim ve yine her yöntemi engelledi ve eksiklikleri görmezden geldi.
developerwjk

Ayrıca tam olarak yukarıdaki gibi denedim ama çıkarıyor <auth-constraint />ve sonra sadece her şeye izin veriyor.
developerwjk

2
@developerwjk http-method-omissionilk olarak Tomcat 7+ tarafından uygulanan Servlet API 3.0'da tanımlanmıştır: tomcat.apache.org/whichversion.html . Ne yazık ki, bu Tomcat 6 ve daha eski sürümlerde işe yaramayacağı anlamına gelir (not: 5 zaten EOL'dir). Bağlantılı SO sorusunda iki ayrı security-constraints ayarlanmasını öneren diğer önerilen çözümü deneyebilirsiniz - 7'de çalıştığını doğrulayamadım, bu yüzden bu cevaba dahil etmedim.
Bob

13

Server: Apache-CoyotteHTTP yanıtlarında başlık imzası tutan bazı rasgele sunucular üzerinde hızlı bir test yaptıktan sonra , get / HTTP/1.1\r\nHost: <target_IP>\r\n\r\n400 HTTP kodunun alınması gerekirken her seferinde çalışılan basit bir netcat bağlantısıyla gönderme yapmak doğru görünüyor .

Örneğin :

$ { 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

Burada biraz şok olduğumu söylemeliyim ve bu durumda tüm HTTP / 1.1 yöntemlerine yayılan davranışı görmek beni şaşırtmaz.

Hata izleme aracında bir hata raporu doldurmalı ve uygun posta listesine bir posta göndermelisiniz, çünkü bu, RFC 2616'nın çirkin bir ihlalidir (aşağıya bakınız), kötü sonuçlarla.

5.1.1 Yöntem

  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
Not: RFC 2616 artık RFC 7230-7235 ile değiştirilmiştir. RFC 7230 § 3.1.1 : "İstek yöntemi büyük / küçük harfe duyarlıdır." RFC 7231 § 4 : "Kural olarak, standart yöntemler tüm büyük harf US-ASCII harfleriyle tanımlanır." Ve ardından yanıtınızdaki aynı liste.
Bob

1
Yanıt durum kodu aslında 405 Yönteme İzin Verilmiyor olmalıdır.
Yalan Ryan

3
@LieRyan Hayır, çünkü sunucu bu kaynakta kullanılmasına izin vermezken yöntem belirtecinin RFC'ye uyduğu anlamına gelir. RFC 2616 § 10.4.1: [400 Hatalı İstek] İstek, hatalı biçimlendirilmiş sözdizimi nedeniyle sunucu tarafından anlaşılamadı. RFC 2616 § 10.4.6 [405 Yöntem izin verilmeyen] yöntem Request-Line belirtilen Request-URI tarafından tanımlanan bir kaynak için izin verilmez. Jeton hiçbir şekilde bir HTTP yöntemi değildir (yukarıdaki RFC 2616 § 5.1.1 alıntısı)get
Xavier Lucas

@XavierLucas: küçük harf yöntemini kullanmak bir sözdizimi hatası değildir, RFC2616 Bölüm 5'e bakın . ABNF'de, yalnızca RFC'de özel olarak listelenen yöntemleri değil, tüm alfasayısal karakterleri ve bazı simgeleri içeren extension-methodsözdizimine tokensahip olun. Hem istemci hem de sunucu, kendi küçük harf yöntemlerinizi tanımlamak da dahil olmak üzere nasıl genişletilebileceğini kabul ettikleri sürece, HTTP'nin hemen hemen her bölümü genişletilebilir. "Get / HTTP / 1.1" istek satırı sözdizimsel olarak iyidir, bu yöntem adındaki RFC'yi büyük / küçük harfe duyarlı olması gerektiğinde ihlal eder.
Yalan Ryan

@LieRyan Bir extension-methodsonraki RFC'lere kapıyı açık bırakmak için burada, RFC'nin kapsamından kendi yöntemlerinizi eklemek ve HTTP / 1.1 uyumlu hizmetler yürütüyormuş gibi yapmak için burada değil. Dolayısıyla 400 döndürülmelidir, çünkü en son RFC'de henüz böyle bir yöntem görünmemiştir, bu yüzden bugün geçersiz bir jeton. Belirteç geçerli yöntem listesi için geçerliyse ve sunucu tarafında uygulanmış ancak izin verilmemişse, 405 döndürülmelidir. Yöntemin geçerli olması ancak sunucu tarafında uygulanmaması durumunda 501 döndürülmelidir.
Xavier Lucas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.