Giá trị Request.Path nguy hiểm tiềm tàng được phát hiện từ máy khách (*)


218

Tôi nhận được lỗi khá tự giải thích:

Giá trị Request.Path nguy hiểm tiềm tàng đã được phát hiện từ máy khách (*).

Vấn đề là do *trong URL yêu cầu:

https://stackoverflow.com/Search/test*/0/1/10/1

Url này được sử dụng để điền vào trang tìm kiếm trong đó 'test *' là thuật ngữ tìm kiếm và phần còn lại của url liên quan đến nhiều bộ lọc khác.

Có cách nào dễ dàng để cho phép các ký tự đặc biệt này trong URL không? Tôi đã cố gắng sửa đổi web.config, vô ích.

Tôi có nên tự mã hóa / giải mã các ký tự đặc biệt không? Hoặc có một cách thực hành tốt nhất để làm điều này, tôi muốn tránh sử dụng các chuỗi truy vấn. - nhưng nó có thể là một lựa chọn.

Bản thân ứng dụng này là một c# asp.netứng dụng webforms sử dụng định tuyến để tạo ra URL đẹp ở trên.


1
Trang của bạn có ValidateRequest=falseở trên cùng không?
Neil Knight

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

Câu trả lời:


97

*tự không được phép trong đường dẫn của URL, nhưng không có vấn đề gì khi sử dụng nó trong chuỗi truy vấn:

http://localhost:3286/Search/?q=test*

Đây không phải là vấn đề mã hóa, *ký tự không có ý nghĩa đặc biệt trong một URL, vì vậy việc URL của bạn có mã hóa hay không là không quan trọng. Bạn sẽ cần mã hóa nó bằng một lược đồ khác, và sau đó giải mã nó.

Ví dụ: sử dụng một ký tự tùy ý làm ký tự thoát:

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");

Và giải mã:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");

15
Trò chơi "xxx" "xxy" "xyy" khá thông minh. Bạn có thể muốn giải thích logic đằng sau đó để không gây nhầm lẫn cho độc giả.
SimpleVar

2
Yêu cầu là sử dụng nó trong PATHvà không phải trong chuỗi truy vấn.
Hugo Delsing

Tôi đã chạy vào cùng một kịch bản trong đó một trong các tham số của tôi là một URL. Ngay cả khi URL được mã hóa chính xác, tôi sẽ gặp lỗi này. Cuối cùng tôi chỉ mã hóa base64 (và giải mã trong api của tôi) dễ dàng hơn nhiều so với cố gắng tìm hiểu chuyện gì đang xảy ra. Có lẽ là một lựa chọn tốt hơn mà thực hiện thói quen thay thế của riêng bạn là tốt.
SpokaneDJ

1
Bạn không thể sử dụng aa<=> aab<=> *như một sơ đồ mã hóa đơn giản hơn?
Những từ như Jared

Bây giờ điều này đã cứu tôi, Cảm ơn, nhưng trong thời điểm thích hợp tôi muốn kiểm tra lời khuyên này: stackoverflow.com/a/603962/1830909 và tôi sẽ rất vui nếu nghe được suy nghĩ của bạn.
QMaster

316

Nếu bạn đang sử dụng .NET 4.0, bạn có thể cho phép các url này thông qua web.config

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

Lưu ý, tôi vừa xóa dấu hoa thị (*), chuỗi mặc định ban đầu là:

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

Xem câu hỏi này để biết thêm chi tiết.


5
Có cách nào để thực hiện việc này bằng cách sử dụng thuộc tính mvc trên một hành động để tôi không phải tắt tính năng này cho toàn bộ ứng dụng không? Tương tự như câu trả lời này tại đây: stackoverflow.com/a/1540976/298758
longda

4
@longda: Có lẽ hãy thử gói nó bằng phần tử <location path = "my / path"> cho url bạn cần. Sử dụng sự phản chiếu sẽ đơn giản một cách hợp lý từ góc độ toàn cầu, nhưng tôi không chắc chắn về việc đặt nó trên cơ sở mỗi bộ điều khiển / hành động. Có lẽ bắt đầu một câu hỏi?
Dave Transom

Nó chỉ không hoạt động trên dự án ASP.net MVC, nhận quá trình chạy để xác định bố cục trong viewStart đã gặp lỗi này: Nhân vật bất hợp pháp trong đường dẫn.
QMaster

7

Đối với tôi, tôi đang làm việc trên .net 4.5.2 với web api 2.0, tôi có cùng một lỗi, tôi đã đặt nó chỉ bằng cách thêm requestPathInvalidChar character = "" trong requestPathInvalidChar character bạn phải đặt các ký tự không được phép mà bạn phải xóa các ký tự khác. gây ra vấn đề này

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>

** Lưu ý rằng đó không phải là một thực tiễn tốt, có thể là một bài đăng có tham số này vì thuộc tính của một đối tượng là tốt hơn hoặc cố gắng mã hóa ký tự đặc biệt. - Sau khi tìm kiếm trên thực tiễn tốt nhất để thiết kế api nghỉ ngơi, tôi thấy rằng trong tìm kiếm, sắp xếp và phân trang, chúng tôi phải xử lý tham số truy vấn như thế này

/companies?search=Digital%26Mckinsey

và điều này giải quyết vấn đề khi chúng tôi mã hóa và đặt lại nó trên url theo% 26 bằng mọi cách, trên máy chủ, chúng tôi nhận được tham số chính xác Digital & Mckinsey

liên kết này có thể giúp thực hành tốt nhất về thiết kế phần còn lại của web api https://hackernoon.com/restful-api-designing-guferences-the-best-practices-60e1d954e7c9


6

Bạn nên mã hóa giá trị tuyến đường và sau đó (nếu cần) giải mã giá trị trước khi tìm kiếm.


Cám ơn phản hồi của bạn. Bạn có nghĩa là effectivley thực hiện thay thế trên các mục như * và sau đó thay thế chúng trở lại khi bạn đang đọc nó?

Bạn có thể hiển thị một ví dụ mã về mã hóa và giải mã các giá trị?
Ciaran Gallagher

1

Đối với tôi, khi gõ url, người dùng vô tình sử dụng a / thay vì a? để bắt đầu các tham số truy vấn

ví dụ:

url.com/endpoint/parameter=SomeValue&therparameter=Anther+value

lẽ ra phải là:

url.com/endpoint?parameter=SomeValue&therparameter=Anther+value


Có, thậm chí tương tự đối với tôi url.com/endpoint¶meter=SomeValue&otherparameter=AnotherValue
Bhargav Konda

0

Ngoại lệ này xảy ra trong ứng dụng của tôi và khá sai lệch.

Nó đã bị ném khi tôi đang gọi một phương thức Web trang .aspx bằng cách gọi phương thức ajax, truyền một đối tượng mảng JSON. Chữ ký phương thức Trang Web chứa một mảng của một đối tượng .NET được gõ mạnh, OrderDetails. Thuộc tính Actual_Qty được định nghĩa là int và đối tượng JSON Thuộc tính Actual_Qty chứa "4" (ký tự khoảng trắng thừa). Sau khi loại bỏ không gian thừa, việc chuyển đổi đã được thực hiện, phương thức Trang web đã được thực hiện thành công bằng lệnh gọi ajax.


0

Cố gắng đặt máy chủ của dự án web là IIS cục bộ nếu đó là IIS Express. Hãy chắc chắn nếu url dự án là đúng và tạo thư mục virus.


0

Khi giao dịch với Bộ định vị tài nguyên đồng nhất (URL) có các tiêu chuẩn cú pháp nhất định , trong tình huống cụ thể này, chúng tôi đang xử lý các ký tự dành riêng .

Theo RFC 3986 , các ký tự dành riêng có thể (hoặc có thể) không được định nghĩa là các dấu phân cách theo cú pháp chung, theo từng cú pháp cụ thể của lược đồ hoặc theo cú pháp cụ thể thực hiện của thuật toán hội thảo của URI; Và dấu hoa thị (*) là một nhân vật dành riêng.

Cách thực hành tốt nhất là sử dụng các ký tự không được giám sát trong các URL hoặc bạn có thể thử mã hóa nó.

Tiếp tục đào:


1
Lỗi này cũng xảy ra nếu ký tự dành riêng trong URL được mã hóa theo phần trăm, ví dụ, %25thay vì %, vì vậy IIS có thể trả về lỗi này cho một URL hoàn toàn hợp lệ.
Mùa đông
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.