ユーザーがHTML フォームを介して HTML フラグメント (ビデオ プレーヤー)を貼り付け<embed>
たりできるようにしたいと考えています。<object>
サーバー側のコードは PHP です。悪意のある貼り付けコード、JavaScript などから保護するにはどうすればよいですか? 貼り付けたコードを解析できましたが、すべてのバリエーションを説明できるかどうかはわかりません。より良い方法はありますか?
3 に答える
EMBED
ページにメディアを配置することを実際に扱ったことがないので、どのパラメーターとどのパラメーターを使用するかOBJECT
はよくわかりませんが (これは実際に考えると衝撃的です)、BB コードのアプローチを取り、次のようなことを行います[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
独自の<embed>
タグを作成できます。これは安全だと確信しています。<object>
必要なデータがすべて揃っているので、blip.tv からのリンクを使用して、YouTube のような本格的なものを作成することもできます (より多くの場所で動作すると思われます)。
他のビデオ共有 Web サイトからのリンクにはいくつかの癖があると思われるかもしれませんが、うまくいけば、これで始めることができます。幸運を。
入力された HTML をスキャンして悪意のあるコードを確実に検出できる可能性はほとんどありません。スクリプトを挿入する方法は非常に多く (ブラウザ固有の不正な HTML を含む)、すべてを選択することはできません。大手の Web メール プロバイダーが何年も新しいエクスプロイトを発見し続けているのであれば、あなたがそれを実行できる可能性はありません。
ホワイトリストはブラックリストよりも優れています。そのため、代わりに入力を XHTML にする必要があり、標準の XML パーサーを使用して解析することができます。次に、DOM を調べて、各要素と属性が既知の正常なものであることを確認します。すべて問題なければ、正常な DOM から派生した XHTML にシリアル化して戻します。これは不正な形式であってはなりません。Unicode をサポートする適切な XML パーサーは、厄介な「長すぎる 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>