5

重複の可能性:
出力ではなく、DB挿入前の入力でのPHP htmlentities()

XSSのようなものから自分自身を保護しようとしているPHPアプリケーションの場合、どの段階でhtmlentities()関数を呼び出す必要がありますか?最初のユーザー入力で呼び出す必要がありますか、それともそのデータが出力されるすべてのページレンダリングで呼び出す必要がありますか?

ユーザー入力で使用するhtmlentities()と、データベースに保存するデータが少し多くなります。ただし、長期的には、入力時に変換を実行するだけでよく、その後のそのデータの出力では変換を実行する必要がないため、CPUサイクルを節約できます。

アプリケーションにHTML入力データを保存しなければならないという予測可能なケースは見当たらないので、使用htmlentities()は純粋にXSS保護のためであることに注意してください。万が一、生のHTMLが必要になった場合は、html_entity_decode()reverseを呼び出すだけhtmlentities()です。さらに、ページレンダリングを呼び出すのを忘れたりhtmlentities()、誤ってXSSエクスプロイトをアプリケーションに挿入したりする必要がなくなります。

私はFacebookのXHP拡張機能を使用するというアイデアをいじくりまわしましたが、XML解析は、アプリケーションで快適なものよりもかなり多くのオーバーヘッドを引き起こします。


概要:htmlentities()入力または出力で使用する必要がありますか?この状況に対する一般的に受け入れられているアプローチは何ですか?

4

3 に答える 3

3

アプリケーションの存続期間中、入力が Web ブラウザーにのみ供給されることを保証できない限り、この問題は議論の対象になりません。出力に XSS 保護を使用する必要があります。ケースバイケースでの出力(出力の種類に関係なく)。これは、入力に保護を適用するための現在の議論です。

上記が現在でも真実である可能性は非常に低いため(不特定の将来の時間は言うまでもなく)、IMHOの答えは明らかです。

于 2012-06-30T17:11:18.050 に答える
2

私はそれを出力で使用することを好みます。これにより、HTMLバージョンの出力がない場合でも同じデータを使用する可能性が開かれます。

于 2012-06-30T17:03:32.567 に答える
0

入力時にそれを行う理由はありません。

高いパフォーマンスが必要な場合は、2 つのフィールドを作成するだけです: text、escaped_text と最初の出力で 2 番目のフィールドを埋め、更新時にリセットします。

テンプレート エンジンを使用する場合は、すべてのデータがエスケープされます。

于 2012-06-30T18:11:29.357 に答える