フォトスタンドソフトを便利にするために、インタネットにある画像を利用できるようにする開発をしており、壁紙を配信ししているサイトで、ユーザがこのアプリから使えるサイトを集めていた。Refererの扱いに技があるので紹介する。
HTTPにはRefererというヘッダがある。リンクを辿って到達した場合に、そのリンク元のページのURIがweb client側から報告される。サーバ側では、どこから来たかによって動作を変えるヒントになる。
でも、実際の使われ方としては、直リンクを禁止するためが殆どと思う。要するに、他のサイトから<img>や<a>タグとかで利用されたくない、ということ。もっと言うと、殆んどの場合は、画像が掲載orリンクしてある自ページを見て欲しい、ということだ。理由は、そこに貼ってある広告を表示して欲しいから。まぁ、放送局が広告抜きの録画をできないようにしろ、と言っているのと同じことだろう。
ユーザとしては、公開されているものは有効に使いたいわけです。それを利用するためにはどうしたら良いか。
大抵の場合は、ホスト名までのURLをリファラとして付けてやれば良いようです。サーバ側の処理としては、厳密にリンク元をチェックしたりするのはプログラム的に面倒なので、ホスト名をチェックしているだけなのでしょう。
wgetのラッパーの例、
function Wget() {
URI=""
WgetOptions="--tries=2 --dns-timeout=5 --connect-timeout=5 \
--read-timeout=20"
while [ z"$1" != z ]; do
case $1 in
-h*) echo "Usage: $0 [URL]"; return 1;;
-*) WgetOptions="$WgetOptions $1";;
*) URI=`echo $1 | sed 's/^[ \t]//g;s/^ttp/http/'`
ref=`echo $URI | sed 's|^\([^/]*://[^/]*/\)/*|\1|'`
if [ -z $ref -a z$ref != z$URI ]; then
Referer="--referer=$Refer"
else
Referer=""
fi
echo "$WgetOptions $Referer $URI"
wget $WgetOptions $Referer "$URI"
esac
shift;;
done
return $?
}
C#の例、
// add an basic referer of the uri
string[] rfs = this.pictureUri.Split(new Char[]{':','/'});
if (rfs.Length >= 4) {
string referer = rfs[0] + "://" + rfs[3] + "/";
client.Headers.Add("Referer", referer);
}
// download the picture.
client.DownloadFile(this.pictureUri, this.webPictureFile);
他にも、広告ページを経由しないでダウンロードすることを禁止する方法はあります。
- Cookieなどでセッション管理をする。
- 名前をランダムにする。(これは最近多いようですね)
- 「直リンする奴は非国民だ」とか、「威力業務妨害で訴えてやる」などとホームページに書く。
サービスを提供する人は、その提供の仕方に条件を付けることは自由です。従うも良し、法律の範囲内で利用するも良しでしょう。結局、私は不便なページを見ないようにしています。何も無理をしなくても、他に使い易いサイトはいくらでもありますので。個人的には、折角綺麗な写真やコンテンツを作ったのだったら、どんどん見てもらったほうが良いと思うのですが、損得絡みになると仕方ないのでしょうね。
日本では公的機関を始めとして、大抵のサイトではデフォルト何でも禁止になっています。意味も考えずに全部禁止にしておけば後腐れがない、利用などされなくても構わない、という感覚です。今回の中では、米国のnasaimages.orgが素晴しいライセンス条件です。また画像ではないですが、BBCなどは放送された音声や映像をフリーで提供していて素晴しい。そんな中で、日本では更に、フェアユースの概念がないので何をするにもグレーになりがちなのも嫌なことです。