W pliku web.xml mojej aplikacji umieściłem następujące informacje, aby spróbować zabronić PUT, DELETE itp .:
<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>
Ok, więc teraz:
Jeśli zrobię zapytanie metodą DELETE
, otrzymam z powrotem 403.
Jeśli zrobię zapytanie metodą delete
, otrzymam z powrotem 403.
ALE
Jeśli zrobię zapytanie metodą DeLeTe
, dostanę OK!
Jak mogę sprawić, że nie będzie uwzględniana wielkość liter?
Edycja: Testuję to za pomocą programu 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
to pole tekstowe, w którym wpisuję nazwę metody. Gdy jest 403, generowany jest wyjątek, który zostaje złapany w bloku catch.
Plik cache_test.jsp zawiera:
<%
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());
%>
HttpWebRequest
będzie rozróżniana wielkość liter rozpoznać i konwertować standardowych metod HTTP do wielkich liter. Dodatkowo udokumentowano, że zezwala tylko na standardowe metody HTTP. Najlepszą opcją jest użycie surowego strumienia TCP (np. W netcat, PuTTY raw lub telnet itp.).Odpowiedzi:
Bez względu na nieprawidłowe zachowanie Tomcat w odniesieniu do standardu HTTP, powinieneś używać białej listy, aby zezwolić na określone metody, a nie czarnej listy.
Na przykład poniższa biała lista zablokuje wszystkie metody z wyjątkiem wielkości liter
GET
iHEAD
.(Uwaga: wymaga Tomcat 7+. Osoby używające starszych wersji będą musiały zbadać inne rozwiązania, np. Filtr serwletu).
Nr ref
źródło
<auth-constraint />
a następnie po prostu pozwala na wszystko.http-method-omission
został po raz pierwszy zdefiniowany w Servlet API 3.0, który jest implementowany przez Tomcat 7+: tomcat.apache.org/whichversion.html . Niestety oznacza to, że nie będzie to działać w Tomcat 6 i starszych (uwaga: 5 to już EOL). Możesz wypróbować inne proponowane rozwiązanie w połączonym pytaniu SO, które zaleca ustawienie dwóch oddzielnychsecurity-constraint
s - nie mogłem potwierdzić, że jedno działa na 7, więc nie uwzględniłem go w tej odpowiedzi.Cóż, po szybkich testach na losowych serwerach, które mają
Server: Apache-Coyotte
podpis nagłówka w swoich odpowiedziach HTTP, wydaje się, że masz rację, ponieważ wysyłanieget / HTTP/1.1\r\nHost: <target_IP>\r\n\r\n
za pomocą prostego połączenia netcat działało za każdym razem, gdy powinien otrzymać kod HTTP 400.Na przykład :
Muszę powiedzieć, że jestem tu trochę zszokowany i nie zdziwiłbym się, gdyby w takim przypadku zachowanie objęło wszystkie metody HTTP / 1.1.
Powinieneś wypełnić raport o błędzie w narzędziu do śledzenia błędów i wysłać wiadomość na odpowiednią listę mailingową, ponieważ jest to jedno brzydkie naruszenie RFC 2616 (patrz poniżej) ze złymi konsekwencjami.
źródło
get
extension-method
składni,token
która zawiera wszystkie znaki alfanumeryczne i niektóre symbole, a nie tylko metody wyszczególnione w RFC. Niemal każda część HTTP jest rozszerzalna, pod warunkiem, że zarówno klient, jak i serwer uzgodnią, w jaki sposób należy je rozszerzyć, w tym zdefiniować własne metody małych liter. Wiersz żądania „get / HTTP / 1.1” jest poprawny pod względem składniowym, po prostu narusza RFC, ponieważ w nazwie metody powinna być rozróżniana wielkość liter.extension-method
Jest tutaj, aby zostawić otwarte drzwi dla następnych RFC, nie ma tutaj dodawać własnych metod poza zasięgiem RFC i udawać, że korzystasz z usług zgodnych z HTTP / 1.1. Tak więc należy zwrócić 400, ponieważ w najnowszej wersji RFC nie pojawiła się jeszcze żadna taka metoda, dlatego jest to dzisiaj nieprawidłowy token. Jeśli token był poprawny w odniesieniu do bieżącej listy metod i został wdrożony po stronie serwera, ale został niedozwolony, wówczas należy zwrócić 405. 501 powinno zostać zwrócone, jeśli metoda jest poprawna, ale nie została zaimplementowana po stronie serwera.