htmlspecialchars()
を通過していないHTMLストリームにデータを出力しないでください。 これで完了です。シンプルなルールで、従うのが簡単で、XSSのリスクを完全に根絶します。
プログラマーとして、それはあなたです しかし、それを行うための仕事。
定義できます
function h(s) { return htmlspecialchars(s); }
htmlspecialchars()
の場合 PHPファイルごとに100回書き込むには長すぎます。一方、 htmlentities()
を使用する まったく必要ありません。
重要なポイントは、コードとデータがあります。この2つを混ぜ合わせると、悪いことが起こります。
HTMLの場合、コードは要素、属性名、エンティティ、コメントです。データは他のすべてです。データ必須 コードと間違えられないようにエスケープしてください。
URLの場合、コードはスキーム、ホスト名、パス、クエリ文字列のメカニズム(?
)です。 、&コード> 、
=
、#
)。データはクエリ文字列のすべてです:パラメータ名と値。彼らはしなければならない コードと間違えられないようにエスケープしてください。
HTMLに埋め込まれたURL必須 二重にエスケープする(URLエスケープおよび HTMLエスケープ)コードとデータを適切に分離するため。
最新のブラウザは、驚くほど壊れた誤ったマークアップを有用なものに解析することができます。ただし、この機能を強調する必要はありません。何かが機能するという事実(
のURLなど) 適切なHTMLエスケープが適用されていない場合)は、それを実行するのが適切または正しいことを意味するわけではありません。 XSSは、a)データ/コードの分離(つまり「エスケープ」)に気付いていない人、またはずさんな人、b)データのどの部分をエスケープする必要がないかを賢くしようとする人に根ざした問題です。
XSSは、カテゴリa)とb)に分類されないようにすれば、簡単に回避できます。