У меня возникло несколько возможных проблем, потому что это было довольно забавно.Даже если ничего из этого не сработает, я думаю, вы можете легко сделать это более безопасным, и это будет стоить спокойствия.В любом случае, вот некоторые полезные данные, которые я придумал.
новая строка
Вы сказали, что это не работает для вас, но работает для меня в Chrome (Windows 10/69.0.3497.100
).Это самая очевидная работа вокруг, а также единственная работа, которую я мог придумать.Возможно, у вас была опечатка, когда вы пытались?Хотя HTML-кодирование сущностей этого не сделает, простое URL-кодирование должно ... Если ваш источник выглядит так, он должен работать:
<a href="javascript://%0aalert(document.location)">xss test</a>
(jsfiddle PoC)
неполное регулярное выражение
Вы сказали, что оно должно "начинаться с [a-z0-9]+://
, но это регулярное выражение не охватывает часть" начало ", поэтому что-то подобное может совпадать:
javascript:alert(1);//abc://foo.bar
Возможно, у вас есть что-то вроде ^[a-z0-9]:\/\/
или вы используете язык, который заключает в себе термин "launchWith ()" или что-то подобное. Просто стоит упомянуть.
вложенные протоколы
Я не думаю, что здесь много, но это стоит посмотреть. И это вектор атаки, который вы, возможно, не учли.
view-source://data:text/html,<script>alert(1);</script>
С одной стороны, это не должновыполнить что-либо, так как это view-source
. Для двоих это должно выдать ошибку CORS (я думаю). И, наконец, даже если он все-таки выполнится, он будет выполняться в другом контексте, чем ваша страница (они могут просто ссылаться на вредоносное ПО).сайт, если это было их целью). Так что все вокруг вроде слабое.Однако, возможно, существуют и другие вложенные протоколы, которые могут быть проблематичными.
запрос на подделку
Не совсем XSS, но все еще потенциальная проблема.Злоумышленник может ссылаться на существующую страницу на вашем сайте, например https://example.com/account/delete
.Если они могут контролировать отображаемое имя ссылки, это может сделать ее довольно убедительной.Даже если они не контролируют отображаемое имя, вы можете создать довольно запутанный Uris, маскирующий, куда он на самом деле идет (различные методы кодирования).У вас может не быть таких URL на вашем сайте (хорошая работа!), Но это часто случается.
фишинговые / вредоносные ссылки
Это может быть очевидно, но важно знать, что пользователь может сделать ссылку на сайт, который копирует внешний вид вашего сайта (или другого сайта),Это просто общая проблема, связанная с разрешением произвольных гиперссылок.Если ваша база пользователей особенно уязвима для этого, многие сайты перенаправляют внешние ссылки на страницу с предупреждением (это можно сделать так же просто, как маленький js, например: onclick="return confirm('you sure you want to do that?')"
. Хотя я не знаю, насколько эффективны эти вещи на самом деле -это просто то, что вы видите.
заключение
Вероятно, мы могли бы сгладить миллионы вещей, которые могут вызвать или не вызвать проблемы с безопасностью. В конце концов, возможно, стоит ввести белый список того, чтопротоколы, которые вы хотите разрешить. Хотите ли вы, чтобы люди могли включать ссылки, такие как mailto:
, ssh:
, slack:
, file:
и т. д. Я хотел бы сделать регулярное выражение на стороне клиента для начала с http (s)и затем в бэкэнде используйте анализатор URI, чтобы подтвердить, что схема действительно является http (s), и, если нет, вывести предупреждение. Это скорее аспект взаимодействия с пользователем, но если вы беспокоитесь, большинство пользователей будут печатать что-то вроде "www.example.com ", вы можете просто дать им предупреждение на стороне клиента, что оно должно начинаться с http (s) (или просто иметь его там по умолчанию).Возможно, стоит рассмотреть возможность использования API проверки репутации и представления результатов рядом с URL-адресом, отвергая любые домены с плохой репутацией.