人々が HTML を投稿できるようにする代わりに、YouTube ビデオへのリンクの可能性があるものを入力から検索し、コードを自分でつなぎ合わせることができます。
今日、StackOverflow でこのコードを見つけました:
How do I find all YouTube video ids in a string using a regex?
文字列から YouTube の URL を検索し、それらをリンクに置き換えます。<iframe/>
以下は、URL をsに置き換えたコードの修正バージョンです。
// Linkify youtube URLs which are not already links.
// From https://stackoverflow.com/questions/5830387/php-regex-find-all-youtube-video-ids-in-string
function linkifyYouTubeURLs($text) {
$text = preg_replace('~
# Match non-linked youtube URL in the wild. (Rev:20111012)
https?:// # Required scheme. Either http or https.
(?:[0-9A-Z-]+\.)? # Optional subdomain.
(?: # Group host alternatives.
youtu\.be/ # Either youtu.be,
| youtube\.com # or youtube.com followed by
\S* # Allow anything up to VIDEO_ID,
[^\w\-\s] # but char before ID is non-ID char.
) # End host alternatives.
([\w\-]{11}) # $1: VIDEO_ID is exactly 11 chars.
(?=[^\w\-]|$) # Assert next char is non-ID or EOS.
[?=&+%\w-]* # Consume any URL (query) remainder.
~ix',
'
<iframe width="560" height="315" src="http://www.youtube.com/embed/$1"></iframe>
',
$text);
return $text;
}
次のように実装できます。
<?php
$text = 'This is my comment. It contains an XSS attack!:
<script type="text/javascript">
alert(\'bam\');
</script>
I learned about XSS on YouTube:
http://www.youtube.com/watch?v=i38LMZyKIqI
';
// Sanitize XSS (e.g.: convert '<' to '<')
$output = htmlspecialchars($text);
$pattern = [];
$output = linkifyYouTubeURLs($output);
// Add natural line breaks
$output = nl2br($output);
echo $output;
?>
XSS 攻撃は阻止されますが、YouTube リンクは動画に変換されます。Vimeo やその他の主要なビデオ プロバイダーと連携するように、さらに変更することもできます。
実際のコードは次のとおりです。
http://codepad.viper-7.com/8w0h1F