Мои выводы, пока что:
Во-первых, существуют правила для записи допустимого значения атрибута 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>b &&& 1 < 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 (на основных языках) или некоторого примера кода.