Ich habe Folgendes in die web.xml meiner Anwendung eingefügt, um zu versuchen, PUT, DELETE usw. Nicht zuzulassen:
<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, also jetzt:
Wenn ich eine Anfrage mit der Methode von mache, DELETE
bekomme ich eine 403 zurück.
Wenn ich eine Anfrage mit der Methode von mache, delete
bekomme ich eine 403 zurück.
ABER
Wenn ich eine Anfrage mit der Methode von mache, DeLeTe
bekomme ich OK!
Wie kann ich dafür sorgen, dass diese Groß- und Kleinschreibung nicht berücksichtigt wird?
Bearbeiten: Ich teste es mit einem C # -Programm:
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
ist ein Textfeld, in das ich den Methodennamen eingebe. Wenn es eine 403 gibt, wird eine Ausnahme ausgelöst, die im catch-Block abgefangen wird.
Die Datei cache_test.jsp enthält:
<%
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
wird case-insensitiv erkennen und konvertieren Standard - HTTP - Methoden in Großbuchstaben. Darüber hinaus wird dokumentiert, dass nur Standard-HTTP-Methoden zulässig sind. Die beste Option ist die Verwendung eines unformatierten TCP-Streams (z. B. in Netcat, PuTTY Raw oder Telnet usw.).Antworten:
Unabhängig von Tomcats falschem Verhalten in Bezug auf den HTTP-Standard sollten Sie eine Whitelist verwenden, um bestimmte Methoden anstelle einer Blacklist zuzulassen.
Die folgende Whitelist blockiert beispielsweise alle Methoden mit Ausnahme der Groß- und Kleinschreibung
GET
undHEAD
.(Hinweis: erfordert Tomcat 7+. Wer ältere Versionen verwendet, muss andere Lösungen untersuchen, z. B. einen Servlet-Filter.)
Ref
quelle
<auth-constraint />
und dann erlaubt es einfach alles.http-method-omission
wurde erstmals in der Servlet-API 3.0 definiert, die von Tomcat 7+ implementiert wird: tomcat.apache.org/whichversion.html . Leider bedeutet dies, dass dies in Tomcat 6 und älter nicht funktioniert (Hinweis: 5 ist bereits EOL). Sie können die andere vorgeschlagene Lösung in der verknüpften SO-Frage ausprobieren, in der empfohlen wird, zwei separatesecurity-constraint
s festzulegen. Ich konnte nicht bestätigen, dass eines in 7 funktioniert, habe es also nicht in diese Antwort aufgenommen.Nun, nach einem kurzen Test über einige zufällige Server,
Server: Apache-Coyotte
deren HTTP-Antwortenget / HTTP/1.1\r\nHost: <target_IP>\r\n\r\n
eine Headersignatur enthalten , scheint es richtig zu sein, dass das Senden mit einer einfachen Netcat-Verbindung jedes Mal funktioniert, wenn ein 400-HTTP-Code hätte empfangen werden sollen.Zum Beispiel :
Ich muss sagen, dass ich hier ein bisschen schockiert bin und ich wäre nicht überrascht zu sehen, dass sich dieses Verhalten in diesem Fall auf alle HTTP / 1.1-Methoden erstreckt.
Sie sollten einen Fehlerbericht über das Fehlerverfolgungstool ausfüllen und eine E-Mail an die entsprechende Mailingliste senden, da dies eine hässliche Verletzung von RFC 2616 (siehe unten) mit schwerwiegenden Folgen ist.
quelle
get
ist in keiner Weise eine HTTP- Methode (siehe den Auszug aus RFC 2616 § 5.1.1 oben)extension-method
eine Syntax,token
die alle alphanumerischen Zeichen und einige Symbole enthält, nicht nur die im RFC speziell aufgeführten Methoden. Fast jeder Teil von HTTP ist erweiterbar, sofern sowohl Client als auch Server übereinstimmen, wie sie zu erweitert werden, einschließlich der Definition Ihrer eigenen Kleinbuchstabenmethoden. Die Anforderungszeile "get / HTTP / 1.1" ist syntaktisch in Ordnung. Sie verstößt nur gegen den RFC, da der Methodenname zwischen Groß- und Kleinschreibung unterscheiden sollte.extension-method
ist hier, um die Tür für die nächsten RFCs offen zu lassen. Dies ist nicht hier, um Ihre eigenen Methoden aus dem RFC-Bereich hinzuzufügen und so zu tun, als würden Sie HTTP / 1.1-kompatible Dienste ausführen. Daher sollte eine 400 zurückgegeben werden, da in der neuesten RFC noch keine solche Methode aufgetaucht ist. Dies ist heute ein ungültiges Token. Wenn das Token in Bezug auf die aktuelle Methodenliste gültig und serverseitig implementiert, aber nicht zulässig war, sollte ein 405 zurückgegeben werden. Ein 501 sollte zurückgegeben werden, falls die Methode gültig, aber nicht serverseitig implementiert ist.