Я хочу разрешить пользователям моего сайта публиковать URL.Эти URL-адреса затем будут отображаться на сайте в атрибутах href тегов.По сути, пользователь A публикует URL-адрес, мой сайт отображает его на странице в виде тега, а затем пользователь B щелкает его, чтобы увидеть изображения котят.
Я хочу предотвратить выполнение JavaScript и xss-атаки, а также убедиться, что естьв сгенерированном выводе нет искаженных URL-адресов.
Пример. Пользователь A публикует неверно сформированный URL-адрес, предположительно, на изображениях котят.Мой сайт пытается сгенерировать тег из данных пользователя A, затем пользователь B нажимает на полученную ссылку.Пользователь А фактически опубликовал неверно сформированный URL, который добавляет событие javascript «onclick» для отправки файлов cookie жертвы на другой сайт.
Поэтому я хочу разрешить только правильно сформированные URL-адреса и заблокировать все, кроме http/ https протоколы.Поскольку я не разрешаю здесь ничего, что не похоже на URL, а пользователь не предоставляет мне html, проверить это довольно просто, проанализировав и реформировав URL.
Я думаю, чтоparse_url должен завершиться с ошибкой в неправильных URL или заменить недопустимые символы на «_».Я также могу проверить разделенные части URL на наличие разрешенных протоколов.Затем, создав URL-адрес с помощью http_build_url, я беру части, разделенные parse_url, и собираю их обратно в URL-адрес, который, как известно, правильно сформирован.Поэтому, разбив их таким образом в первую очередь, я могу дать пользователю сообщение об ошибке в случае его сбоя вместо того, чтобы помещать на мою страницу дезинфицированный сломанный URL-адрес.
Вопрос в том, предотвратит ли атака xss зло, еслипользователь нажимает на ссылку?Нужно ли экранировать проанализированный и восстановленный URL?Есть лучший способ сделать это?Разве это не должно быть решенной проблемой к настоящему времени с функциями в стандартных библиотеках php?
Я действительно не хочу писать синтаксический анализатор сам, и я не собираюсь даже рассматривать регулярные выражения.
Спасибо!