2012-04-17 7 views
10

Что нужно сделать против содержимого атрибута href: кодировка HTML или URL?как закодировать атрибут href в HTML

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

С одной стороны, поскольку атрибут href содержит URL, я должен использовать кодировку URL. С другой стороны, я вставляю этот URL в HTML, поэтому он должен быть закодирован в HTML.

Пожалуйста, помогите мне преодолеть это противоречие.

Спасибо.


EDIT:

Вот противоречие. Предположим, что в URL могут быть символы «<» и «>». Кодировка URL-адресов не удалит их, поэтому в атрибуте href будут зарезервированы HTML-символы, что нарушает стандарт. Кодировка HTML будет удалена '<' и '>' символы и HTML будут действительны, но после этого в URL будут отображаться неожиданные символы «&» (это зарезервированный символ для URL-адреса, он используется как разделитель параметров строки запроса) ,

Reserved URL characters является надмножеством reserved HTML characters, за исключением '<' и '>', которые зарезервированы для HTML, но не для URL.


EDIT 2:

Я был неправ о символах '<' и '>', они на самом деле процент спасся кодирования URL. Если это так, в этом случае достаточно кодирования URL, не так ли?

+1

Вы пробовали что-нибудь до сих пор? –

+2

Это «ты что-то пробовал», и мему становится глупо. Что при восстановлении ошибок в браузере, большая часть кодирования данных предназначена для защиты от проблем безопасности. Как вы должны сказать, что правильно, если вы что-то пытаетесь? Предположим, что любой комплект тестирования безопасности, который у вас есть, имеет достаточный охват? Это совершенно разумный вопрос о фундаментальной технике. – Quentin

+0

Quentin более-менее прав, но остается вопрос, какие ситуации могут быть противоречивыми? Можете ли вы показать пример? И вы пробовали оба решения, и оба они работали, или оба не работают? –

ответ

10

Создайте URL как обычно. Следуйте правилам построения URL-адресов. Кодируйте данные, которые вы вставляете в него.

Затем постройте HTML как обычно. Следуйте правилам построения HTML. Кодируйте данные по мере их ввода.

i.e. Сделайте оба (но в правильном порядке).

Они не являются взаимоисключающими, поэтому нет противоречия.

Например (это упрощенный пример, который принимает данные в $ _GET является правильным и существует, не делать в реальном мире):

$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

Спасибо, Квентин, у меня есть точка. Но я не совсем уверен в двух вещах. 1) Что произойдет, если htmlspecialchars() действительно что-то закодировал? Если это так, в URL-адресе будут символы «&», что запрещено. 2) Возможно ли, чтобы кодировка URL оставила некоторые зарезервированные символы HTML после себя? Я думаю, что это не так. –

+0

В URL-адресе не будет '&' '. Внутри HTML будет '&' '. HTML будет проанализирован, и символ '&' появится в DOM. Если вы скопируете/вставляете исходный код HTML в браузер, тогда он сломается, но вы не должны этого делать. Это также сломается, если вы сохранили URL-адрес в текстовом файле, gzipped его, а затем скопировали/вставляли двоичный контент сжатого файла в адресную строку. – Quentin

+0

Я не помню список символов, которые/не закодированы в URL-адресах от верхней части головы. Конечно, URL-адреса могут включать в себя символы (такие как '&'), которые имеют особое значение в HTML (и которые не должны быть urlencoded, если вы хотите, чтобы они имели свое особое значение в URL-адресе, как в примере, который я дал). – Quentin

Смежные вопросы