Правила кодирования для URL с помощью псевдопротокола `javascript:`? - PullRequest
4 голосов
/ 15 июля 2010

Есть ли какие-либо авторитетные ссылки на синтаксис и кодировку URL для псевдопротокола javascript:? (Я знаю, что это не очень хорошо продумано, но в любом случае это полезно для букмарклетов).

Во-первых, мы знаем, что стандартные URL-адреса следуют синтаксису:

scheme://username:password@domain:port/path?query_string#anchor

но этот формат здесь не применим. Действительно, кажется, было бы правильнее говорить о URI вместо URL : здесь указан «неофициальный» формат javascript:{body}.

Теперь, какие допустимые символы для такого URI (каковы правила escape / unescape) при встраивании в HTML?

В частности, , если у меня есть код функции javascript, и я хочу встроить его в javascript: URI, которые являются правилами экранирования для применения ?

Конечно, можно избежать каждого не буквенно-цифрового символа, но это будет излишним и сделает код нечитаемым. Я хочу убежать только от необходимых персонажей.

Кроме того, ясно, что было бы плохо использовать некоторую urlencode / urldecode подпрограмму (это для значений строки запроса), мы не хотим декодировать '+ 'к пробелам, например.

1 Ответ

4 голосов
/ 15 июля 2010

Мои выводы, пока что:

Во-первых, существуют правила для записи допустимого значения атрибута HTML: но здесь стандарт требует (если значение атрибута заключено в кавычки) произвольного CDATA (фактически % URI , но HTML Сам по себе не требует дополнительной проверки на своем уровне: любой CDATA будет проверять).

Некоторые примеры:

 <a href="javascript:alert('Hi!')">     (1)
 <a href="javascript:if(a > b && 1 < 0) alert(  b ? 'hi' : 'bye')">   (2)
 <a href="javascript:if(a&gt;b &amp;&&amp; 1 &lt; 0) alert( b ? 'hi' : 'bye')">  (3)

Пример (1) действителен. Но также пример (2) является верным HTML 4.01 Strict. Чтобы сделать его действительным XHTML, нам нужно только экранировать специальные символы XML < > & (пример 3 является допустимым XHTML 1.0 Strict).

Теперь, является ли пример (2) действительным javascript: URI? Я не уверен, но я бы сказал, что это не так.

С RFC 2396 : URI подвержен некоторым дополнительным ограничениям и, в частности, escape / unescape через %xx последовательности. И некоторые символы всегда запрещены: среди них пробелы и {}#.

RFC также определяет подмножество opaque URIs: те, которые не имеют иерархических компонентов и для которых разделительные символы не имеют специального значения (например, у них нет «строки запроса», поэтому ? может использоваться как любой не специальный символ). Я предполагаю, что javascript: URI должны рассматриваться среди них.

Это будет означать, что действительные символы внутри 'body' javascript: URI

 a-zA-Z0-9 
 _|. !~*'();?:@&=+$,/-   
 %hh : (escape sequence, with two hexadecimal digits)

с дополнительным ограничением, которое не может начинаться с /. В этом кадре пропускаются некоторые «важные» символы ASCII, например

{}#[]<>^\

Также % (потому что он используется для escape-последовательностей), двойные кавычки " и (самое главное) все пробелы.

В некоторых отношениях это кажется вполне допустимым: важно отметить, что + является действительным (и, следовательно, он не должен быть «экранирован» при декодировании как пробел).

Но в остальном это кажется слишком ограничительным. Брекеты и скобки, в частности: я понимаю, что они обычно используются без экранирования и браузеры не имеют проблем.

А что с пробелами? Как скобки, они запрещены RFC, но я не вижу проблем в такого рода URI. Тем не менее, я вижу, что в большинстве букмарклетов они экранируются как "% 20". Есть ли какое-либо (эмпирическое или теоретическое) объяснение этому?

Я до сих пор не знаю, есть ли какие-то стандартные функции для создания этого escape / unescape (на основных языках) или некоторого примера кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...