Безопасно ли разрешать ссылки, начинающиеся с # (хэш)? - PullRequest
4 голосов
/ 03 февраля 2012

Я создаю веб-приложение, и пользователи могут создавать HTML-содержимое динамически.Безопасно ли (например, XSS-атаки) разрешить им создавать ссылки, начинающиеся с #?

Я не знаю, почему этого не произойдет - возможно, я просто параноик.(Мой код Javascript не делает ничего особенного для # URL-адресов.)

В любом случае, одна из причин, по которой я спрашиваю, состоит в том, что я использую html-sanitizer Google Caja для очистки HTML.Он фильтрует URL: s, , однако фильтр по умолчанию выглядит так:

function urlX(url) { if(/^https?:\/\//.test(url)) { return url }}

То есть протокол должен быть указан, и разрешены только HTTP и HTTPS, но не javascript:.Недавно я изменил функцию фильтрации URL-адресов на:

function urlX(url) {
  if (/^https?:\/\//.test(url) || /^#/.test(url)) return url;
}

(то есть, также допускается #.....)

Я подумал, что, возможно, мне следует спросить, думаете ли вы #...ссылки безопасны?

(Например, браузер не будет делать ничего безумного с такими ссылками, как `href = '# javascript: ....'? Ну, это не так (не мой браузер в любом случае), новозможно, есть что-то другое ... что-то ... о чем я не знаю)

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Это должно быть безопасным: что-либо после # в URL анализируется браузерами как идентификатор фрагмента .

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

Простое запрещение ссылок, а не начало с #, мало что даст, так как злоумышленник все равно может включитьидентификатор вредоносного фрагмента в полном URL или даже в ссылке, указывающей на ваш сайт откуда-то еще.

3 голосов
/ 03 февраля 2012

Это не безопасно. Например, возникла проблема XSS с jQuery $(location.hash). Есть PoC на http://ma.la/jquery_xss/.

Так что либо запретите это, либо должным образом очистите все после #

...