よくわからないアクセスへの漠然とした対処
ちょっと前から当ブログのアクセス解析はPiwikを使うようになった。それまで使っていたアクセス解析が長らくメンテされておらず、PHP7へのアップグレードについてこれなかったからだ。Piwikのタグを埋め込んでアクセス解析していると、結構画像に直リンクで飛んできてたり、”.ln.is”や”google_appengine”でサイトを丸ごとパクられているのがやっぱり気になる。まだ残ってたのか。気になってapacheのaccess.logを久々に覗いてみたら、画像に直リンクされてるっぽいアクセスも気になる。いろいろ気になりだして止まらない。この辺りはapacheを使っているサーバーなら.htaccessで何とか出来るのではあるまいか。
画像の直リンクを禁止してみる。
画像の直リンクを禁止して、自サイトにだけ表示するように.htaccessに以下を追加してみる。
SetEnvIf Referer ".*ttbbsky.net" ref_own
<FilesMatch "\.(gif|jpe?g|png)">
Require env ref_own
</FilesMatch>
あらかじめ、”SetEnvIf”でリファラーが自分自身のアクセスに環境変数”ref_own”をセットする。”SetEnvIf “ディレクティブで、gif、jpeg、jpg、pngのいずれかの拡張子を持つファイルへのアクセスには、環境変数”ref_own”がセットされていることを要求するようにしてみた。
SNSや検索サイトのクローラーは許可する
これで画像への直アクセスには403が返されるようになる。しかし、ブログの記事をSNSで参照された場合、最近のSNSは自動的にアイキャッチ画像を取得して表示してくれたりするのだが、SNSから画像へのアクセスが禁止されているとその機能が使えなくなってしまう。例えば、wordpressでこんな感じにヘッダーでHTMLのメタ情報を設定しておけば、facebookやTwitterで共有されたときに画像が表示される。
<meta property="og:locale" content="ja_JP" />
<meta property="og:type" content="<?php echo $page_type; ?>" />
<meta property="og:title" content="<?php echo $title; ?>" />
<meta property="og:description" content="<?php if(is_single()){ echo mb_substr(str_replace("\n", "", strip_tags($post->post_content)), 0, 200) ."……"; }else{ bloginfo('description'); } ?>" />
<meta property="og:url" content="<?php echo (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>" />
<meta property="og:site_name" content="<?php bloginfo('name'); ?>" />
<meta property="og:image" content="<?php if(has_post_thumbnail() && is_single() ){ echo get_the_post_thumbnail_url(); }else{ echo get_template_directory_uri()."/images/teruteru_def.jpg"; } ?>" />
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:creator" content="@HundertSteine">
Twitterカードの画像表示はogプロパティの画像と共有できるので改めての指定はしていない。$titleや$page_typeは事前に判定ロジックを置いて設定する。これでTwitterとfacebookから引用されたら、アイキャッチが設定されていればアイキャッチが、設定されていなければデフォルト画像としてteruteru_def.jpgが付いて表示されるはずだ。しかし、.htaccessでTwitterbotまで弾いてしまうとTwitter上でカードが表示されなくなってしまう。
そこで、Twitterとfacebookのクローラーからのアクセスを許可してあげる。ついでにgoogleやbingの検索のクローラーにも環境変数を割り振って許可してあげる。
SetEnvIf Referer ".*ttbbsky.net" ref_own
SetEnvIF User-Agent Googlebot UA_google
SetEnvIF User-Agent Googlebot-Image UA_google
SetEnvIf User-Agent Twitterbot UA_twitter
SetEnvIf User-Agent facebookexternalhit UA_facebook
SetEnvIf User-Agent facebookplatform UA_facebook
SetEnvIf User-Agent bingbot UA_bing
<FilesMatch "\.(gif|jpe?g|png|stl|zip)">
Require env UA_google
Require env UA_twitter
Require env UA_facebook
Require env UA_bing
Require env ref_own
</FilesMatch>
ついでに、画像ファイルだけでなく、stlファイルやzipファイルへの直リンクもはじくようにしてみた。
サイト丸ごとパクられ問題への対処
サイトを丸ごとiframeなどで引用してクリックを盗む攻撃をクリックジャッキングいう。Twitterで一時期流行したLn.isつきのリンクなどがそれにあたる。外部からの埋め込みを禁止するにはヘッダーに沿う設定しておけばいい。.htaccessで以下のように記述可能だ。
Header append X-Frame-Options SAMEORIGIN
SetEnvIf Referer appengine.google.com google_appengine
<RequireAll>
Require all granted
Require not host .prlog.ru
Require not host .ln.is
Require not ip 82.80.230.228
Require not env google_appengine
</RequireAll>
ついでに、RequireAllディレクティブを追加し、全てのアクセスを許可したうえで気に入らないホスト名を個別にはじいてみた。ipアドレスを指定すると個別ipで弾くこともできる。先ほどと同じようにSetenvで環境変数をセットしておけば、ほかのディレクティブで繰り返し使うときに楽かもしれない。
これで、アクセスログを見て必要なものをはじいてしまっている場合には個別に許可を追加しつつ、気に入らないアクセスを個別に弾きつつ、.htaccessを秘伝のたれのように成長させていけば環境に応じてアクセスを捌いていけるだろう。しめしめ。