Bagaimana metode HTTP OPTIONS menentukan metode yang diperbolehkan dalam IIS 8.5?

8

Saya mencari untuk menghapus TRACEmetode dari situs web saya di IIS 8.5 (Windows Server 2012 R2 Datacenter). Saya telah menerapkan ini menggunakan pemfilteran permintaan seperti di bawah ini:

<system.webServer>
  <security>
    <requestFiltering>
      <verbs allowUnlisted="true">
        <add verb="TRACE" allowed="false" />
      </verbs>
    </requestFiltering>
  </security>
</system.webServer>

Ini mencegah TRACEpermintaan, tetapi jika saya mengirim OPTIONSpermintaan, itu masih tercantum TRACEdalam header Allowdan Public. Saya sudah mereset IIS, tetapi tidak bisa TRACEkeluar OPTIONS. Saya tidak ingin menyangkal OPTIONS.

Ini bermasalah karena tampaknya pemindaian kepatuhan kami patuhi dengan menggunakan OPTIONSsebagai indikatornya yang TRACEdiaktifkan. Saya tahu ini tidak benar, tetapi itulah kriteria yang harus saya penuhi.

Apakah ada cara untuk mendapatkan PILIHAN untuk melaporkan metode yang tersedia dengan benar?

alergi
sumber

Jawaban:

6

Pertanyaan menarik. Semua metode untuk menghapus response headersdari IIS sepertinya tidak berfungsi untuk Allowdan Publicheader, OPTIONSpermintaan selalu kembali:

Allow:  OPTIONS, TRACE, GET, HEAD, POST
Public: OPTIONS, TRACE, GET, HEAD, POST

terlepas dari apa server sebenarnya memungkinkan.

Semua permintaan dalam IIS ditangani oleh modul, OPTIONSpermintaan ditangani oleh ProtocolSupportModuleyang tidak penting dan sepertinya cukup bodoh.

Jika kami menghapus modul itu, server tidak menanggapi permintaan Opsi lagi, yang masih ingin Anda dukung, jadi kami harus menggunakan modul lain untuk menjawabnya.

Buka:

%SystemRoot%\System32\inetsrv\config\applicationHost.config

dan cari OPTIONSVerbHandlerkomentar di baris itu dan saat Anda melakukannya, baris di atas ( TRACEVerbHandler) juga. Sekarang tambahkan node baru:

<add name="MyOPTIONSVerbHandler" path="*" verb="OPTIONS" modules="StaticFileModule" requireAccess="None" />

seluruh blok akan terlihat seperti ini:

    <!--  <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" /> 
          <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" /> -->
          <add name="MyOPTIONSVerbHandler" path="*" verb="OPTIONS" modules="StaticFileModule" requireAccess="None" /> 

Sekarang staticFileModule akan memproses OPTIONSpermintaan tetapi tidak akan mengembalikan konten apa pun.

Jika sekarang Anda membuat OPTIONSpermintaan ke server, Anda tidak akan mendapatkan header Allowatau pun tidak Public, Anda dapat menambahkannya dengan mudah di web.config

<system.webServer>
 <httpProtocol>
      <customHeaders>
          <add name="Allow"  value="GET,POST,HEAD" />  
          <add name="Public" value="GET,POST,HEAD" />
      </customHeaders>
  </httpProtocol>        
</system.webServer>

sekarang OPTIONSpermintaan Anda berfungsi seperti yang diminta, tetapi tajuk tambahan itu juga dikirim dengan salah satu GETatau POSTpermintaan yang menurut saya masih berlaku http.

Jika Anda hanya ingin menggunakan header itu untuk OPTIONSpermintaan, Anda bisa menulis modul http sederhana yang menetapkan header ini dan menggunakannya sebagai pengganti StaticFileModule yang saya gunakan di atas.

Peter Hahndorf
sumber
terima kasih atas jawabannya, saya bertanya-tanya apakah penangan PILIHAN perlu diganti, jawaban Anda memberi saya rute untuk menangani ini.
Alergi