2010-01-29 37 views
27

Các RFC 3986 URI: Generic Syntax đặc tả liệt kê một dấu chấm phẩy như một (sub-dấu phân cách) nhân vật bảo lưu:Dấu chấm phẩy được dành riêng cho URL là gì?

reserved = gen-delims/sub-delims 

gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

mục đích dành riêng của là gì ";" của dấu chấm phẩy trong URI? Đối với vấn đề đó, mục đích của các mục tiêu phụ khác là gì (tôi chỉ biết mục đích cho "&", "+" và "=")?

Trả lời

34

Có giải thích ở cuối phần 3.3.

Bên cạnh dot-phân đoạn trong đường dẫn phân cấp, một đoạn đường là coi đục bởi cú pháp chung chung. Các ứng dụng sản xuất URI thường sử dụng các ký tự dành riêng được phép trong phân đoạn để phân tách cụ thể theo sơ đồ hoặc các thành phần phụ dành riêng cho người xử lý đặc biệt . Ví dụ: dấu chấm phẩy (";") và bằng ("=") ký tự dành riêng thường được sử dụng để phân định tham số và tham số giá trị áp dụng cho phân đoạn đó. Ký tự dành riêng cho dấu phẩy (",") là thường được sử dụng cho các mục đích tương tự. Ví dụ: một nhà sản xuất URI có thể sử dụng phân đoạn như "name; v = 1.1" để cho biết tham chiếu đến phiên bản 1.1 của "name", trong khi khác có thể sử dụng phân đoạn như "name, 1.1" cho biết điều tương tự. Các kiểu tham số có thể được xác định theo ngữ nghĩa theo lược đồ cụ thể, nhưng trong hầu hết các trường hợp, cú pháp của tham số cụ thể là thực hiện thuật toán dereferencing của URI .

Nói cách khác, nó được dành riêng để những người muốn có một danh sách được phân định một cái gì đó trong URL có thể yên tâm sử dụng ; như một dấu phân cách ngay cả khi những phần chứa ;, miễn là nội dung được mã hoá phần trăm. Nói cách khác, bạn có thể làm điều này:

foo;bar;baz%3bqux 

và giải thích nó như ba phần: foo, bar, baz;qux. Nếu dấu chấm phẩy không phải là ký tự dành riêng, thì ;%3b sẽ tương đương để URI được hiểu sai là bốn phần: foo, bar, baz, qux.

+3

Tóm lại, được bảo lưu, nhưng không có gì đặc biệt. Chúng tôi sử dụng nó để mã hóa một số thông tin trong các truy vấn RESTful. –

+0

Cảm ơn ví dụ, điều đó thực sự hữu ích. – Nicole

+1

Ai đó có thể chia sẻ một ví dụ về điều này được sử dụng trong các dịch vụ web từ thực tế không? – Winny

4

Section 3.3 covers this - đó là một dấu phân cách đục một ứng dụng URI sản xuất có thể sử dụng nếu thuận tiện:

Bên cạnh dot-phân đoạn trong đường dẫn phân cấp, một đoạn đường là coi đục bởi cú pháp chung chung. Các ứng dụng sản xuất URI thường sử dụng các ký tự dành riêng được phép trong phân đoạn để phân tách cụ thể theo sơ đồ hoặc các thành phần phụ dành riêng cho người xử lý đặc biệt . Ví dụ: dấu chấm phẩy (";") và bằng ("=") ký tự dành riêng thường được sử dụng để thông số phân tách và tham số giá trị áp dụng cho phân khúc đó. Ký tự được đặt trước dấu phẩy (",") là thường được sử dụng cho các mục đích tương tự. Đối với ví dụ , một nhà sản xuất URI có thể sử dụng phân đoạn như "name; v = 1.1" đến cho biết tham chiếu đến phiên bản 1.1 của "name", trong khi một nhà sản xuất khác có thể sử dụng phân đoạn như "name, 1.1" cho biết giống nhau. Các kiểu tham số có thể là được xác định theo ngữ nghĩa của chương trình cụ thể, nhưng trong hầu hết các trường hợp, cú pháp của tham số là cụ thể cho việc thực hiện của thuật toán dereferencing của URI.

7

Mục đích là rõ ràng hơn nếu bạn quay trở lại older versions của đặc tả:

path_segments = segment *("/" segment) 
    segment  = *pchar *(";" param) 

Mỗi đoạn đường nét có thể bao gồm một chuỗi các thông số, chỉ định bởi các dấu chấm phẩy ";" tính cách.

Tôi tin rằng nó có nguồn gốc từ FTP URI s.

4

Có một số quy ước xung quanh việc sử dụng hiện tại của nó thú vị. Những điều này nói đến thời điểm sử dụng dấu chấm phẩy hoặc dấu phẩy. Từ sách "Dịch vụ web RESTful":

Sử dụng ký tự dấu chấm câu để phân tách nhiều phần dữ liệu ở cùng cấp phân cấp. Sử dụng dấu phẩy khi thứ tự của các mục quan trọng, ... Sử dụng dấu chấm phẩy khi thứ tự không quan trọng.

0

Kể từ khi phân khúc đường dẫn 2014 được biết là đóng góp cho Reflected File Download attacks. Giả sử chúng ta có một API dễ bị tổn thương phản ánh bất cứ điều gì chúng tôi gửi cho nó (URL đã được thực rõ ràng, bây giờ cố định):

https://google.com/s?q=rfd%22||calc|| 

{"results":["q", "rfd\"||calc||","I love rfd"]} 

Bây giờ, đây là vô hại trong một trình duyệt như đó là JSON vì vậy nó sẽ không được trả lại nhưng trình duyệt thay vì sẽ cung cấp để tải xuống phản hồi dưới dạng tệp. Bây giờ đây là đoạn đường đến để giúp đỡ (đối với những kẻ tấn công):

https://google.com/s;/setup.bat;?q=rfd%22||calc|| 

Tất cả mọi thứ giữa dấu chấm phẩy (;/setup.bat;) sẽ không gửi đến dịch vụ web, nhưng thay vào đó trình duyệt sẽ giải thích nó như tên tập tin. .. để lưu phản hồi API. Bây giờ, một tập tin gọi là setup.bat sẽ được tải xuống và chạy mà không hỏi về nguy hiểm của việc chạy các tệp được tải xuống từ Internet (vì nó chứa từ "setup" trong tên của nó). Nội dung sẽ được hiểu là tệp lô Windows và lệnh calc.exe sẽ được chạy.

Phòng ngừa:

  • sanitize đầu vào của API của bạn (trong trường hợp này họ chỉ nên cho phép chữ cái và số); thoát là không đủ
  • thêm Content-Disposition: attachment; filename="whatever.txt" vào các API sẽ không được hiển thị; Google đã mất tích phần filename mà thực sự thực hiện cuộc tấn công dễ dàng hơn
  • thêm X-Content-Type-Options: nosniff tiêu đề để ứng phó API
0

tôi thấy việc sử dụng các trường hợp sau đây:

của nhân vật cuối cùng của một thực thể HTML:
https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

Để sử dụng một trong các tham chiếu thực thể ký tự này trong tài liệu HTML hoặc XML , hãy nhập dấu và theo sau y tên tổ chức và một dấu chấm phẩy , ví dụ: & cho ký hiệu và ("&").

Apache Tomcat 7 (hoặc phiên bản mới hơn ?!) chúng nó như path parameter:
https://superevr.com/blog/2011/three-semicolon-vulnerabilities

Apache Tomcat là một ví dụ của một máy chủ web có hỗ trợ "Đường dẫn Parameters". Thông số đường dẫn là nội dung phụ sau tên tệp, được phân tách bằng dấu chấm phẩy. Bất kỳ nội dung tùy ý nào sau khi dấu chấm phẩy thực hiện không ảnh hưởng đến trang đích của trình duyệt web. Điều này có nghĩa là http://example.com/index.jsp;derp sẽ vẫn trả về index.jsp và không phải là một số trang lỗi.

URI chương trình chia tách bởi nó trở thành MIME và dữ liệu:
https://en.wikipedia.org/wiki/Data_URI_scheme

Nó có thể chứa một tham số bộ ký tự tùy chọn, tách ra khỏi phần trước bằng dấu chấm phẩy (;).

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA 
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" /> 

Và có một lỗi trong IIS5 và IIS6 để bỏ qua tập tin hạn chế tải lên:
https://www.owasp.org/index.php/Unrestricted_File_Upload

Extensions file Blacklisting bảo vệ này có thể được bỏ qua bởi: ... bằng cách thêm một ký tự nửa dấu hai chấm sau phần mở rộng bị cấm và trước phần mở rộng được phép (ví dụ: "file.asp; .jpg")

Kết luận:
Không sử dụng dấu chấm phẩy trong URL hoặc họ có thể vô tình tạo ra một thực thể HTML hoặc lược đồ URI.

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