Tôi đang đăng một câu trả lời mới vì tôi thấy câu trả lời của zneak không có đủ ví dụ, không hiển thị xử lý HTML và URI như các khía cạnh và tiêu chuẩn khác nhau và còn thiếu một số điều nhỏ.
Bạn có hai tiêu chuẩn liên quan đến URL trong liên kết ( <a href
).
Tiêu chuẩn đầu tiên là RFC 1866 (HTML 2.0) trong "3.2.1. Ký tự dữ liệu", bạn có thể đọc các ký tự cần thoát khi được sử dụng làm giá trị cho thuộc tính HTML. (Bản thân các thuộc tính không cho phép các ký tự đặc biệt, ví dụ: <a hr&ef="http://...
không được phép, cũng không <a hr&ef="http://...
.)
Sau này, điều này đã đi vào tiêu chuẩn HTML 4 , các ký tự bạn cần thoát là:
< to <
> to >
& to &
" to "e;
' to '
Tiêu chuẩn khác là RFC 3986 "Tiêu chuẩn URI chung", trong đó các URL được xử lý (điều này xảy ra khi trình duyệt sắp theo một liên kết vì người dùng đã nhấp vào phần tử HTML).
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Điều quan trọng là phải thoát các ký tự đó để khách hàng biết rằng họ đại diện cho dữ liệu hoặc dấu phân cách.
Ví dụ không được giải thoát:
https://example.com/?user=test&password&te&st&goto=https://google.com
Ví dụ, URL hoàn toàn hợp pháp
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Ví dụ URL hoàn toàn hợp pháp về giá trị của thuộc tính HTML:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
Các kịch bản quan trọng:
Javascript là một giá trị:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(Vâng, ;;
là chính xác.)
JSON là một giá trị:
<a href="..." data-analytics="{"event": "click"}">...</a>
Những thứ đã thoát bên trong những thứ đã thoát, mã hóa kép, URL bên trong URL bên trong paramter, v.v.
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123