2014-09-02 25 views
33

Tôi có một biểu mẫu được sử dụng để tạo một bản ghi nhớ, để làm điều đó tôi có một trình soạn thảo văn bản phong phú để cung cấp một số kiểu dáng, điều này tạo ra các thẻ html để áp dụng phong cách. khi tôi đăng văn bản đó, mvc sẽ gửi một lỗi để ngăn chặn các tập lệnh tiềm ẩn nguy hiểm, vì vậy tôi phải đặc biệt cho phép nó.ValidateInput (false) vs AllowHtml

tôi đã tìm thấy 2 cách để làm điều đó, trang trí các phương pháp điều khiển với [ValidateInput(false)] hoặc trang trí thuộc tính ViewModel với [AllowHtml]

với tôi, [AllowHtml] trông đẹp hơn nhiều, nhưng tôi đã chỉ được tìm thấy cách tiếp cận được sử dụng 1 lần và [ValidateInput(false)] đường nối là cách được ưu tiên.

vì vậy tôi muốn biết bạn nghĩ gì, tôi nên sử dụng cái nào? sự khác biệt giữa 2 là gì?

tks

Trả lời

83

ValidateInput và AllowHTML được kết nối trực tiếp với XSS vấn đề an ninh.

Vì vậy, trước tiên chúng ta hãy cố gắng hiểu XSS.

XSS (cross-site scripting) là một cuộc tấn công bảo mật nơi kẻ tấn công tiêm mã độc khi thực hiện nhập dữ liệu. Bây giờ tin tốt là XSS được mặc định ngăn chặn trong MVC. Vì vậy, nếu bất kỳ ai cố gắng đăng mã JavaScript hoặc HTML, anh ta sẽ gặp phải lỗi dưới đây.

Enter image description here

Nhưng trong thời gian thực có kịch bản mà HTML đã được cho phép, như biên tập HTML. Vì vậy, đối với những loại kịch bản bạn có thể trang trí hành động của mình với thuộc tính bên dưới.

[ValidateInput(false)] 
public ActionResult PostProduct(Product obj) 
{ 
    return View(obj); 
} 

Nhưng chờ đã, có sự cố ở đây. Vấn đề là chúng tôi đã cho phép HTML trên hành động hoàn chỉnh có thể nguy hiểm. Vì vậy, nếu chúng ta có thể kiểm soát chi tiết hơn về cấp độ trường hoặc thuộc tính thực sự sẽ tạo ra một giải pháp gọn gàng, gọn gàng và chuyên nghiệp.

Đó là nơi AllowHTML hữu ích. Bạn có thể thấy trong đoạn mã dưới đây tôi đã trang trí “AllowHTML” trên cấp thuộc tính của lớp sản phẩm.

public class Product 
{ 
    public string ProductName { get; set; } 
    [AllowHtml] 
    public string ProductDescription { get; set; } 
} 

Vì vậy, tóm tắt "ValidateInput" cho phép tập lệnh và HTML được đăng ở cấp độ hành động trong khi "AllowHTML" ở cấp độ chi tiết hơn.

Tôi khuyên bạn nên sử dụng "AllowHTML" nhiều hơn cho đến khi bạn rất chắc chắn rằng toàn bộ hành động cần phải khỏa thân.

Tôi khuyên bạn nên đọc bài đăng trên blog Preventing XSS Attacks in ASP.NET MVC using ValidateInput and AllowHTML minh họa từng bước về tầm quan trọng của hai thuộc tính này với một ví dụ.

+1

rất vui được gặp bạn ở đây thưa bạn. Rất nhiều bài đăng của bạn hữu ích cho tôi trong dự án mã. –

+1

Trong ví dụ của bạn, nếu người dùng nhập html vào trường 'ProductName', lỗi sẽ vẫn được hiển thị (như mong đợi). Có cách nào để trình bày thông báo lỗi thân thiện với người dùng hơn không. Lỗi này dường như bỏ qua cấu hình Lỗi tùy chỉnh. – philreed

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