J'ai mis ce qui suit dans le web.xml de mon application pour tenter de refuser PUT, DELETE, etc.:
<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, alors maintenant:
Si je fais une demande avec la méthode de DELETE
je reçois un 403.
Si je fais une demande avec la méthode de delete
je reçois un 403.
MAIS
Si je fais une demande avec la méthode de DeLeTe
j'obtiens OK!
Comment puis-je faire en sorte qu'ils ne respectent pas la casse?
Edit: je le teste avec un programme 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
est une zone de texte où je tape le nom de la méthode. Lorsqu'il y a un 403, une exception est levée qui est interceptée dans le bloc catch.
Le cache_test.jsp contient:
<%
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
sera insensible à la casse reconnaître et convertir des méthodes HTTP standard en majuscules. De plus, il est documenté comme n'autorisant que les méthodes HTTP standard. La meilleure option consiste à utiliser un flux TCP brut (par exemple dans netcat, ou PuTTY raw, ou telnet, etc.).Réponses:
Indépendamment du comportement incorrect de Tomcat en ce qui concerne la norme HTTP, vous devez utiliser une liste blanche pour autoriser des méthodes spécifiques plutôt qu'une liste noire.
Par exemple, la liste blanche suivante bloquera toutes les méthodes sauf la casse
GET
etHEAD
.(Remarque: nécessite Tomcat 7+. Ceux qui utilisent des versions plus anciennes devront rechercher d'autres solutions, par exemple un filtre de servlet.)
Réf.
la source
<auth-constraint />
et puis il permet tout simplement.http-method-omission
été défini pour la première fois dans Servlet API 3.0, qui est implémenté par Tomcat 7+: tomcat.apache.org/whichversion.html . Malheureusement, cela signifie que cela ne fonctionnera pas dans Tomcat 6 et versions antérieures (remarque: 5 est déjà en fin de vie). Vous pouvez essayer l'autre solution proposée dans la question SO liée qui recommande de définir deuxsecurity-constraint
s distincts - je n'ai pas pu confirmer que l'un fonctionne en 7, donc ne l'incluez pas dans cette réponse.Eh bien, après des tests rapides sur certains serveurs aléatoires détenant la
Server: Apache-Coyotte
signature d'en-tête dans leurs réponses HTTP, il semble que vous avez raison, car l'envoiget / HTTP/1.1\r\nHost: <target_IP>\r\n\r\n
avec une simple connexion netcat a fonctionné à chaque fois alors qu'un code HTTP 400 aurait dû être reçu.Par exemple :
Je dois dire que je suis un peu choqué ici et je ne serais pas surpris de voir ce comportement étendu à toutes les méthodes HTTP / 1.1 dans ce cas.
Vous devez remplir un rapport de bogue sur leur outil de suivi des bogues et envoyer un e-mail à la liste de diffusion appropriée car c'est une vilaine violation de la RFC 2616 (voir ci-dessous) avec de mauvaises conséquences.
la source
get
n'est en aucun cas une méthode HTTP (voir l'extrait de RFC 2616 § 5.1.1 ci-dessus)extension-method
ayez la syntaxetoken
qui inclut tous les caractères alphanumériques et certains symboles, pas seulement les méthodes spécifiquement énumérées dans le RFC. Presque toutes les parties de HTTP sont extensibles, tant que le client et le serveur conviennent de la manière dont ils doivent également être étendus, y compris la définition de vos propres méthodes en minuscules. La ligne de requête "get / HTTP / 1.1" est syntaxiquement correcte, elle viole simplement le RFC dans ce nom de méthode qui doit être sensible à la casse.extension-method
est là pour laisser la porte ouverte aux prochains RFC, ce n'est pas ici pour obtenir vos propres méthodes ajoutées hors de la portée de RFC et prétendre que vous exécutez des services conformes HTTP / 1.1. Donc, un 400 devrait être retourné car aucune méthode de ce type n'est encore apparue dans le dernier RFC, c'est donc aujourd'hui un jeton non valide. Si le jeton était valide concernant la liste de méthodes actuelle et implémenté côté serveur mais non autorisé, un 405 doit être renvoyé. Un 501 doit être retourné si la méthode est valide mais n'est pas implémentée côté serveur.