ฉันกำลังโพสต์คำตอบใหม่เพราะฉันพบว่าคำตอบของ zneak ไม่มีตัวอย่างเพียงพอไม่แสดงการจัดการ HTML และ URI เป็นแง่มุมและมาตรฐานที่แตกต่างกันและมีบางสิ่งที่ขาดหายไปเล็กน้อย
คุณมีสองมาตรฐานเกี่ยวกับ URL ในลิงค์ (<a href
)
มาตรฐานแรกคือRFC 1866 (HTML 2.0) ที่อยู่ใน "3.2.1. Data Characters" คุณสามารถอ่านอักขระที่จำเป็นต้องหลีกเลี่ยงเมื่อใช้เป็นค่าสำหรับแอตทริบิวต์ HTML (แอตทริบิวต์เองไม่อนุญาตให้ใช้อักขระพิเศษเลยเช่น<a hr&ef="http://...
ไม่อนุญาตหรือ<a hr&ef="http://...
ไม่ใช่)
หลังจากนี้ได้เข้าสู่มาตรฐานHTML 4ตัวละครที่คุณต้องหลบหนีคือ:
< to <
> to >
& to &
" to "e;
' to '
มาตรฐานอื่นคือRFC 3986 "มาตรฐาน URI ทั่วไป" ซึ่งจัดการ URL (สิ่งนี้เกิดขึ้นเมื่อเบราว์เซอร์กำลังจะติดตามลิงก์เนื่องจากผู้ใช้คลิกที่องค์ประกอบ HTML)
reserved = gen-delims / sub-delims
gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
มันเป็นสิ่งสำคัญที่จะหลีกเลี่ยงตัวละครเหล่านั้นเพื่อให้ลูกค้ารู้ว่าพวกเขาเป็นตัวแทนของข้อมูลหรือตัวคั่น
ตัวอย่างที่ไม่ใช้ Escape:
https://example.com/?user=test&password&te&st&goto=https://google.com
ตัวอย่าง URL ที่สมบูรณ์
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
ตัวอย่าง URL ที่ถูกต้องสมบูรณ์ในค่าของแอตทริบิวต์ HTML:
https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com
สถานการณ์ที่สำคัญเช่นกัน:
Javascript เป็นค่า:
<img src="..." onclick="window.location.href = "https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com";">...</a>
(ใช่;;
ถูกต้อง)
JSON เป็นค่า:
<a href="..." data-analytics="{"event": "click"}">...</a>
สิ่งที่หลบหนีภายในสิ่งที่หลบหนีการเข้ารหัสสองครั้ง URL ภายใน URL ภายในพารามิเตอร์ ฯลฯ ...
http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&password=""123