貼り付けた< embed>を安全に受け入れる方法PHPのコード

StackOverflow https://stackoverflow.com/questions/216155

  •  03-07-2019
  •  | 
  •  

質問

ユーザーがHTMLフォームを介して< embed> および< object> HTMLフラグメント(ビデオプレーヤー)を貼り付けられるようにします。サーバー側のコードはPHPです。悪意のある貼り付けられたコード、JavaScriptなどからどのように保護できますか?貼り付けたコードを解析できましたが、すべてのバリエーションを説明できるかどうかはわかりません。より良い方法はありますか?

役に立ちましたか?

解決

ページにメディアを置くことを実際に扱ったことがないので、 EMBED OBJECT がどのパラメータを取るかはよくわかりません(実際にはショックです考えてみてください)が、BB Codeのアプローチを採用して、 [embed url =" http://www.whatever.com/myvideo.whatever" ...] その後、URLなどを解析し、それらが正当であることを確認し、独自の< EMBED> タグを作成します。

編集:さて、このようなことは問題ないはずです:

$youtube = '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param> </param><embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>';

$blip = '<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash" width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>';

preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $youtube, $matches1);
preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $blip, $matches2);
print '<pre>' . print_r($matches1, true). '</pre>';
print '<pre>' . print_r($matches2, true). '</pre>';

これにより出力されます:

Array
(
[0] => Array
    (
        [0] => width="425"
        [1] => height="344"
        [2] => name="movie"
        [3] => value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [4] => src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [5] => type="application/x-shockwave-flash"
        [6] => allowfullscreen="true"
        [7] => width="425"
        [8] => height="344"
    )

[1] => Array
    (
        [0] => width
        [1] => height
        [2] => name
        [3] => value
        [4] => src
        [5] => type
        [6] => allowfullscreen
        [7] => width
        [8] => height
    )

[2] => Array
    (
        [0] => 425
        [1] => 344
        [2] => movie
        [3] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [4] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [5] => application/x-shockwave-flash
        [6] => true
        [7] => 425
        [8] => 344
    )
)

Array
(
[0] => Array
    (
        [0] => src="http://blip.tv/play/AZ_iEoaIfA"
        [1] => type="application/x-shockwave-flash"
        [2] => width="640"
        [3] => height="510"
        [4] => allowscriptaccess="always"
        [5] => allowfullscreen="true"
    )

[1] => Array
    (
        [0] => src
        [1] => type
        [2] => width
        [3] => height
        [4] => allowscriptaccess
        [5] => allowfullscreen
    )

[2] => Array
    (
        [0] => http://blip.tv/play/AZ_iEoaIfA
        [1] => application/x-shockwave-flash
        [2] => 640
        [3] => 510
        [4] => always
        [5] => true
    )
)

それ以降は非常に簡単です。幅/高さなどについては、 is_numeric で確認できます。残りは htmlentities を介して値を実行し、独自のを構築できます。情報から&lt; embed&gt; タグ。これは安全だと確信しています。必要なデータがすべて揃っているため、blip.tvからのリンクを使用して、本格的な&lt; object&gt; をYouTubeのように作成することもできます。 >

他のビデオ共有ウェブサイトからのリンクを含むいくつかの奇抜なものが表示される可能性がありますが、これにより開始されることを願っています。幸運を祈ります。

他のヒント

入力されたHTMLをスキャンして悪意のあるコードを確実に検出する可能性はほとんどありません。スクリプト(ブラウザ固有の不正なHTMLを含む)を挿入する方法は非常に多くあり、それらをすべて選択することはできません。大規模なウェブメールプロバイダーが何年も新しいエクスプロイトを見つけた後でも、それを実行できる可能性はありません。

ホワイトリストはブラックリストよりも優れています。そのため、代わりに入力をXHTMLにする必要があり、標準のXMLパーサーを使用して入力を解析できます。次に、DOMを調べて、各要素と属性が既知の良好なものであることを確認します。すべてが問題ない場合、XHTMLにシリアル化します。 Unicodeサポートを備えた適切なXMLパーサーは、厄介な「overlong UTF-8シーケンス」(IE6および古いOperaに影響するセキュリティホール)を無料で除外する必要があります。

ただし...任意のドメインから埋め込み/オブジェクトを許可する場合、外部ドメインからページへの完全なスクリプトアクセスを既に許可しているので、HTMLインジェクションは心配する必要がありません。 Flashなどのプラグインは、何らかのトリックを必要とせずにJavaScriptを実行できる可能性があります。

したがって、オブジェクトのソースを事前に定義された既知の良好なドメインに制限する必要があります。また、既にそれを行っている場合は、ユーザーがビデオプロバイダーとクリップIDを選択し、そのプロバイダーの適切な既知の適切な埋め込みコードに変換できるようにする方が簡単です。たとえば、bbcodeのようなマークアップを使用している場合、ユーザーにYouTubeクリップを含める従来の方法は、[youtube] Dtzs7DSh [/ youtube]のようになります。

blip.tvから貼り付けたコードの例を次に示します。

<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash"    
  width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>

YouTubeから得られるものの例を次に示します。

<object width="425" height="344">
  <param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param>
  <param name="allowFullScreen" value="true"></param>
    <embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
      type="application/x-shockwave-flash" allowfullscreen="true"
      width="425" height="344"></embed>
</object>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top