0

自分のサイトでユーザー入力をフィルタリングし、<iframe>タグのみを有効にしたいのですが、ユーザーはこのタグを使用して投稿に動画を追加できます(youtubeやvimeoなど)。

私の最初のアイデアは、タグを使用strip_tags()して有効にすることでした。<iframe>しかし後で私はこの関数についての記事をここで読みました: Redditに関する記事

ですから、XSSを入手できるので、それを使用するのは悪い考えだと思います。

どうすればこの問題を解決できますか?

更新:この場合、やり過ぎにならないソリューションが必要です。

4

2 に答える 2

1

人々が 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 '&lt;')
$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

于 2012-09-13T19:58:53.077 に答える
0

これを試すことができます:

$out = preg_replace("#<(?!/?iframe[ >])#i","&lt;",$in);

ただし、ユーザーがイベント ハンドラーを iframe タグに配置して、ある種の XSS を引き起こす可能性があることに注意してください。

于 2012-09-13T14:24:02.707 に答える