ฉันใส่สิ่งต่อไปนี้ใน 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 กลับ
แต่
ถ้าฉันทำตามคำขอด้วยวิธีการของDeLeTe
ฉันได้ตกลง!
ฉันจะทำให้มันไม่อนุญาตให้ใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ได้อย่างไร
แก้ไข: ฉันทดสอบด้วยโปรแกรม 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 ข้อยกเว้นจะถูกโยนทิ้งซึ่งติดอยู่ในบล็อก catch
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());
%>
HttpWebRequest
จะคำนึงถึงขนาดตัวพิมพ์ และการแปลงเมธอด HTTP มาตรฐานเป็นตัวพิมพ์ใหญ่ นอกจากนี้ยังมีการบันทึกไว้ว่าอนุญาตให้ใช้เมธอด HTTP มาตรฐานเท่านั้น ตัวเลือกที่ดีที่สุดคือการใช้สตรีม TCP ดิบ (เช่นใน netcat หรือ PuTTY raw หรือ telnet เป็นต้น)