web-dev-qa-db-ja.com

strip_tags()は恐ろしく安全ではありませんか?

私はいつもstrip_tags XSS攻撃を防ぐためですが、今日は恐ろしく危険だと言っている投稿を見ました。マニュアルが言うように、それは不正なHTMLをチェックしません!

本当ですか?

XSSを防ぐにはどうすればよいですか?

12
ALH

XSSを防ぐには、次のことを行う必要があります。

  1. Validate処理するすべてのユーザー入力(例-id GETパラメータが数値である場合、PHPのis_number()関数または Filter 拡張子を使用)。これには、GET/POSTパラメータだけでなく、Cookie名、Cookie値、HTTPヘッダー、アップロードされたファイル名なども含める必要があります。攻撃者はさまざまな方法でリクエストを操作できます。受け入れて表示する必要がある場合ユーザーからのHTMLコンテンツ(CMSアプリケーションなど)は、十分にテストされた HTMLPurifier ライブラリを使用して、JavaScriptおよびその他のXSSペイロードを除外し、クリーンでサニタイズされたHTMLのみを残します。

  2. 値を表示するときは、コンテキスト出力エンコーディングを使用します(「エスケープ」と呼ばれることもあります)。ユーザー指定の値をどのようにエンコードするかについては、次のような場合に異なるルールがあります。

    • HTMLコンテキスト。 _<div>{$_GET['id']}</div>_
    • HTML属性のコンテキスト。 _<div class='{$_GET['class']}'>_
    • JavaScriptコンテキスト_<script> var a = '{$_GET['id']}'</script>_
    • CSSコンテキスト<div style='background:url({$_GET['image']})'>

OWASP XSS Prevention Cheat Sheet で説明されている推奨ルールを参照することをお勧めします。 XSSは、今日のWebアプリケーションにとって #2リスク であるため、徹底的に読み、それを遵守してください。 OWSSP tutorial video on XSS も参照してください。

17

コンテキストエンコーディングを使用する必要があります。 owasp xss防止チートシート を参照してください。出力の場所に応じて、異なる方法でエンコードする必要があります。例として、次の入力はstrip_tagsによって失われますが、出力がhtmlテキスト入力のvalue属性にある場合はxssが発生します。 "autofocus onfocus =" alert(1)

4
Erlend