2013-05-10 35 views
35

Tôi đang cố gắng thêm tiêu đề Tùy chọn X-Frame (với giá trị được đặt thành "DENY") vào ứng dụng MVC 4 của tôi. Tôi nhìn xung quanh và có vẻ như this là cách sạch nhất để thêm cho tất cả các trang.Thêm tiêu đề X-Frame-Options vào tất cả các trang trong ứng dụng MVC 4

Tuy nhiên, khi tôi thêm mã này, mã sẽ không được tạo. Có lỗi trên OnResultExecuting của

"không tìm thấy phương pháp phù hợp để ghi đè".

public class XframeOptions : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(
      System.Web.Mvc.ResultExecutingContext filterContext) 
    { 
     filterContext.HttpContext.Response.AddHeader(
      "X-Frame-Options", "DENY"); 
    } 
} 

Nếu đây là cách sạch nhất để làm điều này như thế nào tôi có thể giải quyết lỗi này? Có cách nào tốt hơn để xử lý điều này trong một ứng dụng MVC 4?

+0

Điều này phù hợp với tôi, nhưng việc đặt thuộc tính trong không hoạt động. Đây không phải là lần đầu tiên tôi có cài đặt trong system.webServer dường như bị bỏ qua. Tại sao điều này lại là? – Gullbyrd

Trả lời

13

Hãy chắc chắn rằng bạn kế thừa từ correct class:

public class XframeOptions : System.Web.Mvc.ActionFilterAttribute 

Trong ASP.NET MVC 4 có API Web trong đó có không gian tên khác nhau và kể từ khi bạn đã không được xác định một cách rõ ràng không gian tên tôi đoán rằng trình biên dịch được chọn lớp sai:

System.Web.Http.Filters.ActionFilterAttribute 
+0

Rất cám ơn một lần nữa, đó là nó. – Xaxum

2

bạn đang nhận được lỗi này vì bạn đang sử dụng tên phương pháp sai thay vì OnResultExecuting sử dụng OnResultExecuted. Bạn nên viết phương pháp như sau:

public class XframeOptionsFilter : System.Web.Mvc.ActionFilterAttribute 
{ 
    public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext) 
    { 
     filterContext.HttpContext.Response.AddHeader("x-frame-options", "Deny"); 
    } 
} 
5

Có một cách khác để thực hiện điều đó. tạo ra một tùy chỉnh HttpModule như dưới đây:

public class XframeOptionsModule : IHttpModule 
{ 
    public void Dispose() 
    { 

    } 

    public void Init(HttpApplication context) 
    { 
     context.PreSendRequestHeaders += this.OnPreSendRequestHeaders; 
    } 
    private void OnPreSendRequestHeaders(object sender, EventArgs e) 
    { 
     HttpContext.Current.Response.AddHeader("x-frame-options", "Deny"); 
    } 
} 

sau đó đăng ký mô-đun này trong web.config

<modules > 
     <add name ="XframeOptions" type="your module's full type info"/> 
    </modules> 
103

Không cần cho một phong tục HttpModule hoặc ActionFilter nếu bạn cần nó cho mỗi trang. https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options chi tiết một giải pháp đơn giản hơn nhiều:

Để cấu hình IIS để gửi X-Frame-Options tiêu đề, thêm file Web.config này của trang web của bạn:

<system.webServer> 
    ... 

    <httpProtocol> 
    <customHeaders> 
     <add name="X-Frame-Options" value="SAMEORIGIN" /> 
    </customHeaders> 
    </httpProtocol> 

    ... 
</system.webServer> 
+0

Đây là câu trả lời phù hợp hơn. Không cần mã chỉ cần cấu hình – Alao

+1

Đây là giải pháp tốt nhất. –

+1

Xin chào, tôi vừa thêm mã vào tệp nguồn web.config của tôi. Nhưng sau khi chạy chương trình, tôi không thể thấy X-Frame-Options trên công cụ kiểm tra Chrome. Tôi đã bỏ lỡ một cái gì đó? – user754952

0

Để thêm từ chối "x-frame-options" tiêu đề cho tất cả các ứng dụng MVC bạn có thể làm như sau để tránh một cuộc tấn công Clickjacking.

using System; 
using System.Web; 

namespace Demo.Website.Modules 
{ 
    public class XfoHeaderModule : IHttpModule 
    { 
     public void Init(HttpApplication context) 
     { 
      context.PreSendRequestHeaders += ContextPreSendRequestHeaders; 
     } 

     public void Dispose() 
     { 
     } 

     private void ContextPreSendRequestHeaders(object sender, EventArgs e) 
     { 
      HttpContext.Current.Response.Headers.Add("X-Frame-Options", "Deny"); 
     } 
    } 
} 

Thêm bên dưới để web.config

<system.webServer> 
    <modules> 
     <add name="XfoHeader" type="Demo.Website.Modules.XfoHeaderModule" /> 
    </modules> 
    </system.webServer> 

enter image description here

+2

Tốt nhất nên tránh xa sự kiện PreSendRequestHeaders vì nó đã không được chấp nhận. Xem: http: //www.asp.net/aspnet/overview/web-development-best-practices/what-not-to-do-in-aspnet,-and-what-to-do-instead#presend – klings

+1

Của bạn phản hồi trong ảnh chụp màn hình của bạn có 2 tiêu đề X-Frame-Options. [Điều này sẽ không hợp lệ] (https://tools.ietf.org/html/rfc7034#section-2) – Liam

0

NWebsec cho phép bạn thiết lập này và các tiêu đề an ninh khác thông qua web.config, OWIN middleware, và/hoặc các thuộc tính lọc MVC : https://github.com/NWebsec/NWebsec/wiki

Tuyên bố từ chối trách nhiệm: Tôi là người duy trì dự án.

+0

Nhưng chuẩn .Net * cho phép bạn đặt tiêu đề bảo mật này và thông qua web.config * ...? – Liam

Các vấn đề liên quan