Мы хотим разрешить «обычные» href-ссылки на другие веб-страницы, но мы не хотим, чтобы кто-либо проник в клиентские сценарии.
Ищет "javascript:" в HREF и onclick / onmouseover / и т. д. события достаточно хороши? Или есть еще что проверить?






Вам нужно будет использовать белый список разрешенных протоколов, чтобы быть в полной безопасности. Если вы используете черный список, рано или поздно вы пропустите что-то вроде «telnet: //» или «shell:» или какую-нибудь уязвимую специфичную для браузера вещь, о которой вы никогда не слышали ...
Нет, вам нужно еще многое проверить.
Сначала URL-адрес может быть закодирован (с использованием сущностей HTML или кодировки URL-адреса, либо их комбинации).
Во-вторых, вам нужно проверить неправильный формат HTML, о котором браузер может догадаться и в конечном итоге разрешить использование некоторого скрипта.
В-третьих, вам нужно проверить скрипт на основе CSS, например фон: URL (javascript: ...) или ширина: выражение (...)
Возможно, я пропустил еще кое-что - будьте осторожны!
Похоже, вы разрешаете пользователям отправлять контент с разметкой. Таким образом, я бы рекомендовал взглянуть на несколько статей о предотвращении межсайтового скриптинга, которые охватывают немного больше, чем просто предотвращение вставки javascript в тег HREF. Ниже приведен один, который может оказаться полезным:
http://weblogs.java.net/blog/gmurray71/archive/2006/09/preventing_cros.html
Вы должны быть предельно осторожны при вводе данных пользователем. Вы захотите сделать белый список, как уже упоминалось, но не только с помощью href. Пример:
<img src = "nosuchimage.blahblah" onerror = "alert('Haxored!!!');" />
или же
<a href = "about:blank;" onclick = "alert('Haxored again!!!');">click meh</a>
один из вариантов - вообще запретить html и использовать то же форматирование, что и на некоторых форумах. Просто замените
[url = "xxx"]yyy[/url]
с
<a href = "xxx">yyy</a>
Это поможет вам обойти проблемы с наведением указателя мыши и т. д. Затем просто убедитесь, что ссылка начинается с протокола из белого списка и в нем нет цитаты (" или что-то подобное, которое может быть расшифровано с помощью php или браузер).
Похоже, вы ищете функцию-компаньон для PHP strip_tags, то есть strip_attributes. К сожалению, это еще не написано. (Подсказка Подсказка.)
Однако в документации strip_tags есть интересное предложение:
http://www.php.net/manual/en/function.strip-tags.php#85718
Теоретически это удалит из отправленных ссылок все, что не является href, классом или идентификатором; похоже, вы, вероятно, захотите заблокировать его еще больше и просто взять hrefs.