サイト内検索のスパム対策!パラメーター「s」を別の文字列に変更する

更新日:

WordPress 運営サイトに対して、サイト内検索を使ったスパムがあることを知りました。

検索ワードに不特定多数の文字を仕掛けて、検索結果をインデックスさせるスパムです。検索ワードは「〇〇の検索結果」と title タグに設定されるため、それがインデックスされると大変なことになります。

不特定多数のサイトでインデックスされることで、そのスパムワードで検索すると大量の検索結果が得られてしまう。様々なドメインに対し、特定のワードを含んだページがインデックスされることで、SEO 面での効果を狙ったものです。

実際のところ Google 側でもスパムと把握しているので、大量のスパム攻撃をしても効果は一過性のもの。SEO でプラスになることはありません。

検索スパムに攻撃された跡がある

実際に僕の管理するサイトにも、検索スパムが仕掛けられていました。

検索機能を利用したスパム

この画像は Search コンソールのカバレッジより、確認したもの。幸いなことに検索結果のページは noindex としていたため、インデックスされずに、除外された URL として検知していました。

このままにしても、特に被害はありません。ただこのような URL が存在すること自体は、気分が良いものではありません。そこで次の方法にて WordPress のサイト内検索のパラメーターを変更し、上記のような URL でアクセスされても無効になるような仕掛けを行います。

自作のテーマや作者不明のフリー素材のテーマなど、SEO 対策の設定を誤ってサイト内検索結果のぺージに noindex がないケースが稀にあります。この場合、完全にサイト内検索スパムを食らって、既に変なインデックスが登録されている可能性があります。

仮にインデックスされていたとしても、Google がスパムを把握しているおかげで、自分のサイトがマイナス評価を受ける可能性は低いです。ここで紹介する対策を行ってしばらく待てば、スパムの被害にあったインデックスは削除されると思います。

サイト内検索のスパム対策

スパム対策として行う内容は次の通り。

  • サイト内検索のパラメーターを「s」から変更する
  • 管理画面での検索は「s」のまま実行できるようにする(変更できない)
  • Search コンソールでパラメーター「s」の URL をクロールしないようにする

WordPress におけるサイト内検索は、URL の末尾に「?s=xxxxx」のパラメーターが共通で付与されます。

つまりどのサイトに対しても、パラメーター「s」を使ったスパム用 URL が作れてしまうのです。そこで、このパラメーターを別の文字列に変えて、外部からの検索スパム URL が存在しない状態(無効化)にします。

更に Search コンソールの設定で、パラメーター「s」を無視するように指示する流れです。

ここで紹介するコードは、オリジナルで作成したコードです。コピペして使って OK ですが、利用の際は自己責任でお願いします。

WordPress 検索パラメーター「s」の変更方法

最初に注意点を。一番やってはいけない対処法は、リダイレクトを使ったパラメーターの変更です。

リダイレクトを使うと、パラメーター「s」でアクセスされた URL が、変更したパラメーターに置き換わってアクセスされます。つまりスパム用に自動生成された URL も、そのままリダイレクトされてます。

対応するならパラメーター「s」を完全に無効化して、別のパラメーターを設置する。この方法であれば、リダイレクトされず、生成されたスパム用 URL も無効にできます。では具体的なソースコードをご覧ください。

【functions.php】検索パラメーター変更
<?php
/* 新しいパラメーターを追加 */
add_filter('init', function(){
    global $wp;
    $wp->add_query_var( 'kensaku' );
} );

/* 検索パラメーターの動作 */
add_filter( 'request', function( $request ){
    // 管理画面の検索以外はパラメーター s を無効化
    if ( isset( $_REQUEST['s'] ) ){
        if ( !is_admin() ) ) {
            // トップページへリダイレクト
            wp_safe_redirect( home_url( '/' ) );
            exit;
        }
    }
    elseif ( isset( $_REQUEST['kensaku'] ) ){
    // 新しいパラメーターで検索を実行
        $request['s'] = $_REQUEST['kensaku'];
    }
    return $request;
} );
?>

このコードは、テーマファイル内にある functions.php に追記すれば OK です。このまま末尾に追記するだけで変更されます。

functions.php を修正するときは、事前にバックアップの取得を忘れずに。

ここでは検索パラメーターを「s」から「kensaku」に変更しました。5・18・20行目の kensaku を変更すれば、好きな文字列をパラメーターにできます。

WordPress 管理画面で使われる検索ボックスは、name 属性が変更できません。そのため管理画面で検索される場合は、パラメーター「s」を許容するようにしています。

WordPress の設定画面。

続いてテーマ内にある HTML の検索フォームを修正します。検索ボックスとなる input タグの type="search" にある name 属性を "s" から変更すれば、検索パラメーターが変わります。

検索フォームの HTML変更
<!-- 変更前 -->
<input type="search" …… name="s" …… >

<!-- 変更後 -->
<input type="search" …… name="kensaku" …… >

HTML の変更箇所はテーマによって異なります。serchform.php のように個別ファイルで用意されている場合や、個別で複数箇所設置しているケースもあるため、全体的にチェックするのをお忘れなく。

これらのソースコードを反映すると、検索用 URL が次のように変わります。

https://webllica.com/?kensaku=検索ワード

変更後のパラメーター「s」の扱い

上記の対応をすると、パラメーター「s」を使ったページはトップページにリダイレクトされます。

つまり

https://webllica.com
https://webllica.com/?s=検索ワード

どちらも同じ https://webllica.com の URL でページが表示されます。

Search コンソールでの対応

最後にパラメーター「s」がついた URL を Google がクロールしないようにブロックします。Search コンソールのヘルプにも記載があります。

このページに書いてある通り URL パラメータツール を開きます。そして対象となるサイトのプロパティを選択。

Search Console プロパティを選択

登録していないサイトであれば、ここから追加できます。

[パラメータを追加] から、パラメータ「s」を除外対象として追加。プルダウンは [いいえ:ページのコンテンツには影響しません] を選択。

Search Console でパラメーター「s」をクロール対象外にする

次の URL は全て同じトップページが表示されます。そのためプルダウンで「いいえ」を選択して、代表的な URL (トップページ) のみクロールされるようになり、「s」パラメーターのついた URL はクロール対象外になります。

https://webllica.com
https://webllica.com/?s=検索ワード
https://webllica.com/?s=他の検索ワード

以上、WordPress のサイト内検索を使ったインデックス登録スパムの対処法でした。

\ この記事をシェアする /

このブログの運営者

NJ

Web系メインで従事していた元システムエンジニア。現在は個人事業主として独立。Webサイト運営における「困った問題」の解決方法をブログで発信。Web サイト運営、ポップデザインや動画制作など、パソコンでモノづくりをしている。