サポート » テーマ » the_search_query()関数を用いても特殊文字が文字実体参照に変わらないのはなぜでしょうか?

  • 解決済 echizenya

    (@echizenya)


    いつもお世話になっております。
    下記の質問について、ご存知の方がいらっしゃいましたらご教示をお願いします。

    【質問の主旨】

    search.phpやsearchform.phpにおいてthe_search_query()関数を使用しても、
    “<“や”>”といった特殊文字が、”<“や”>”といった文字実体参照にならないのはなぜでしょうか?

    【質問の補足】

    1.
    現在、個人ブログで使用するテーマでserach.phpとsearchform.phpの作成を行なっています。

    2.
    クロスサイトスクリプト対策として、検索窓に入力された文字列をエスケープするために、the_search_query()関数を用いています。検索窓はWordPressがデフォルトでウィジェットに用意しているものを使っています。

    3.
    ですが、検索窓に<script>alert(1)</script>と入力・検索すると以下のような結果になります。

    – タイトルのh1タグの出力内容
    ” <script>alert(1)</script>” に関する記事

    – searchform.phpに入る文字列の内容
    <script>alert(1)</script>

    – ページの検証を行なった時の<h1>タグの中身
    <h1>
    <script>alert(1)</script>
    </h1>

    4.
    the_search_query()関数の代わりに、echo esc_attr( get_search_query() )と記述しても
    上記1~3と同じ結果になります。

    5.
    本質問に関するsearch.phpとsearchform.phpのコード内容はGitHubにおいて公開しています。

    – search.php
    https://github.com/echizenyayota/e-yota/blob/sakura_mokumokukai_20170426/wp-content/themes/mytheme/search.php

    – searchform.php
    https://github.com/echizenyayota/e-yota/blob/sakura_mokumokukai_20170426/wp-content/themes/mytheme/searchform.php

    【参考ページ】
    https://goo.gl/868Y2W

    以上、お忙しいところ誠に恐れ入りますが、よろしくお願い申し上げます。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • ちょっと出先からなので詳細は追って確認したいのですが、ご質問のなかにある通り「エスケープ」されているからではないでしょうか。
    諸処仕組みはありますが端的にいうと代替文字でクエリに被らないように置き換えているので実際のデータベースの中身はエスケープ記号がついているかアスキー番号の文字を指定する記述になっているのではと思います。
    タグと被らないようにという仕組みもよく使われるので、もしデータベース内を確認する事が出来ましたら参照いただいて、もしかデータが希望の形であればまた方策を思案したいと思います。

    こんにちは、

    エスケープされているかどうか検証する場合に、ブラウザのDOMソース(Chromeだと右クリック検証)または、HTMLソースどちらで検証されていますか?

    DOMソースで確認されている場合は、一度HTMLソースでも確認してみてください。

    WordPressの検索結果は、単に文字列が存在するかどうかをチェックしているので、

    http://tenman.info/labo/snip/archives/9215

    のような事も起きます。

    個人的には、HTML要素は検索範囲外にしたほうが良さそう派なので、工夫を試みたりしています。

    (実際のテーマでは、非ログイン状態の時のみ、HTML要素をよけて検索するようにしています)

    良い方法かどうかはわかりません

    • この返信は6年、 10ヶ月前にnobitaが編集しました。
    トピック投稿者 echizenya

    (@echizenya)

    @msio さん。
    お忙しいところ、アドバイスありがとうございます!

    1.

    ご質問のなかにある通り「エスケープ」されているからではないでしょうか。

    ということは、「もうすでにエスケープされていて気にする必要はない」ということでしょうか?

    http://takaiba.net/wp_question/1.png
    http://takaiba.net/wp_question/2.png

    上記の1.pngは<script>alert(1)</script>を検索窓で検索した時の
    search.phpとsearchform.phpの様子です。ページもChromeデベロッパーツールで
    表示した検証ページも、<script>alert(1)</script>も特殊文字がそのまま使用されています。

    一方、2.pngはsearch.phpとsearchform.phpをソース表示した様子です。
    こちらの方では、<script>alert(1)</script> となっており文字実体参照が使われています。

    これらの1.pngと2.pngの状態をもってエスケープがすでになされていると考えてよろしいのでしょうか?

    2.

    実際のデータベースの中身はエスケープ記号がついているかアスキー番号の文字を指定する記述になっているのではと思います。

    恐れ入ります。この場合、まずどのデータベーステーブルを確認すればよろしいでしょうか?

    たびたびの質問で誠に恐れ入りますが、ご確認よろしくお願い申し上げます。

    トピック投稿者 echizenya

    (@echizenya)

    @nobita さん。
    いつもアドバイスありがとうございます!

    1.

    エスケープされているかどうか検証する場合に、ブラウザのDOMソース(Chromeだと右クリック検証)または、HTMLソースどちらで検証されていますか?

    HTMLソースでのソース確認をしていませんでした…。
    自分が作成しているテーマについてHTMLソースでの確認をしたところ、上記コメントの2.png のような結果となりました。

    一方Twenty Seventeenの公式テーマで確認したところ、HTMLのソース表示もデベロッパーツールの検証ページも以下の通りになりました。

    http://takaiba.net/wp_question/3.png
    http://takaiba.net/wp_question/4.png

    これらは上記コメントの、

    • 1.png
    • 2.png

    と同じ結果です。よってすでにエスケープはできていると認識してよろしいのでしょうか?

    2.

    WordPressの検索結果は、単に文字列が存在するかどうかをチェックしているので、
    http://tenman.info/labo/snip/archives/9215
    のような事も起きます。

    内容を読むと、

    デフォルトの状態であれば、特に大きな不具合にはなりませんが 

    と書かれています。今回はデフォルトの検索窓のみを使うつもりなので、
    検索結果に投稿内のhtml属性値を検索対象から除くのは実装しないようにしようと思います。
    ただ、これから独自テーマを作成するときの参考とさせていただきます。

    たびたびの質問で誠に恐れ入りますが、ご確認よろしくお願い申し上げます。

    • この返信は6年、 10ヶ月前にechizenyaが編集しました。

    と同じ結果です。よってすでにエスケープはできていると認識してよろしいのでしょうか?

    若干、もやもやっとしたものが残っているようですね。

    「検証」メニューから、the_search_query()が適用されている 一見エスケープされていないページで、

    要素を選択して右クリック「Edit as HTML」を選択してみて、テキストエリアのHTMLを確認

    または、Copy / Copy outerHTML でコピーして、その値がエスケープされていることを確認してみましょう

    • この返信は6年、 10ヶ月前にnobitaが編集しました。
    トピック投稿者 echizenya

    (@echizenya)

    @nobita さん。

    要素を選択して右クリック「Edit as HTML」を選択してみて、テキストエリアのHTMLを確認

    アドバイスに従って操作をしたところ、下記の画像の通り、特殊文字が文字実体参照に変わっていることが
    はっきりと分かりました!おかげさまで「もやもや」がスッキリしました。

    http://takaiba.net/wp_question/5.png

    的確なアドバイスありがとうございます。

    • この返信は6年、 10ヶ月前にechizenyaが編集しました。
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「the_search_query()関数を用いても特殊文字が文字実体参照に変わらないのはなぜでしょうか?」には新たに返信することはできません。