web-dev-qa-db-ja.com

URL / HTMLエスケープ/エンコーディング

私はいつもURL/HTMLエンコーディング/エスケープと混同されてきました。私はPHPを使用しているので、何かを片付けたいと思います。

私はいつも使うべきだと言えますか

  • urlencode:個々のクエリ文字列部分用

    $url = 'http://test.com?param1=' . urlencode('some data') . '&param2=' . urlencode('something else');
    
  • htmlentities<>のような特殊文字をエスケープして、ブラウザによって適切にレンダリングされるようにします

それぞれの機能を使う場所は他にありますか?私はこれらの逃げるものすべてが得意ではなく、常に彼らに混乱しています

17
Jiew Meng

まず、99%の確率でhtmlentitesを使用するべきではありません。代わりに、xml/htmlドキュメント内で使用するテキストをエスケープするには htmlspecialchars() を使用する必要があります。 htmlentitiesは、使用しているネイティブ文字セットでは表示できない文字を表示する場合にのみ役立ちます(ページがASCIIであるが、表示したいUTF-8文字がある場合に役立ちます)。代わりに、ページ全体をUTF-8にして(難しくはありません)、それで完了します。

urlencodeまでは、頭に釘を打ちます。

要約すると、次のようになります。

  • HTMLの内部:

    <b><?php echo htmlspecialchars($string, ENT_QUOTES, "UTF-8"); ?></b>
    
  • URLの内部:

    $url = '?foo='.urlencode('bar');
    
31
ircmaxell

そうです。 --htmlspecialcharsは問題ありませんが、文字セットをまっすぐに取得する限りは問題ありません。とにかくどちらをすべきか。だから私はそれを使う傾向があるので、私がそれを台無しにしたかどうかを早く知るでしょう。

また、URLをhtmlコンテキスト(たとえば、href-タグのa内)に配置する場合は、それをエスケープする必要があることに注意してください。したがって、次のようなものがよく見られます。

echo "<a href='" . htmlspecialchars("?foo=".urlencode($foo)) . "'>clicky</a>"
18
troelskn