ValidateRequest = hung false không hoạt động trong Asp.Net 4


156

Tôi có một hình thức mà tôi sử dụng ckeditor. Biểu mẫu này hoạt động tốt ở Asp.Net 2.0 và 3.5 nhưng hiện tại nó không hoạt động trong Asp.Net 4+. Tôi có chỉ thị ValidateRequest = "false". Bất kỳ đề xuất?


Có bài viết ngắn về kết xuất kiểm soát xác thực đúng cách nếu có ai quan tâm: Xác thực lỗi trong .NET 4
Ian

bất cứ ai có thể xin vui lòng cho tôi biết những hạn chế của việc sử dụng ValidationRequest = false là gì?
fc123

Câu trả lời:


194

Tìm thấy giải pháp tại trang lỗi. Chỉ cần thêm requestValidationMode = "2.0"

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

Thông tin MSDN: Thuộc tính httpR.78Section.RequestValidationMode


1
điều đó thật tuyệt vời, nhưng có ai biết cách đặt cái này trên mỗi trang không? Ngoài ra, làm cách nào để đặt cái này vào web.config để nó vẫn hoạt động với .NET 2?
MK.

1
@MK: Tôi không nghĩ có một chỉ thị trang cho cài đặt này. Bạn không thể làm cho nó chạy trên .net 2. Tôi không nghĩ rằng điều đó là cần thiết. Bởi vì bạn chỉ có thể xây dựng một ứng dụng web chỉ nhắm mục tiêu một phiên bản khung. Chỉ cần sao chép dòng này vào .net 4 web.config cần nó ...
HasanG

2
Nhưng điều gì đã thay đổi trong xác nhận cho .net 4? Có cách nào để làm điều đó mà không thay đổi chế độ xác nhận?
Sly

4
@Sly: Bạn có thể tìm thấy câu trả lời ở đây: asp.net/learn/whitepapers/aspnet4/...
HasanG

bất cứ ai có thể xin vui lòng cho tôi biết tại sao trong ứng dụng asp.net 4.0 sử dụng requestValidationMode = "2.0" là một ý tưởng tốt?
fc123

102

Có một cách để biến xác nhận trở lại 2.0 cho một trang. Chỉ cần thêm mã dưới đây vào web.config:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>

Vị trí là bất kỳ đường dẫn nào và dựa trên bất kỳ nút nào bên dưới thư mục bạn chỉ định trong cây.
DFTR

7
Đây là một giải pháp tốt hơn câu trả lời được chấp nhận vì nó không phải là ứng dụng rộng, khá hẹp đối với phạm vi cụ thể mà bạn xác định trong đường dẫn vị trí
Charles Wesley

5
Khai báo <location ..> ở trên nên được đặt bên trong khai báo <configure> nhưng không được lồng thêm nữa.
rbassett

1
Mỗi cài đặt trang dường như không hoạt động đối với các dự án nhắm mục tiêu .NET 4.6.1.
Dennis T --Reinstate Monica--

56

Tôi biết đây là một câu hỏi cũ, nhưng nếu bạn gặp phải vấn đề này trong MVC 3 thì bạn có thể trang trí ActionMethodvới [ValidateInput(false)]và chỉ cần tắt xác thực yêu cầu cho một lần duy nhất ActionMethod, rất tiện lợi. Và bạn không cần thực hiện bất kỳ thay đổi nào đối với web.configtệp, vì vậy bạn vẫn có thể sử dụng xác thực yêu cầu .NET 4 ở mọi nơi khác.

ví dụ

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}

1
@RossCooper cái này chỉ dành cho asp.net MVC
mxmissile 6/2/18

28

Điều này hoạt động mà không thay đổi chế độ xác nhận.

Bạn phải sử dụng một System.Web.Helpers.Validation.Unvalidatedngười trợ giúp từ System.Web.WebPages.dll. Nó sẽ trả về một UnvalidatedRequestValuesđối tượng cho phép truy cập vào biểu mẫu và QueryString mà không cần xác thực.

Ví dụ,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

Hoạt động với tôi cho MVC3 và .NET 4.


1
Bạn có thể vui lòng cung cấp một ví dụ về cách truy xuất queryString bằng phương thức này không? Tôi tiếp tục nhận được 'Unvalidated không phải là thành viên của ...' tất cả các đối tượng tôi cố gắng gắn nó vào. Tôi nghĩ rằng tôi có thể thiếu một bao gồm
CodedMonkey

3
var queryValue = Server.UrlDecode (Request.Unvalidated ("MyQueryKey"));
sfuqua

1
Điều này chắc chắn nên là câu trả lời được chấp nhận. Duy trì bảo mật và cực kỳ linh hoạt vì bạn có thể sử dụng nó trên cơ sở chọn lọc.
cmartin

Đối với Biểu mẫu web, bạn phải thay thế mục nhập trong bộ sưu tập QueryString để tránh lỗi xác thực - xem Giá trị Request.QueryString nguy hiểm tiềm tàng được phát hiện từ máy khách khi gửi đánh dấu html từ trang cuộc gọi jquery đến trang asp.net
Michael Freidgeim

15

Lưu ý rằng một cách tiếp cận khác là tuân thủ hành vi xác thực 4.0, nhưng để xác định lớp của riêng bạn xuất phát từ RequestValidatorvà đặt:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(nơi nào YourNamespace.YourValidatortốt, bạn sẽ có thể đoán ...)

Bằng cách này, bạn giữ được những lợi thế của hành vi 4.0 (cụ thể là việc xác thực xảy ra sớm hơn trong quá trình xử lý), đồng thời cho phép các yêu cầu bạn cần thực hiện, thông qua.


7
Điều này là tốt để biết. Nhưng tôi vẫn nghĩ rằng toàn bộ tính năng xác thực yêu cầu của ASP.Net là sai. Đầu vào không phải là vấn đề, đó là những gì bạn làm với nó. Có thể hoàn toàn hợp lệ khi chấp nhận mã SQL, HTML hoặc mã JavaScript làm đầu vào cho ứng dụng của bạn, miễn là bạn đang mã hóa / thoát nó đúng cách trước khi bạn xuất nó hoặc lưu trữ nó trong cơ sở dữ liệu của bạn.
Jordan Rieger

2
@JordanRieger Tôi đồng ý một phần. OOTB, ít nhất nó có lợi thế là mặc định để bảo mật (không nghĩ mọi thứ thông qua và bạn gặp lỗi, thay vì 0wned), nhưng điều đó hơi phiền toái và hành vi trước 4.0 là hoàn toàn không có gì. Có một cái gì đó về khả năng có một lớp xác nhận được sử dụng trước bất kỳ quá trình xử lý nào khác, như với requestValidationType tùy chỉnh, nhưng rất nhiều xác thực cần được gắn kết hơn với xử lý khác. Trong tất cả, tôi nghĩ rằng sẽ làm nhiều hơn để bảo vệ những người có thói quen xấu khỏi một số (nhưng không phải tất cả) spl0its hơn là để khuyến khích những thói quen tốt.
Jon Hanna
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.