2011-01-27 33 views
11

Tôi có một ứng dụng web dựa trên MVC3 (không có phiên bản beta hoặc ứng viên phát hành, phiên bản RTM/RTW) có hành động chấp nhận các tệp XML để xử lý.Vấn đề với thuộc tính MVC3 AllowHtml

Tất nhiên, điều này dường như là điều ác đối với MVC vì các cuộc tấn công có thể xảy ra, vì vậy nó không cho phép. Vâng, tôi cố gắng đưa một trong hai AllowHtml trên đối tượng mô hình như vậy:

public class XMLModel 
    { 
     [AllowHtml] 
     public string msg { get; set; } 
    } 

Hoặc tôi đặt ValidateInput false về phương pháp hành động của tôi như thế này:

[ValidateInput(false)] 
    public ActionResult AddCDR(XMLModel model) 
    { 
    } 

Lý do cho việc có một "mạnh mẽ "mô hình đã nhập ở vị trí đầu tiên là ban đầu tôi đã cố gắng có một giá trị chuỗi có tên là" msg "làm thông số phương thức hành động, nhưng luôn luôn trở lại trống.

Bây giờ, khi ai đó đăng bài lên biểu mẫu này, trên cùng một máy hoặc từ một máy tính nối mạng, trường thông báo luôn trống.

Tôi đã xác minh với WireShark rằng dữ liệu thực sự có trong yêu cầu.

Bây giờ, một điều thú vị. Điều này không cần thiết với MVC 3. Tuy nhiên, nó tạo ra một sự khác biệt nhỏ.

Nếu tôi thêm này để cấu hình web của tôi:

<httpRuntime requestValidationMode="2.0" /> 

Nó hoạt động cho các yêu cầu có nguồn gốc từ máy tính cục bộ, nhưng nó không hoạt động từ một hệ thống khác.

Tôi nghĩ phiên bản AllowHtml có vẻ thanh lịch - nếu chỉ có nó hoạt động.

Tôi cũng đã phát hiện ra về một lỗi trong RC2 - một lần nữa, điều này sẽ không ảnh hưởng đến tôi, nhưng tôi cố gắng thêm như sau trong Application_Start() anyway:

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); 

Đúng như dự đoán, nó làm cho không có thực Sự khác biệt.

Mọi thứ hoạt động như mong đợi trên máy tính phát triển của tôi (Win7x64, VS2010), nhưng trên hệ thống đích (Win2008R2x64, IIS7.5) các vấn đề trên đang gây khó khăn cho tôi.

Điểm quan trọng cần lưu ý: Nếu tôi đăng lên hành động không có dấu ngoặc nhọn, tôi sẽ nhận được dữ liệu biểu mẫu như mong đợi. Ngay sau khi các dấu ngoặc nhọn hiển thị, hoặc hành động của tôi không được gọi là gì cả, hoặc nó không tìm thấy dữ liệu biểu mẫu, không phải trong các tham số của phương thức hành động hoặc trong ví dụ Request.Params ["msg"] nên là.

Bất kỳ ý tưởng nào để cho phép XML qua?

CẬP NHẬT

Tôi đã cố gắng để làm việc theo cách của tôi xung quanh này trong khi chờ đợi cho bất cứ ai đưa ra một câu trả lời ở đây. Tôi chưa thể giải quyết nó, nhưng tôi đã kiểm tra một vài chi tiết bổ sung;

  • Trước tiên, tôi đã xác minh rằng phiên bản ASP.NET MVC 3 được cài đặt trên cả máy tính phát triển của tôi và trên máy chủ web đều giống nhau; v3.0.20105.0 (theo chương trình Add/Remove).
  • Ứng dụng web thực sự được tạo bằng bản beta MVC3, sau đó được chuyển thành RC1 và RC2 khi chúng xuất hiện và cuối cùng là phiên bản RTM. Điều này có nghĩa là tôi phải sửa đổi một số mã vì thay đổi ViewBag. Tuy nhiên, vì tôi không biết chính xác những gì khác đã thay đổi, tôi đã tạo một ứng dụng MVC3 hoàn toàn mới với phiên bản RTM, tạo một bộ điều khiển bằng cùng tên, với cùng phương thức hành động, lấy một đối tượng mô hình tương tự như đối tượng hiện đang sử dụng , đã đổi tên thư mục ứng dụng web cũ và đặt thư mục mới này tại chỗ. Chính xác điều tương tự xảy ra - tức là tham số với thuộc tính AllowHtml đi kèm với tất cả nội dung khi yêu cầu được tạo từ máy cục bộ, nhưng nếu nó đến từ một máy từ xa thì HTML (XML thực sự) bị loại bỏ.
    • Không có ngoại lệ. Tôi đã cài đặt Elmah và xác minh điều này - không có ngoại lệ xảy ra, phương pháp hành động của tôi dường như chỉ được gọi với bất kỳ thứ gì trông giống như XML bị loại bỏ khỏi các tham số cho phương thức.

Không cần phải nói, điều này làm tôi phát điên. Tôi đã có một số lời khuyên ngày hôm qua để xem mã nguồn của MVC3, nhưng tiếc là điều đó không thực sự giúp tôi, vì tôi không thể thấy bất cứ điều gì rõ ràng là sai ở đó, và tôi không thể gỡ lỗi mã trên máy chủ trong câu hỏi.

Mọi thông tin chi tiết vẫn rất mong muốn, cảm ơn! :)

Trả lời

3

Tôi tự trả lời vì đây là một tình huống không rõ ràng và MVC3 không phải là vấn đề.

Hệ thống đã đăng dữ liệu vào ứng dụng của tôi đang làm như vậy với dữ liệu không đúng định dạng. Thêm vào đó, tôi đã được thông báo rằng họ cũng đang POST cho một ứng dụng MVC2 cũ hơn mà chỉ làm việc tốt - điều này là sai, hóa ra họ đã GETING trong trường hợp đó, và GET chúng xảy ra một cách chính xác.

Nếu có gì, kiểm tra kỹ lưỡng đã xác nhận rằng thuộc tính AllowHtml thực sự hoạt động rất tốt. Không bao giờ tin tưởng đầu vào của bạn, tho. :)

7

Tôi không thể tạo lại điều này.

mẫu:

using System.Web.Mvc; 

namespace MvcApplication3.Models { 
    public class XmlModel { 
     [AllowHtml] 
     public string msg { get; set; } 
    } 
} 

Bộ điều khiển:

using System.Web.Mvc; 
using MvcApplication3.Models; 

namespace MvcApplication3.Controllers { 
    public class HomeController : Controller { 
     public ActionResult Index() { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Index(XmlModel model) { 
      return View(); 
     } 
    } 
} 

Xem:

@model MvcApplication3.Models.XmlModel 

@using (Html.BeginForm()) { 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.msg) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.msg) 
     @Html.ValidationMessageFor(model => model.msg) 
    </div> 
} 

Chúng được thêm vào một trống MVC 3 dự án mặc định. Mọi thứ đều ổn. Khi tôi xóa [AllowHtml], nó sẽ tạo ra thông báo lỗi thích hợp.

+0

Cảm ơn, Brad, được nhiều người đánh giá cao! Tôi đã thực hiện một số tiến bộ về điều này bản thân mình, và hy vọng sẽ xác nhận một giải pháp một thời gian ngày hôm nay. –

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