私はしばらく前にこの質問を投稿しましたが、ユーザーが生成した投稿からリンクを見つけて「リンク」するのに最適です。 Linkify正規表現関数PHP大胆な火の玉メソッド
<?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')
linkify関数を実行してページにエコーバックする前に、データベースからのユーザーコンテンツを既にエスケープしていますが、OWASPで、XSSを軽減するためにリンク属性を特別に処理する必要があることを読みました。この関数は、ユーザー生成コンテンツを二重引用符で囲み、すでにエスケープされているhtmlspecialchars($string, ENT_QUOTES, 'UTF-8')
ため、問題ないと思いますが、xssの専門知識を持つ人がこれを確認してくれると本当にありがたいです。ありがとう!