Удаление Javascript из HREF - PullRequest
       14

Удаление Javascript из HREF

3 голосов
/ 02 декабря 2008

Мы хотим разрешить «нормальные» ссылки href на другие веб-страницы, но мы не хотим, чтобы кто-нибудь крался в скриптах на стороне клиента.

Поиск "javascript:" в HREF и onclick / onmouseover / etc. события достаточно хороши? Или есть другие вещи, которые нужно проверить?

Ответы [ 6 ]

4 голосов
/ 02 декабря 2008

Похоже, вы разрешаете пользователям отправлять контент с разметкой. Поэтому я бы порекомендовал взглянуть на несколько статей о предотвращении межсайтовых сценариев, которые охватывали бы немного больше, чем просто предотвращение вставки javascript в тег HREF. Ниже я нашел один, который может быть полезен:

http://weblogs.java.net/blog/gmurray71/archive/2006/09/preventing_cros.html

3 голосов
/ 02 декабря 2008

Для полной безопасности вам придется использовать белый список разрешенных протоколов. Если вы используете черный список, рано или поздно вы пропустите что-то вроде «telnet: //» или «shell:» или какую-то уязвимую для браузера вещь, о которой вы никогда не слышали ...

2 голосов
/ 02 декабря 2008

Нет, нужно проверить намного больше.

Первый URL-адрес может быть закодирован (с использованием сущностей HTML или кодировки URL-адреса или их комбинации).

Во-вторых, вам нужно проверить наличие искаженного HTML, о котором может догадаться браузер, и в конечном итоге разрешить ввод некоторого сценария.

В-третьих, вам нужно проверить скрипт на основе CSS, например, background: url (javascript: ...) или width: expression (...)

Возможно, я пропустил еще кое-что - нужно быть осторожным!

0 голосов
/ 02 декабря 2008

Звучит так, как будто вы ищете функцию компаньона для PHP strip_tags, которая равна strip_attributes. К сожалению, это еще не было написано. (Подсказка, подсказка.)

Однако есть интересное предложение в документации strip_tags, здесь:

http://www.php.net/manual/en/function.strip-tags.php#85718

Теоретически это удалит из отправленных ссылок все, что не является ссылкой, классом или идентификатором; кажется, что вы, вероятно, хотите заблокировать его еще дальше и просто взять hrefs.

0 голосов
/ 02 декабря 2008

Один из вариантов - запретить HTML и использовать тот же формат, который используют некоторые форумы. Просто замените

[url="xxx"]yyy[/url]

с

<a href="xxx">yyy</a>

Это поможет вам решить проблемы с наведением указателя мыши и т. Д. Затем просто убедитесь, что ссылка начинается с протокола из белого списка и в нем нет кавычек (&quot; или некоторых подобных, расшифровывается с помощью php или браузера).

0 голосов
/ 02 декабря 2008

Вы должны быть чрезвычайно осторожны, принимая пользовательский ввод. Вы захотите сделать белый список, как упомянуто, но не только с href. Пример:

<img src="nosuchimage.blahblah" onerror="alert('Haxored!!!');" />

или

<a href="about:blank;" onclick="alert('Haxored again!!!');">click meh</a>
...