2011-01-24 29 views
14

私は常にURL/HTMLエンコーディング/エスケープと混同しています。私はPHPを使用しているので、何かを明確にしたい。URL/HTMLエスケープ/エンコーディング

私は、私はいつも

  • urlencodeを使用する必要があることを言うことができます:個々のクエリ文字列の部分

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

私はそれぞれの機能を使うかもしれない場所がありますか?私はこれらの逃げるものすべてをうまくやっていません、いつも彼らに混乱しています。

答えて

29

まず第一に、あなたは時間のhtmlentites周りの99%を使用すべきではありません。ですから、多くの場合のようなものが表示されます。代わりに、htmlspecialchars()を使用して、xml/html文書内で使用するためのエスケープテキストを作成する必要があります。 htmlentitiesは、使用しているネイティブのキャラクタセットが表示できない文字を表示する場合にのみ便利です(ページがASCIIの場合、表示するUTF-8文字がある場合に便利です)。代わりに、ページ全体をUTF-8(難しくない)にして、それを使ってください。

urlencodeまで、あなたは頭の爪に当たっています。

  • 内部HTML::URLの内部

    <b><?php echo htmlspecialchars($string, ENT_QUOTES, "UTF-8"); ?></b> 
    
  • $url = '?foo='.urlencode('bar'); 
    
18

これは正しいことです。 - htmlspecialcharsは問題ありませんが、文字セットをまっすぐにしている限りです。とにかくやるべきこと。だから、私はそれを使う傾向があるので、私はそれを台無しにしてしまった場合、私は早く見つけます。

URLをHTMLコンテキスト(たとえば、aタグのhref)に入れると、そのタグをエスケープする必要があります。

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

グレート答え要約するので

、。これは、別のコンテキスト内のコンテキストを正しくエスケープする方法の例です。たとえurlencodeが問題を引き起こすために特殊なhtml文字を出力することは決してありませんが、html属性の内容全体をエスケープしないことに注意してください。 – Phil