rNote のオリジナルコードでは、単一記事モードで記事を閲覧したとき、

function RefererCheck()

の中で、有効なリファラか判定するために、

if(!ereg("^https?://.{6,}",$HTTP_REFERER)) return;

となっている。 ’//’ のあとに、任意の6文字以上があれば有効と見做している。

しかし、「ドメイン名の文字数と使える文字の制限」に書いたように、 http://a.cn/ など、1文字ドメインからのアクセスを考えると、これではまずい。

その部分を、

if (!preg_match("/^https?:\/\/([[:alnum:]-&#;%\.\\\\]+\.|)[[:alnum:]-&#;%\\\\]+\.[[:alnum:]-&#;%\\\\]+([\/]?|\/[[:alnum:]-_&=%#!?;~:@\/\$\.\"\']+|\.|)$/", $HTTP_REFERER)) return;

と変更する。

これで、少なくとも第2レベルドメインまで存在し、

http://foo.jp
http://foo.jp.
http://foo.jp/
http://www.foo.jp/
http://www.foo.bar.jp/
http://foo.jp/bar
http://foo.jp/bar.php
http://foo.jp/bar.php?u=sample
http://foo.jp/bar.php?u=sample&date=2018-12

などの形式の場合に有効なリファラと判断するようになる。

数値参照でエンコードされてきた場合などを考えて、ラベルには「%&#;\」などを追加してあるが、必要ないかもしれない。

キーワード: rNote リファラ referer