Saya telah memasukkan yang berikut ini di web.xml aplikasi saya untuk mencoba melarang PUT, DELETE, dll .:
<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 jadi sekarang:
Jika saya melakukan permintaan dengan metode DELETE
saya mendapatkan kembali 403.
Jika saya melakukan permintaan dengan metode delete
saya mendapatkan kembali 403.
TAPI
Jika saya melakukan permintaan dengan metode DeLeTe
saya mendapatkan OK!
Bagaimana saya bisa membuatnya tidak peka terhadap huruf besar-kecil ini?
Sunting: Saya mengujinya dengan program 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
adalah kotak teks tempat saya mengetik nama metode. Ketika ada 403 pengecualian dilemparkan yang ditangkap di blok tangkap.
Cache_test.jsp berisi:
<%
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
akan mengenali dan mengubah metode HTTP standar menjadi huruf besar secara tidak sensitif . Selain itu, ini didokumentasikan sebagai hanya memungkinkan metode HTTP standar. Pilihan terbaik adalah menggunakan aliran TCP mentah (mis. Dalam netcat, atau PuTTY raw, atau telnet, dll.).Jawaban:
Terlepas dari perilaku Tomcat yang salah terkait dengan standar HTTP, Anda harus menggunakan daftar putih untuk mengizinkan metode tertentu daripada daftar hitam.
Sebagai contoh, daftar putih berikut akan memblokir semua metode kecuali case-sensitive
GET
danHEAD
.(Catatan: memerlukan Tomcat 7+. Mereka yang menggunakan versi yang lebih lama harus menyelidiki solusi lain, misalnya filter servlet.)
Ref
sumber
<auth-constraint />
dan kemudian hanya memungkinkan semuanya.http-method-omission
pertama kali didefinisikan di dalam Servlet API 3.0, yang diimplementasikan oleh Tomcat 7+: tomcat.apache.org/whichversion.html . Sayangnya, ini berarti ini tidak akan berfungsi di Tomcat 6 dan lebih lama (catatan: 5 sudah EOL). Anda dapat mencoba solusi lain yang diusulkan dalam pertanyaan SO tertaut yang merekomendasikan pengaturan duasecurity-constraint
s terpisah - saya tidak dapat mengkonfirmasi bahwa satu berfungsi dalam 7, jadi tidak termasuk dalam jawaban ini.Nah, setelah pengujian cepat atas beberapa server acak yang memegang
Server: Apache-Coyotte
tandatangan header di balasan HTTP mereka, tampaknya Anda benar karena mengirimget / HTTP/1.1\r\nHost: <target_IP>\r\n\r\n
dengan koneksi netcat sederhana berfungsi setiap kali sementara 400 kode HTTP seharusnya diterima.Contohnya :
Saya harus mengatakan saya sedikit terkejut di sini dan saya tidak akan terkejut melihat bahwa perilaku diperluas ke semua metode HTTP / 1.1 dalam kasus seperti itu.
Anda harus mengisi laporan bug pada alat pelacak bug mereka dan mengirim email ke mailing list yang sesuai karena itu adalah satu pelanggaran jelek terhadap RFC 2616 (lihat di bawah) dengan konsekuensi buruk.
sumber
get
bukanlah metode HTTP dengan cara apa pun (lihat kutipan RFC 2616 § 5.1.1 di atas)extension-method
miliki sintaksistoken
yang mencakup semua karakter alfanumerik dan beberapa simbol, bukan hanya metode yang secara khusus tercantum dalam RFC. Hampir setiap bagian dari HTTP dapat diperpanjang, selama klien dan server menyetujui bagaimana ekstensi itu diperluas, termasuk mendefinisikan metode huruf kecil Anda sendiri. Baris permintaan "get / HTTP / 1.1" secara sintaksis baik-baik saja, itu hanya melanggar RFC dalam nama metode yang harus peka huruf besar-kecil.extension-method
sini untuk membiarkan pintu terbuka untuk RFC berikutnya, itu tidak di sini untuk mendapatkan metode Anda sendiri ditambahkan dari ruang lingkup RFC dan berpura-pura bahwa Anda menjalankan layanan yang sesuai dengan HTTP / 1.1. Jadi 400 harus dikembalikan karena belum ada metode yang muncul di RFC terbaru sehingga itu, hari ini, token yang tidak valid. Jika token itu valid mengenai daftar metode saat ini dan diimplementasikan sisi server tetapi tidak diizinkan maka 405 harus dikembalikan. A 501 harus dikembalikan jika metode ini valid tetapi tidak diimplementasikan di sisi server.