2013-02-25 23 views
7

Tôi có một TextArea trong Xem gõ mạnh mẽ của tôi định nghĩa vớiMVC Side ảnh hưởng của việc sử dụng [HttpPost, ValidateInput (false)]

@Html.TextAreaFor(x => x.Text) 

Hành động điều khiển của tôi ban đầu có vẻ tương tự như sau:

[HttpPost] 
public ViewResult Index(MyViewModel vm) 
{ 
    using (var db = new MyEntities()) 
    { 
     Post p = new Post(); 
     p.Text = vm.Text; 
     db.Posts.AddObject(p); 
     db.SaveChanges(); 
    } 
    return View(); 
} 

Điều này làm việc tốt. Văn bản mà người dùng nhập vào TextArea được chuyển vào bộ điều khiển và được lưu vào bảng Post trong SQL Server thông qua Entity Framework. Kiểu dữ liệu cho trường này là varchar (1000). (Ngoài ra còn có Xác nhận mẫu trên trường Văn bản bằng cách sử dụng MetadataType với xác thực [StringLength (1000)].)

Tôi nhận thấy rằng nếu tôi cố sao chép một số nguồn HTML và dán vào TextArea và gửi nó, tôi đã nhận được lỗi sau:

"Một giá trị Request.Form nguy hiểm đã được phát hiện từ khách hàng"

các lỗi dẫn tôi đến this question, và lấy đi từ Chính tại đây, tôi chỉ đơn giản có thể thêm

[HttpPost, ValidateInput(false)] 

vào Hành động của tôi để dừng loại xác thực đó. Điều này đã làm việc tuyệt vời, nhưng với sự đoán mò của tôi, bất kể tôi cố gắng đưa vào TextArea, tôi không thể gây ra bất kỳ vấn đề gì. Nếu tôi dán các câu lệnh javascript, html hoặc T-SQL với các ký tự trích dẫn, nó vẫn hoạt động tốt. Tôi thấy các ký tự chính xác mà tôi đã nhập vào TextArea xuất hiện trong bảng SQL và nếu tôi hiển thị văn bản quay lại Chế độ xem, tôi thấy trong nguồn mỗi ký tự được chuyển đổi thành đối tương HTML và màn hình hiển thị trên màn hình giống như nó đã làm khi tôi nhập nó. Tôi đã không làm bất kỳ loại chuyển đổi văn bản để thực hiện điều này. Có vẻ như mặc định mọi thứ đều hoạt động chính xác như tôi muốn. Tất nhiên tôi rất vui vì điều này, nhưng khi tôi đọc về việc vô hiệu hóa xác nhận, nó thường được theo sau với một cảnh báo rằng bạn nên hiểu hậu quả của việc này, và tôi không nghĩ rằng tôi làm. Vì vậy, tôi tự hỏi, hậu quả là gì? Có bất cứ điều gì một người nào đó có thể có thể gõ vào TextArea của tôi mà có thể mess điều lên như là kết quả của vô hiệu hóa xác nhận đầu vào?

Trong trường hợp có liên quan, thiết lập cụ thể của tôi là MVC4, .NET 4.0, Entity Framework 4.4, SQL Server 2012 Express.

Trả lời

9

Nếu bạn đang sử dụng dao cạo bất kỳ văn bản mà bạn đầu ra sẽ tự động được mã hóa sẽ xuất hiện dưới dạng văn bản trong trình duyệt nhưng không được hiểu là javascript, vv

Nếu bạn đang chuyển sang xác nhận ra bạn phải rất cẩn thận để đảm bảo rằng bạn đang mã hóa tất cả đầu vào của người dùng ở bất cứ nơi nào bạn hiển thị nó để bạn không vô tình chạy một số javascript trên trang của mình do người dùng đã nhập (xem XSS cho một số ví dụ).

Bạn có thể kiểm tra nhanh (mặc dù không phải là tìm kiếm toàn diện) bằng cách thêm một số loại cảnh báo javascript ('hello') vào các trường varchar khác nhau trong cơ sở dữ liệu của bạn và xem nó có được gọi khi bạn truy cập trang hay không.

Cũng ngay cả khi bạn không hiển thị dữ liệu người dùng, nó có thể có tác động tùy thuộc vào cách bạn truy cập dữ liệu của mình.

Ngay cả khi bạn sử dụng một cái gì đó như khuôn khổ thực thể, bạn không được bảo vệ khỏi chèn sql chẳng hạn nếu bạn đã sử dụng các thủ tục được lưu trữ và không kiểm tra tính hợp lệ trên đầu vào. Xem số điện thoại article của Troy Hunt trên số

+0

Cảm ơn bạn. Chính xác loại thông tin tôi đang tìm kiếm. – TTT

+0

đã thêm liên kết, thề nó đã làm nó ban đầu! –

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