очистка ненадежных строк URL, которые будут переданы в location.replace - PullRequest
1 голос
/ 21 сентября 2010

Я получаю строку из идентификатора фрагмента текущего окна (location.hash).Я хочу использовать эту строку в качестве аргумента location.replace(str).

. В обычных условиях строка будет поступать из кода, который я контролирую, поэтому я не беспокоюсь о проверке того, что строка является URL-адресом.Если строка не является URL-адресом, вызов на замену просто не удастся.Это нормально.

Меня беспокоит то, что строка НЕ ​​является URL-адресом javascript: или чем-то еще, что позволило бы кому-либо запускать произвольный Javascript на моем домене.В настоящее время я просто проверяю, что это str.indexOf('http') == 0.

Достаточно ли этого или мне следует продезинфицировать эту строку?

1 Ответ

3 голосов
/ 21 сентября 2010

Предлагаемой вам дезинфекции недостаточно.

Злоумышленник может перенаправить на URL-адрес data:uri, содержащий html / javascript в кодировке base64.Это позволит злоумышленнику выполнить произвольный код JavaScript.Например, этот фрагмент кода будет предупреждать 'xss' (в Firefox, Safari и Opera)


    var data = 'data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=';
    location.replace(data);

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

Вместо внесения в черный список протоколов / ключевых слов используйте вместо этого подход белого списка.Поддерживайте список хороших URL в вашем коде JavaScript.Затем прочитайте идентификатор фрагмента и посмотрите, есть ли он в этом известном списке URL.Если это не так, остановите процесс.

В сфере безопасности белые списки всегда предпочтительнее черных.

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