web-dev-qa-db-ja.com

XSSに関係する場合のhtmlspecialcharsとhtmlentities

私はこれについて多くの矛盾する答えを見てきました。多くの人は、php関数だけではxssからあなたを保護できないと引用するのが大好きです。

どのXSSがhtmlspecialcharsを介して正確にそれを達成でき、何がhtmlentitiesを介してそれを達成できるのでしょうか?

機能の違いは理解していますが、残っているxss保護のレベルの違いは理解できません。誰か説明してもらえますか?

28
stuckinphp

htmlspecialchars()は、IE 9: http://securethoughts.com/2009/05/)でもInternetExplorerを悩ませているUTF-7XSSエクスプロイトからユーザーを保護しません悪用-ie8-utf-7-xss-vulnerability-using-local-redirection /

例えば:

<?php
$_GET['password'] = 'asdf&ddddd"fancy˝quotes˝';

echo htmlspecialchars($_GET['password'], ENT_COMPAT | ENT_HTML401, 'UTF-8') . "\n";
// Output: asdf&amp;ddddd&quot;fancyË

echo htmlentities($_GET['password'], ENT_COMPAT | ENT_HTML401, 'UTF-8') . "\n";
// Output: asdf&amp;ddddd&quot;fancy&Euml;quotes

ユーザー入力をサニタイズするときに、常にhtmlentitiesを使用する必要があり、htmlspecialcharsを使用することはめったにありません。また、前に常にタグを削除する必要があります。そして、本当に重要で安全なサイトの場合、[〜#〜]決して[〜#〜]strip_tags()を信頼します。 HTMLPurifier for PHP を使用します。

13

PHPの header コマンドを使用して文字セットを設定する場合

header('Content-Type: text/html; charset=utf-8');

次に htmlspecialcharshtmlentities はどちらもHTMLの出力に対して安全であるはずです。 [〜#〜] xss [〜# 〜] UTF-7エンコーディングを使用して達成することはできません。

JavaScriptまたはCSSをエスケープしてサイトを危険にさらす可能性のある文字を入力する可能性があるため、これらの関数をJavaScriptまたはCSSへの値の出力に使用しないでください。これらの状況を適切に処理する方法については、 XSS防止に関するチートシート を参照してください。

4
SilverlightFox

探している答えが見つかったかどうかはわかりませんが、HTMLクリーナーも探しています。作成しているアプリケーションがあり、HTMLコード、場合によってはJavascript、またはその他の言語を取得して、問題を引き起こしたりXSSの問題を許容したりせずにMySQLDBに配置できるようにしたいと考えています。私は HTML Purifier を見つけました。これは、PHPシステムでユーザーが送信した情報をクリーンアップするための最も開発され、現在も維持されているツールのようです。リンクされているページは彼らや他のツールが役立つ理由についての推論を生み出すことができる比較ページ。これが役立つことを願っています!

2
Jonny5 Alive