サポート » その他 » 検索フォーム 値の出力時にエスケープ処理を行う方法をご存じでしょうか

  • 解決済 msnb

    (@msnb)


    WordPress 2.8.4を使用してサイトを作成しましたが、脆弱性検査で以下の結果が出て対処する事になりました。

    問題箇所 - 検索機能 パラメータ:s
    検出脆弱性 – クロスサイトスクリプティング
    推奨対策 – 値の出力時にエスケープ処理を行ってください。

    検索フォームは以下の通りです。

    <form method="get" action="<?php bloginfo('url'); ?>">
    <p>
    <input type="text" name="s" id="s" value="<?php the_search_query(); ?>" />
    <input type="submit" value="検索" />
    </p>
    </form>

    この数日間、ネット上で 「WordPress php 検索フォーム 値の出力時エスケープ処理」などのキーワードで検索をしましたが、上記の内容を、どのようにしたら値の出力時エスケープ処理出来るのか?私のレベルで理解出来る説明を探し出せず質問させて頂きました。

    上記のフォームを値の出力時エスケープ処理する方法をご存じの方、御教授頂きたくお願い申し上げます。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • 脆弱性検査というのはどのような方法で行われたのしょうか? the_search_query(); はエスケープされた検索語を出力するはずですが……。

    トピック投稿者 msnb

    (@msnb)

    mizube様

    早速のお返事ありがとうございます。

    脆弱性検査というのはどのような方法で行われたのしょうか?

    レベルが低くて恐縮です。
    会社で脆弱性検査業者に依頼したとの事。テストの詳細を理解しておりません。
    その点を改めて確認してから、再度、書き込みさせて頂きます。

    the_search_query(); はエスケープされた検索語を出力するはずですが……。

    あっ!そうなんですか?

    ネット上で色々と勉強した結果、クロスサイトスクリプティングの意味がわかってきました。

    自分で検索枠に<h1>テスト</h1>などと入力してテストしてみましたところ、検索ページの上部にパン屑リストを付けてあるのですが、その部分が大文字になりました。

    で、何となく理解できたのは、パン屑リストを外せば、とりあえずはOKなのかな?と言う事なんですが、それでは問題解決になってません。

    パン屑リストのソースに何かコマンド(と言うのでしょうか?)を追記すれば問題解決するのかな?とも思い始めています。

    今、たどり着いたのはhtmlspecialchars()と言うものなんですが、これで宜しいのでしょうか?

    つくづくレベルが低くて恐縮です。

    トピック投稿者 msnb

    (@msnb)

    連続書き込み恐縮です。

    パン屑リストはプラグインYoast Breadcrumbsを利用しています。

    検索フォームから<h1>test</h1>やスクリプトを書き込むとパン屑リストの部分に大文字や書き込んだスクリプトが表示されてしまいます。

    Yoast Breadcrumbsのソースは

    <?php if ( function_exists('yoast_breadcrumb') ) {
    	yoast_breadcrumb('<p id="breadcrumbs">','</p>');
    } ?>

    です。

    このソースに何かを追記すれば「値の出力時にエスケープ処理」が可能になるのだろうと言う事までは理解できました。

    しかし、何をどうやって追記するか?を悩んでおります。

    恐縮ですがお知恵を貸して頂きたくお願い申し上げます。

    追加の情報でようやく把握できました。この場合、問題があるのは、フォームや WordPress 本体ではなくプラグインです。

    お使いの Yoast Breadcrumbs プラグインのバージョンは分かりますか? 日本語版であれば 0.7.4 、本家版であれば 0.8.4 が最新のようですが、いずれも検索語の表示の際にエスケープ処理をしていないみたいですね。

    0.7.4 であれば yoast-breadcrumbs.php の 229 行目、
    0.8.4 であれば yoast-breadcrumbs.php の 250 行目を

    $output .= bold_or_not($opt['searchprefix'].' "'.get_search_query().'"');

    から

    $output .= bold_or_not($opt['searchprefix'].' "'.esc_attr(apply_filters('the_search_query', get_search_query())).'"');

    に変更してください。 the_search_query() は、検索語を取得する get_search_query() で取得した検索語 (に the_search_query 用のフィルタを適用した文字列) を、エスケープしてから出力するテンプレート関数ですが、この処理と全く同じものを Yoast Breadcrumbs プラグインにも組み込む変更です。

    今、たどり着いたのはhtmlspecialchars()と言うものなんですが、これで宜しいのでしょうか?

    それですね。でも WordPress では専用の関数が定義されていますので、そちらを利用されるのがいいと思います。 WP2.7 以前は wp_specialchars() 、 WP2.8以降は esc_attr() がそれにあたります。

    テーマ内で検索語を出力する際には、

    <?php the_search_query(); ?>

    を使っておけば、とりあえずは安全だと思っていいはずです。今後何か問題が発生すれば、その次以降のバージョンで改善されるはずです。

    しかしながら私も XSS 等に関してはスキルが足らず、明確な回答をできる立場にありません。他の方からダメ出しがある可能性もあります。決して鵜呑みにはしないで下さいね。

    トピック投稿者 msnb

    (@msnb)

    mizube様

    何だか涙が出ちゃいそう、いや・・出ちゃいました。

    本当にありがとうございます。

    これから御指摘頂いた点を頑張ってチャレンジしてみます。

    本当にありがとうございました。

    トピック投稿者 msnb

    (@msnb)

    mizube様

    本当に泣きました。ありがとうございました。

    御指摘通りに変更して全て解決しました。

    正直申し上げて。私のレベルで、ここに質問を書き込むと、質問の回答以前に、質問の仕方など、また、私のレベルの低さを指摘されるんじゃないかと、凄く怖かったんです。

    でも、本当にうれしかった!

    有難うございました。

    今回の件で、質問するだけで無く、いつか私より初心者の方の質問に答えてあげられるレベルになれるように頑張りたいと思っています。

    mizube様 本当にありがとうございました。

    今まで以上にWordPressが大好きになりました。

    解決できたようで何よりです。感激して頂けてこちらも嬉しくなりました。

    ところで Yoast Breadcrumbs の脆弱性は、作者に報告すべきですね。私は英語力に不安があるので、とりあえず、日本語版を配布されている方のところへ連絡してみます。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「検索フォーム 値の出力時にエスケープ処理を行う方法をご存じでしょうか」には新たに返信することはできません。