サイト内検索のスパム対策!パラメーター「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 も無効にできます。では具体的なソースコードをご覧ください。
<?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" から変更すれば、検索パラメーターが変わります。
<!-- 変更前 --> <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 パラメータツール を開きます。そして対象となるサイトのプロパティを選択。
登録していないサイトであれば、ここから追加できます。
[パラメータを追加] から、パラメータ「s」を除外対象として追加。プルダウンは [いいえ:ページのコンテンツには影響しません] を選択。
次の URL は全て同じトップページが表示されます。そのためプルダウンで「いいえ」を選択して、代表的な URL (トップページ) のみクロールされるようになり、「s」パラメーターのついた URL はクロール対象外になります。
https://webllica.com
https://webllica.com/?s=検索ワード
https://webllica.com/?s=他の検索ワード
以上、WordPress のサイト内検索を使ったインデックス登録スパムの対処法でした。