В php можно ли использовать parse_url и http_build_url для обнаружения некорректных URL-адресов и предотвращения xss-атак? Есть ли что-то лучше? - PullRequest
0 голосов
/ 05 ноября 2010

Я хочу разрешить пользователям моего сайта публиковать 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?

Я действительно не хочу писать синтаксический анализатор сам, и я не собираюсь даже рассматривать регулярные выражения.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 13 февраля 2015

Итак, в PHP вы бы использовали что-то вроде:

<?php

$userlink = "http://google.com";
$newlink = htmlentities($userlink);
$link = "<a href=\"$newlink\">$newlink</a>";

?>
0 голосов
/ 05 ноября 2010

Что вам нужно сделать, это просто правильно экранировать контент при создании HTML.это означает, что когда значение содержит ", вы создаете html с &quot;

Защита от XSS - это прежде всего не проверка URL, а правильное экранирование.(хотя вы, вероятно, хотите быть уверены, что это ссылка http: или https:)

Более подробный список того, что следует избегать при построении строк HTML (т. е. атрибут href), см. HTML, URL и Javascript Escaping

0 голосов
/ 12 декабря 2010

В зависимости от нескольких других вещей, вы можете просто проверить URL, проверив, указывает ли он на какой-либо контент. Вот пример:

рисунок 1

<?php

// URL to test
// $url = "";

$content = file_get_contents($url);

if(!empty($content)){

echo "Success:<br /><iframe src=\"$url\" style=\"height:400px; width:400px; margin:0px auto;\"></iframe>";

}else{

echo "Failed: Nothing exists at this url.";

}

?>

Curl - это еще один вариант. С помощью cURL вы можете просто вернуть заголовки http, а затем проверить возвращаемый код ошибки. т.е. ошибка 404 = страница не найдена, 200 = ОК, 201 = Создан, 202 = Принят и т. д.

Удачи!

~ Джон http://iluvjohn.com/

0 голосов
/ 05 ноября 2010

Нет, parse_url - это , а не , предназначенный для проверки URL.

Для этого можно использовать filter_var:

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