Я отправил этот вопрос некоторое время назад, и он отлично работает для поиска и «связывания» ссылок с созданных пользователем сообщений. Linkify Regex Function PHP Daring Fireball MethodСмягчение атак xss при построении ссылок
<?php
if (!function_exists("html")) {
function html($string){
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
}
if (false === function_exists('linkify')):
function linkify($str) {
$pattern = '(?xi)\b((?:(http)s?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))';
return preg_replace_callback("#$pattern#i", function($matches) {
$input = $matches[0];
$url = $matches[2] == 'http' ? $input : "http://$input";
return '<a href="' . $url . '" rel="nofollow" target="_blank">' . "$input</a>";
}, $str);
}
endif;
echo "<div>" . linkify(html($row_rsgetpost['userinput'])) . "</div>";
?>
Я обеспокоен тем, что я, возможно, представит угрозу безопасности, вставив пользовательский контент в виде ссылки. Я уже избегаю пользовательского контента, исходящего из моей базы данных, с htmlspecialchars($string, ENT_QUOTES, 'UTF-8')
, прежде чем запускать его через функцию привязки и повторять на странице, но я прочитал о OWASP, что ссылки на атрибуты необходимо обрабатывать специально для уменьшения XSS. Я думаю, что эта функция в порядке, поскольку она помещает созданный пользователем контент в двойные кавычки и уже сбежала с htmlspecialchars($string, ENT_QUOTES, 'UTF-8')
, но по-настоящему оценила бы кого-то с опытом xss, чтобы подтвердить это. Благодаря!
Если недопустимый ввод предназначен для размещения в href, src или других атрибутах на основе URL-адресов, он должен быть проверен, чтобы убедиться, что он не указывает на неожиданный протокол, особенно ссылки на Javascript. Затем URL-адрес должен быть закодирован на основе контекста отображения, как и любой другой фрагмент данных. Например, URL-адреса, управляемые пользователем, в HREF-ссылках должны быть закодированы атрибутом. Пример приведен в Java. Не знаете, как реализовать в PHP ... http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/codecs/PercentCodec.java – Jeff
-1 Это смущение, вам нужно проверить свой код. – rook
См. Отредактированный вопрос с полным кодом. – Jeff