web-dev-qa-db-ja.com

ブラウザに出力される前に、何がすててのHTMLエンティティをエネスケープしている

私は厄介な問題を抱えています。私のワードプレスサイトでは、何かがブラウザにデータを送信する前にすべてのHTMLエンティティをアンエスケープします。次のような場合すべてに起こります。

echo ""XSS"  
print_r( htmlspecialchars( '"XSS' ) );  
esc_html( '"XSS' );
// output in all cases is unescaped
// im running version 3.4.1 with a bunch of plugins all disabled

// error_log() is fine and manages to put " in the log file

ワードプレスのコードが含まれていないファイルでは問題ありませんが、プラグインやテーマでは問題ありません。ブラム。一度に逃げるすべての出力を殺しなさい。それはおかしいです。

どこで見れますか?
ob_list_handlersは「デフォルトの出力ハンドラ」に言及しているだけで、wpコードでhtmlspecialchars_decodehtml_entity_decodeを検索してもあまり面白くありません。

更新
wp3.1に戻って21をインストールしても問題は変わりません。

わかりました。

Firefoxの "選択ソースの表示"とfirebugの両方で "firebugで要素を検査する"とデコードされます。

この種のものは私を殺します!

「View page source」はこれを行いません。私と一緒に考えた人たちに感謝します。

1
user16124

これは、お使いのブラウザの表示形式を引き継ぎ、それらのHTMLエンティティを対応する部分、つまり人間が読めるテキストに変換するUTF-8文字エンコーディングのケースです。

結局のところ、あなたは非常によく似た文字列を望んでいたかもしれません。 "BLAの代わりに何らかの理由で"BLAを見る人の目には。

セキュリティの観点から、このような入力は、特にユーザー生成データ(エスケープされていない)の形式で入力されている場合、大きなリスクをもたらすので、次のような関数があります。

htmlentities       //Native PHP function
htmlspecialchars   //Native PHP function
esc_html           //WordPress API function
esc_attr           //WordPress API function 

...ビジネスの面倒を見てエンコードし、さらに必要に応じて入力をデコードします。

実際、htmlspecialchars_decodehtml_entity_decode、その他の両方が、文字列を処理する方法についていくつか興味深いことを明らかにしています。

'single quotes'の文字列は、"double quotes"の文字列とは異なる方法で扱われます。

PHPの文書を 文字列型 で読むことをお勧めします。

なぜなら彼らは実際に目の前のトピックにいくつかの素晴らしい洞察を与えるからです。

それ以上に私は読むことをお勧めします

これはWordPress APIの機能を上記およびその他の多くに公開します。

View Page Sourceで述べたように、フードの下を見ると、PHPとWordPressが実際にどのように処理されているかの実際の動作を確認することができます。 WordPressがUTF-8文字エンコーディングを強制しており、元の記事に示されている関数では、上記の関数と一緒に余分なパラメーターを渡さずにhtmlspecialcharsが標準的な方法で使用されていました。異なった結果を生んでいるかもしれませんし、ややイライラするかもしれません;)

以下を見て、あなたがでソースを見ているときにそれらが出力を処理する方法を見てください。 "View Page Source;

    $string = '"XSS"';

    echo htmlspecialchars($string);  
    //output -> "XSS"
    //converts double quotes, but also converts existing html entities
    //specifiy double_encode = false to prevent double encoding of entities
    //wordpress preferred method is esc_attr($string) (does not double encoding)

    echo htmlspecialchars_decode($string);
    //outputs -> "XSS"
    //decodes special char " back to " (double quote) 
    //default formatting is ENT_COMPAT which only converts double quotes not single

    echo htmlspecialchars_decode($string, ENT_NOQUOTES); 
    //output -> "XSS"
    //ignores decoding for special chars ' (single) and " (double) quotes

    echo htmlspecialchars_decode($string, ENT_QUOTES); 
    //outputs -> "XSS"
    //decodes special char " back to " (double quote)

    echo htmlentities($string, ENT_NOQUOTES);
    //output -> "XSS"

    echo htmlentities($string, ENT_COMPAT);
    //output -> "XSS"

    echo esc_attr($string);
    //output -> "XSS"
    //encoding "UTF-8"

    $stringed = "\x8F!!\"!";

    echo htmlentities($stringed, ENT_QUOTES);
    //output -> ?!!"!  (notice ? character)
    //PHP < 5.4 defaults encoding to "ISO-8859-1"
    //PHP >= 5.4 defaults encoding to "UTF-8"

    echo htmlentities($stringed, ENT_QUOTES | ENT_IGNORE, "UTF-8");
    //output -> !!&quot;!
    //ENT_IGNORE prevents an otherwise empty string being returned (potential security risk)

    echo htmlentities($stringed, ENT_QUOTES, "UTF-8");
    //returns an empty string

    echo html_entity_decode($stringed, ENT_QUOTES | ENT_IGNORE);
    //output -> ?!!"!   (notice ? character)
    //PHP < 5.4 defaults encoding to "ISO-8859-1"
    //PHP >= 5.4 defaults encoding to "UTF-8"

    echo esc_attr($stringed);
    //returns an empty string
    //encoding "UTF-8"

そのため、すべてはソースの下で進行していますが、ブラウザで表示したときにこれらの各機能について見ていたはずです。

enter image description here

私はこれが、最初に問題と思われるものと似たような問題を抱えている人を助けるかもしれないが、実際には何をしているのか理解しているときではない場合に書きました。

1
userabuser