Phương thức HTTP OPTION xác định các phương thức được phép trong IIS 8.5 như thế nào?


8

Tôi đang tìm cách xóa TRACEphương thức khỏi trang web của mình trong IIS 8.5 (Trung tâm dữ liệu Windows Server 2012 R2). Tôi đã thực hiện điều này bằng cách sử dụng lọc yêu cầu như dưới đây:

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

Điều này ngăn TRACEcác yêu cầu, nhưng nếu tôi gửi một OPTIONSyêu cầu, nó vẫn liệt kê ra TRACEtrong AllowPubliccác tiêu đề. Tôi đã thiết lập lại IIS, nhưng không thể TRACEthoát ra được OPTIONS. Tôi không muốn từ chối OPTIONS.

Đây là vấn đề vì có vẻ như quét tuân thủ mà chúng tôi tuân thủ bằng cách sử dụng OPTIONSlàm chỉ báo TRACEđược bật. Tôi biết điều này không đúng, nhưng đó là tiêu chí tôi phải đáp ứng.

Có cách nào để TÙY CHỌN báo cáo các phương thức khả dụng một cách chính xác không?

Câu trả lời:


6

Câu hỏi thú vị. Tất cả các phương thức để loại bỏ response headerskhỏi IIS dường như không hoạt động đối với các tiêu đề AllowPublictiêu đề, một OPTIONSyêu cầu luôn trả về:

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

bất kể những gì máy chủ thực sự cho phép.

Tất cả các yêu cầu trong IIS được xử lý bởi các mô-đun, các OPTIONSyêu cầu được xử lý bởi những ProtocolSupportModuleđiều không cần thiết và vì nó có vẻ khá ngu ngốc.

Nếu chúng tôi xóa mô-đun đó, máy chủ sẽ không phản hồi yêu cầu Tùy chọn nữa mà bạn vẫn muốn hỗ trợ, vì vậy chúng tôi phải sử dụng mô-đun khác để trả lời các mô-đun đó.

Mở:

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

và tìm kiếm OPTIONSVerbHandlerbình luận dòng đó và trong khi bạn đang ở đó, một trong những ở trên ( TRACEVerbHandler) là tốt. Bây giờ thêm một nút mới:

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

toàn bộ khối sẽ trông như thế này:

    <!--  <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" /> 

Bây giờ staticFileModule sẽ xử lý các OPTIONSyêu cầu nhưng nó sẽ không trả về bất kỳ nội dung nào.

Nếu bây giờ bạn thực hiện một OPTIONSyêu cầu đến máy chủ, bạn sẽ không nhận được một Allowhay một Publictiêu đề, bạn có thể thêm chúng một cách dễ dàng trong web.config

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

bây giờ các OPTIONSyêu cầu của bạn hoạt động theo yêu cầu, nhưng những tiêu đề bổ sung đó cũng được gửi với bất kỳ GEThoặc POSTyêu cầu nào mà tôi nghĩ vẫn là http hợp lệ.

Nếu bạn chỉ muốn sử dụng các tiêu đề đó cho OPTIONScác yêu cầu, bạn có thể viết mô-đun http đơn giản để đặt các tiêu đề này và sử dụng nó thay vì TĩnhFileModule tôi đã sử dụng ở trên.


cảm ơn vì câu trả lời, tôi đã tự hỏi nếu trình xử lý TÙY CHỌN cần thay thế, câu trả lời của bạn cho tôi một lộ trình để xử lý việc này.
dị ứng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.