6

urlencode()に関連する別のフォーラムで質問したところ、ある男が活発にその上にhtmlentitiesを使用する必要があると言ったとき、URLを作成するたびにそれを実行する必要があることを提案しました。「有効で安全であるために彼は言った」。なぜそれがセキュリティの問題になるのかわかりません。これが彼が言及したコードです:

echo '<a href="index.php?' . htmlentities('page=encode&code='.urlencode($code).'&login='.urlencode($login).'&codeconf=' . urlencode($codeconf)) . '">';

PHPマニュアルは確かにhtmlentitiesに言及しています。しかし、これ以上の説明はありません。

注...PHPは、arg_separator .iniディレクティブを使用して、引数区切り文字をW3Cが推奨するセミコロンに変更することをサポートしています。残念ながら、ほとんどのユーザーエージェントは、このセミコロンで区切られた形式でフォームデータを送信しません。これを回避するためのより移植性の高い方法は、&の代わりに&をセパレータとして使用することです。このためにPHPのarg_separatorを変更する必要はありません。&のままにしますが、htmlentities()またはhtmlspecialchars()を使用してURLをエンコードするだけです。

「&」&amp;に置き換えました 、W3Cバリデーターでページを検証したところ、問題なく表示されました。

私はまだこのhtmlentitiesの問題について心配しています。

  1. URLでhtmlentitiesを使用する必要がある理由はありますか?
  2. はいの場合、これはすべてのタイプのURLに適用されますか?
  3. はいの場合、それはセキュリティ上の理由ですか?
4

1 に答える 1

9

これは、URL内のHTMLエンティティに関するものではありません。これは、任意のデータをHTMLに挿入することです。つまり、その中の特殊文字をHTMLでエスケープする必要があります。このデータがたまたまURLであるかどうかは関係ありません。

  1. urlencodeURLに特別な意味を持つ文字を保持するには、URLに入力した任意のデータをエスケープする必要があります。
  2. ステップ1で取得した任意のデータのブロブは、HTMLに入れる場合と同じ理由で、HTMLエスケープする必要があります。あなたの例でわかるように、HTMLルールによってエスケープする必要&があるデータがあります。&amp;

HTMLコンテキストでURLを使用しなかった場合は、HTMLでエスケープする必要はありません。HTMLエンティティはURLに場所がありません。ただし、他のデータと同様に、HTMLコンテキストのURLはHTMLエスケープする必要があります。

于 2012-10-16T06:02:19.713 に答える