Nhận được “Giá trị Request.Path tiềm ẩn nguy hiểm đã được phát hiện từ máy khách (&)”


114

Tôi đã gặp sự cố mã kế thừa yêu cầu tôi hỗ trợ các url ngẫu nhiên như thể chúng là yêu cầu cho trang chủ. Một số URL có các ký tự trong đó tạo ra lỗi "Giá trị Request.Path tiềm ẩn nguy hiểm đã được phát hiện từ máy khách (&)" . Trang web được viết bằng ASP.Net MVC 3 (trong C #) và đang chạy trên IIS 7.5.

Đây là một URL mẫu ...

http://mywebsite.com/Test123/This_&_That

Đây là cách tôi thiết lập lộ trình nhận toàn bộ (tôi có các lộ trình khác để bắt các trang cụ thể) ...

routes.MapRoute(
    "Default", // Route name
    "{garb1}/{garb2}", // URL with parameters
    new { controller = "Website", action = "Home", garb1 = UrlParameter.Optional, garb2 = UrlParameter.Optional } // Parameter defaults
);

Tôi đã thêm những thứ sau vào tệp web.config của mình ...

<configuration>
    <system.web>
        <pages validateRequest="false" />
        <httpRuntime requestValidationMode="2.0" />
    </system.web>
<configuration>

Tôi cũng đã thêm thuộc tính ValidateInput vào hành động sẽ bắt các url ...

public class WebsiteController : Controller
{
    [ValidateInput(false)]
    public ActionResult Home()
    {
        return View();
    }
}

Nhưng tôi vẫn nhận được lỗi. Bất kỳ ý tưởng tại sao? Tôi đã bỏ lỡ điều gì đó? Hiện tại, tôi chỉ đang chạy trên máy chủ nhà phát triển cục bộ của mình (tôi chưa thử các bản sửa lỗi này trong phiên bản sản xuất).


1
Có một cài đặt để cho phép một số ký tự nhất định, tôi sẽ kiểm tra ngay khi quay lại máy tính ...... nhưng bạn có thể mã hóa URL của mình không?
Adam Tuliper - MSFT


Tôi không biết vì lý do gì mà trang web đang cố gắng chuyển hướng nội bộ tạo ra một URL như ' localhost /: // localhost / myWebsiteName ', điều này gây ra lỗi tương tự cho tôi. Tôi không biết tại sao đường dẫn ASP.net lại coi đây là một URL yêu cầu nguy hiểm.
RBT

Trong trường hợp của tôi, tôi đã thiếu một dấu gạch chéo trong URL. Điều đầu tiên cần làm là kiểm tra lỗi đánh máy trong URL.
Kishan Vaishnav

Câu trả lời:


162

Mặc dù bạn có thể thử các cài đặt này trong tệp cấu hình

<system.web>
    <httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" />
    <pages validateRequest="false" />
</system.web>

Tôi sẽ tránh sử dụng các ký tự như '&' trong đường dẫn URL mà thay thế chúng bằng dấu gạch dưới.


13
Có vẻ như requestPathInvalidCharacters = "" đã thực hiện thủ thuật. Cảm ơn. Tôi chắc chắn đồng ý rằng bạn không nên sử dụng & trong đường dẫn, tiếc là chúng tôi đã cho phép nó trong nhiều năm nên chúng tôi cần tiếp tục hỗ trợ nó.
Brian

5
Đó không phải là một vấn đề bảo mật sao?
Marius Stănescu

3
@MariusStanescu - Nó vốn dĩ không phải là một vấn đề bảo mật; nó phụ thuộc vào những gì bạn làm với nó. Nếu đầu vào được lấy và thoát và bao gồm đầu ra thì sẽ ổn. Nếu nó không thoát được, thì bạn có thể sẵn sàng cho một cuộc tấn công.
Justin Helgerson

2
Giải pháp này có thể cung cấp cho bạn lỗi này: Lỗi HTTP 500.19 - Lỗi Máy chủ Nội bộ Không thể truy cập trang được yêu cầu vì dữ liệu cấu hình liên quan cho trang không hợp lệ.
Tom Stickel

2
Tôi cũng nhận được lỗi 500 khi sử dụng câu trả lời này. Điều này là do đã có các thẻ <httpRuntime> và <pages>, do đó có xung đột trùng lặp. Sau khi giải quyết vấn đề đó, câu trả lời này cũng hoạt động tốt đối với tôi.
Kallum Tanton,

5

Tôi đã phải đối mặt với loại lỗi này. để gọi một chức năng từ dao cạo.

public ActionResult EditorAjax(int id, int? jobId, string type = ""){}

giải quyết điều đó bằng cách thay đổi dòng

từ

<a href="/ScreeningQuestion/EditorAjax/5&jobId=2&type=additional" /> 

đến

<a href="/ScreeningQuestion/EditorAjax/?id=5&jobId=2&type=additional" />

route.config của tôi ở đâu

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new string[] { "RPMS.Controllers" } // Parameter defaults
        );

1

Nếu bạn chỉ muốn cho phép thẻ Html cho một số hộp văn bản trong mvc

Bạn có thể làm một điều

trong bộ điều khiển

 [ValidateInput(false)]
public ActionResult CreateNewHtml()  //view
{
    return View();
}
[ValidateInput(false)]
[HttpPost]
public ActionResult CreateNewHtml(cbs obj)//view cbs is database class
{
    repo.AddHtml(obj);
    return View();
}

1
OP nói rõ ràng về các URL mà anh ta cần hỗ trợ (không phải nội dung hộp văn bản) và cũng không đề cập đến HTML - vì vậy câu trả lời của bạn thực sự không áp dụng cho câu hỏi đã cho.
Oliver

2
Nó không áp dụng cho câu hỏi, nhưng tôi đã ủng hộ vì đó là điều tôi không biết là một lựa chọn. Cảm ơn @Pavan
MickJuice

0

Chúng tôi cũng gặp phải lỗi này trong Fiddler khi cố gắng tìm ra lý do tại sao trình xem bản đồ Silverlight ArcGIS của chúng tôi không tải bản đồ. Trong trường hợp của chúng tôi, đó là lỗi đánh máy trong URL trong mã. Có một dấu bằng trong đó vì một số lý do.
http: = // someurltosome / awesome / place
thay vì
http: // someurltosome / awesome / place

Sau khi lấy ra dấu bằng đó, nó hoạt động rất tốt (tất nhiên).


0

Kiểm tra các dòng dưới đây có trong tệp web.config của bạn không

<system.web> <httpRuntime requestPathInvalidCharacters="" /> </system.web>

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.