3

なぜこれが機能しないのか、頭を悩ませています。

私が達成したいのは、Facebook などの特定の Web サイトから来た場合にのみ、自分の Web サイトのページへのアクセスを制限することです。

リンクは 1 つ以上の Facebook ページおよび/または私の個人プロファイルに投稿されるため、Facebook および/または投稿された他の「ページ」からのものである場合は、スクリプトを実行する必要があります。

たとえば、自分のリンクをwww.facebook.com/This_is_my_PAGEに投稿した場合、または自分の個人プロファイルwww.facebook.com/freds_personal_profileに投稿した場合、または誰かが私のリンクを Facebook で共有した場合、Facebook から来た人だけがページにアクセスできるようにします。ドメイン。

解決策を探しているときに以下のスクリプトを見つけましたが、問題のリンクにリダイレクトされるのではなく、エラー メッセージが表示されます。

$target_site = 'https://www.facebook.com/';
if (isset($_SERVER['HTTP_REFERER']) && preg_match("/$target_site/",$_SERVER['HTTP_REFERER'])) {
// do something with people from facebook.com
} 

else {
// do something else with everyone else

echo "Sorry, viewable to Facebook fans only.";

}
4

2 に答える 2

5

まず第一に、次の理由により、コードに欠陥があります。

  • ユーザーが Facebook の「安全なバージョン」(https ではなく http) を使用していない場合はどうなりますか?
  • facebook.comユーザーがではなくから来ている場合はどうなりますwww.facebook.comか?
  • 悪意のあるユーザーが、ユーザーをだまして のようなサイトからアクセスさせようとしている場合はどうなるhttp://example.com/evilpage.php?https://www.facebook.com/でしょうか?

機能しない主な理由は、正規表現が完全に無効であるためです。代わりに、次のようにする必要があります。

preg_match("/".preg_quote($target_site,"/")."/i",$_SERVER['HTTP_REFERER']);

(のドキュメントpreg_quote())

これ以外に、リファラーのチェックにはセキュリティがありません。変更することも、完全にブロックすることもできます。依存すべきではありません。

于 2012-06-13T19:54:08.827 に答える
1

Facebook は外部リンクをhttpプロトコルに接続しますが、https. ターゲット サイトを次のように変更します。

$target_site = 'http://www.facebook.com/';

これは、facebook に投稿されたリンクを右クリックしてクリップボードにコピー (貼り付け) することで確認できます。次のようになります。

`http://www.facebook.com/l.php?u=...`

これは、実際にhttpsまたはでブラウジングしているかどうかに関係なく当てはまりますhttp

于 2012-06-13T19:53:14.643 に答える