BASIC認証やIP制限をかけているサイトのOGPをFacebookで表示する(FacebookのIPアドレスリスト)

9.24
2013

ogp_basic

BASIC認証やIP制限などのアクセス制限がかかっているページのOGPの情報をFacebookで参照しても、エラーとなり取得ができません。
なので、それらの動作検証を行うには一度アクセス制限を解除しなければいけない・・・と思っていたのですが、どうやらウラワザ(でもないか)的な方法があるようです。
昔からあった方法みたいなんですが、最近まで知りませんでした。

方法は単純で、Facebookのクローラーだけ、BASIC認証やIP制限を許可すればいいようです。
BASIC認証を使って簡単にテストしてみました。

BASIC認証のかかったページのOGP取得テスト

↑このページに、適当なBASIC認証をかけています。
このURLをFacebookのデバッガーにかけると、通常だとFacebookのクローラーもアクセスできないために、TOP画像のようなエラーになります。
しかし、FacebookのクローラーだけはBASIC認証を通過(許可)するようにApacheの設定を入れることで、BASIC認証をかけたままOGP情報を取得することが出来ます。

ogp_basic2

正しく設定されれば、上記の画面のようにステータスコードが200系に変わります。

AuthType     Basic
AuthName     "TEST WEB"
AuthUserFile  /*****/.htpasswd
require valid-user

Satisfy Any
Order Allow,Deny

SetEnvIf User-Agent "^facebookexternalhit.*$" fb_crawler
SetEnvIf User-Agent "^facebookplatform.*$" fb_crawler
Allow from env=fb_crawler

こんな感じの記述をhtaccessに記入します。
Facebookのクローラーかどうかの判別は、「User Agent」で行っています。
「facebookexternalhit」だけで良いとする記事もありますが、今回実験した際にはそれだけではうまくいかず、「facebookplatform」も許可して初めて取得できるようになりました。

なお、User Agentはある程度偽装できてしまうものなので、当然ですがこのような設定をすることである程度セキュリティ的には落ちます。
そのあたりを気にする場合は、BASIC認証ではなくIPアドレスによる制限を行いましょう。
ホワイトリストとして登録しているIPアドレスの一覧に、FacebookのクローラーのIPアドレスも追加すればOK。

Application Security – Facebook開発者

IPアドレスは↑の公式docsにも載っていますが、掲載されているものは古いようです。
で、docs内に記載もありますが、最新のIPアドレスのリストはwhoisコマンドで確認しろ、とあります。

whois -h whois.radb.net -- '-i origin AS32934' | grep ^route

まあ、なんのことはない、「Merit RADb」のデータベースから検索してるだけですので、コマンドによる確認ができない場合には、Webからも確認可能です。
※Merit RADbという会社が何者なのか、はJPINICのホームページに解説があります。

  1. Merit RADb」にアクセス
  2. サイト上部の「Advanced Query」というリンクをクリック
  3. 検索オプションがたくさん出てきますが、そのうちの「-i inverse query by: [ –object class– ]」という項目にチェック
  4. [ –object class– ]は、[ origin ]を選択
  5. キーワード欄に「 AS32934 」を入力

こうすることで、検索結果に大量にFacebookが持つIPアドレスの一覧が出てきます。
参考までに、以下は9/24現在で出てきたもの。

  • 204.15.20.0/22
  • 69.63.176.0/20
  • 66.220.144.0/20
  • 66.220.144.0/21
  • 69.63.184.0/21
  • 69.63.176.0/21
  • 74.119.76.0/22
  • 69.171.255.0/24
  • 173.252.64.0/18
  • 69.171.224.0/19
  • 69.171.224.0/20
  • 103.4.96.0/22
  • 69.63.176.0/24
  • 173.252.64.0/19
  • 173.252.70.0/24
  • 31.13.64.0/18
  • 31.13.24.0/21
  • 66.220.152.0/21
  • 66.220.159.0/24
  • 69.171.239.0/24
  • 69.171.240.0/20
  • 31.13.64.0/19
  • 31.13.64.0/24
  • 31.13.65.0/24
  • 31.13.67.0/24
  • 31.13.68.0/24
  • 31.13.69.0/24
  • 31.13.70.0/24
  • 31.13.71.0/24
  • 31.13.72.0/24
  • 31.13.73.0/24
  • 31.13.74.0/24
  • 31.13.75.0/24
  • 31.13.76.0/24
  • 31.13.77.0/24
  • 31.13.96.0/19
  • 31.13.66.0/24
  • 173.252.96.0/19
  • 69.63.178.0/24
  • 31.13.78.0/24
  • 31.13.79.0/24
  • 31.13.80.0/24
  • 31.13.82.0/24
  • 31.13.83.0/24
  • 31.13.84.0/24
  • 31.13.85.0/24
  • 31.13.86.0/24
  • 31.13.87.0/24
  • 31.13.88.0/24
  • 31.13.89.0/24
  • 31.13.90.0/24
  • 31.13.91.0/24
  • 31.13.92.0/24
  • 31.13.93.0/24
  • 31.13.94.0/24
  • 31.13.95.0/24
  • 69.171.253.0/24
  • 69.63.186.0/24
  • 31.13.81.0/24
  • 204.15.20.0/22
  • 69.63.176.0/20
  • 69.63.176.0/21
  • 69.63.184.0/21
  • 66.220.144.0/20
  • 69.63.176.0/20
  • 2620:0:1c00::/40
  • 2a03:2880::/32
  • 2401:DB00::/32
  • 2a03:2880:fffe::/48
  • 2a03:2880:ffff::/48
  • 2620:0:1cff::/48
  • 2a03:2880:f000::/48
  • 2a03:2880:f001::/48
  • 2a03:2880:f002::/48
  • 2a03:2880:f003::/48
  • 2a03:2880:f004::/48
  • 2a03:2880:f005::/48
  • 2a03:2880:f006::/48
  • 2a03:2880:f007::/48
  • 2a03:2880:f008::/48
  • 2a03:2880:f009::/48
  • 2a03:2880:f00a::/48
  • 2a03:2880:f00b::/48
  • 2a03:2880:f00c::/48
  • 2a03:2880:f00d::/48
  • 2a03:2880:f00e::/48
  • 2a03:2880:f00f::/48
  • 2a03:2880:f010::/48
  • 2a03:2880:f011::/48
  • 2a03:2880:f012::/48
  • 2a03:2880:f013::/48
  • 2a03:2880:f014::/48
  • 2a03:2880:f015::/48
  • 2a03:2880:f016::/48
  • 2a03:2880:f017::/48
  • 2a03:2880:f018::/48
  • 2a03:2880:f019::/48
  • 2a03:2880:f01a::/48
  • 2a03:2880:f01b::/48
  • 2a03:2880:f01c::/48
  • 2a03:2880:f01d::/48
  • 2a03:2880:f01e::/48
  • 2a03:2880:f01f::/48