2012-04-17 24 views
10

Điều gì sẽ được thực hiện đối với nội dung thuộc tính href: HTML hoặc mã hóa URL?cách mã hóa thuộc tính href trong HTML

<a href="???">link text</a> 

Một mặt, vì thuộc tính href chứa URL nên sử dụng mã hóa URL. Mặt khác, tôi chèn URL này vào HTML, vì vậy nó phải được mã hóa HTML.

Hãy giúp tôi khắc phục sự mâu thuẫn này.

Cảm ơn.


EDIT:

Đây là mâu thuẫn. Giả sử có thể có các ký tự '<' và '>' trong URL. Mã hóa URL sẽ không thoát khỏi chúng, vì vậy sẽ có các ký tự HTML được đặt trước bên trong thuộc tính href, vi phạm tiêu chuẩn. Mã hóa HTML sẽ xóa ký tự '<' và '>' và HTML sẽ hợp lệ, nhưng sau đó sẽ có các ký tự '&' không mong đợi trong URL (đây là ký tự dành riêng cho URL, ký tự này được sử dụng làm dấu phân tách tham số chuỗi truy vấn) .

Reserved URL characters tạo thành một siêu của reserved HTML characters ngoại trừ '<' và '>' được dành riêng cho HTML nhưng không dành cho URL.


EDIT 2:

tôi đã sai về '<' và '>' nhân vật, họ thực sự là phần trăm bỏ trốn bằng cách mã hóa URL. Nếu vậy, mã hóa URL là đủ trong trường hợp này, phải không?

+1

Các bạn đã thử bất cứ điều gì cho đến nay? –

+2

Điều này "bạn đã thử bất cứ điều gì" meme là nhận được ngớ ngẩn. Điều gì với trình duyệt phục hồi lỗi, một phần lớn của mã hóa dữ liệu là để bảo vệ chống lại các vấn đề an ninh. Làm thế nào bạn có thể nói cho bạn biết nó đã đúng nếu bạn đang cố gắng một cái gì đó? Giả sử rằng bất kỳ bộ kiểm tra bảo mật nào bạn có đủ vùng phủ sóng? Đây là một câu hỏi hoàn toàn hợp lý về một kỹ thuật cơ bản. – Quentin

+0

Quentin ít nhiều đúng, nhưng câu hỏi vẫn còn, tình huống nào có thể mâu thuẫn? Bạn có thể cho thấy một ví dụ? Và bạn đã thử cả hai giải pháp và cả hai đều làm việc, hoặc cả hai đều không hoạt động? –

Trả lời

10

Tạo URL như bình thường. Thực hiện theo các quy tắc để xây dựng URL. Mã hóa dữ liệu bạn đưa vào đó.

Sau đó, tạo HTML như bình thường. Thực hiện theo các quy tắc để xây dựng HTML. Mã hóa dữ liệu khi bạn đặt nó vào đó.

tức là Thực hiện cả hai (nhưng theo thứ tự đúng).

Chúng không loại trừ lẫn nhau, do đó không có mâu thuẫn.

Ví dụ (đây là một ví dụ đơn giản, cho rằng dữ liệu trong $ _GET là đúng và tồn tại, không làm điều đó trong thế giới thực):

$search_term = $_GET['q']; 
$page = $_GET['page']; 
$next_page = $page + 1; 
$next_page_url = 'http://example.com/search?q=' . urlencode($search_term) . '&page=' . urlencode($page); 
$html = '<a href="' . htmlspecialchars($next_page_url) . '">link text</a>'; 
+0

Cảm ơn, Quentin, tôi có quan điểm của bạn. Nhưng tôi không hoàn toàn chắc chắn về hai điều. 1) Điều gì sẽ xảy ra nếu htmlspecialchars() thực sự mã hóa một cái gì đó? Nếu vậy, sẽ có các ký tự '&' bên trong URL, không được phép. 2) Có thể mã hóa URL để lại một số ký tự HTML được bảo lưu sau chính nó không? Tôi nghĩ là không. –

+0

Sẽ không có '&' bên trong URL. Sẽ có '&' bên trong HTML. HTML sẽ được phân tích cú pháp và ký tự '&' sẽ xuất hiện trong DOM. Nếu bạn sao chép/dán nguồn HTML của thuộc tính vào trình duyệt thì nó sẽ bị hỏng, nhưng bạn không nên làm điều đó. Nó cũng sẽ phá vỡ nếu bạn lưu trữ các URL trong một tập tin văn bản, gzipped nó, sau đó sao chép/dán nội dung nhị phân của tập tin nén vào thanh địa chỉ. – Quentin

+0

Tôi không nhớ danh sách các ký tự được/không được mã hóa trong các URL ngoài đầu của tôi. Chắc chắn các URL có thể bao gồm các ký tự (chẳng hạn như '&') có ý nghĩa đặc biệt trong HTML (và không nên được mã hóa url nếu bạn muốn chúng có ý nghĩa đặc biệt trong URL, theo ví dụ tôi đưa ra). – Quentin