ホームページ  >  記事  >  バックエンド開発  >  PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)

PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)

藏色散人
藏色散人転載
2022-11-21 17:25:502043ブラウズ

この記事では、PHP のホットリンク対策に関する問題を紹介します。主な内容は、Referer の原理と画像のホットリンク対策の実装方法を説明することです。困っている友人に役立つことを願っています~

1、画像のアンチホットリンク

##Baidu Tieba などの一部の大規模 Web サイトでは、このサイトの画像にアンチホットリンク ルールが採用されています。そのため、次のコードを使用するとエラーが発生します。 [推奨:

PHP ビデオ チュートリアル ]

簡単なコード:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title></title>
  <link rel="stylesheet" href="">
</head>
<body>
  <!--引用一张百度贴吧的图片-->
  <img  src="http://imgsrc.baidu.com/forum/pic/item/03a4462309f79052204229be04f3d7ca7acbd5d5.jpg"/ alt="PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)" >
</body>
</html>
問題:

PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)#エラーの理由

主な理由は、このサイトの画像がホットリンク防止ルールを採用しているためです。実際、このルールは比較的単純です。一度説明すればすぐにわかるでしょう。主な理由リクエストがあったことをサイトが認識している場合は、まずリクエストヘッダーの情報を判断し、リクエストヘッダーにReferer情報があれば、そのRefererヘッダー情報が要件を満たしているかどうかを独自の基準で判断します。リファラー情報は、要求されたイメージのソース アドレスです。

ブラウザでのリクエスト ヘッダー情報:

(1) 通常、画像のリクエスト ヘッダー情報を表示するには、Baidu Tieba を使用します。

PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付) (2) 私のコードのヘッダー情報

PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付) これを見れば、私のコードが画像にアクセスできないのに、ホットリンクの警告が表示される理由が読者には理解できると思います。 画像の場合、 Referer ヘッダー情報が Baidu Tieba のそれと異なるため、リクエストが送信されると、サイトは Referer ヘッダー情報をチェックし、ソースがこのサイトではないことを確認すると、別の画像にリダイレクトします。

独自のサイトの画像アンチホットリンクを構成します:

(1) Web サーバーで mod_rewrite モジュールを有効にします

#LoadModule rewrite_module modules/mod_rewrite.so, //前述の部分を置き換えます # を削除してサーバーを再起動します

#(2) 盗難から保護する必要がある Web サイトまたはディレクトリに .htaccess ファイルを記述し、リーチ防止ルールを指定します

手順:

.htaccess ファイルを作成し、Windows の名前を付けて保存メソッドを使用して新しいファイルを作成します。

マニュアルを検索し、通常のルールを使用して .htaccess ファイル内で判断します

ルールを指定します:

If it is 画像リソースとリファラーヘッダー情報がこのサイトからのものである場合、

による書き換えルールは次のとおりです:

私のサーバーは localhost で、ルールの意味は、リクエストが画像リソースに対するものである場合、リクエストのソースがこのサイトではない場合、現在のディレクトリ内の no.png 画像にリダイレクトされるということです。 #RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} .*\.(jpg|jpeg|png| gif) [NC]

RewriteCond %{HTTP_REFERER} !localhost [NC]

RewriteRule .* no.png

ローカルホストからのアクセス:


# 他のサイトからの訪問:

PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)

この時点で、リーチ対策についての学習は終わりましたが、心配する必要はありません。これはリクエスト ヘッダーなので、もちろん偽造することができます。はい、以下でホットリンク対策ルールについて話しましょう。

PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)2. ホットリンク対策

#私のサーバーは画像のホットリンク対策が設定されています。次に、それを使用してホットリンク対策について説明します。写真を収集する際に、アンチホットリンク技術を使用するサイトに遭遇したときに、Referer ヘッダーを偽造する可能性があります。 以下のコードは、画像のアンチホットリンクが設定されたサイトから画像をダウンロードします。

<?php
/**
 * 下载图片
 * @author webbc
 */
require &#39;./Http.class.php&#39;;//这个类是我自己封装的一个用于HTTp请求的类
$http = new Http("http://localhost/booledu/http/apple.jpg");
//$http->setHeader(&#39;Referer:http://tieba.baidu.com/&#39;);//设置referer头
$res = $http->get();
$content = strstr($res,"\r\n\r\n");
file_put_contents(&#39;./toutupian.jpg&#39;,substr($content,4));
echo "ok";
?>

Referer ヘッダー情報なしのダウンロード結果:

Referer ヘッダー情報ありのダウンロード結果:

PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)

同様に、これを見れば、ホットリンクを防ぐ方法がわかるはずです。実際には、Referer ヘッダー情報を追加することです。では、Referer ヘッダーはどこにありますか?各サイトの情報は?これは、パケット キャプチャと分析を通じて把握する必要があります。

PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)3. カプセル化された HTTP リクエスト クラス

<?php
/**
 * Http请求类
 * @author webbc
 */
class Http{
  const CRTF = "\r\n";
  private $errno = -1;
  private $errstr = &#39;&#39;;
  private $timeout = 5;
  private $url = null;//解析后的url数组
  private $version = &#39;HTTP/1.1&#39;;//http版本
  private $requestLine = array();//请求行信息
  private $header = array();//请求头信息
  private $body = array();//请求实体信息
  private $fh = null;//连接端口后返回的资源
  private $response = &#39;&#39;;//返回的结果
  //构造函数
  public function __construct($url){
    $this->connect($url);
    $this->setHeader(&#39;Host:&#39;.$this->url[&#39;host&#39;]);//设置头信息
  }
  //通过URL进行连接
  public function connect($url){
    $this->url = parse_url($url);//解析url
    if(!isset($this->url[&#39;port&#39;])){
      $this->url[&#39;port&#39;] = 80;
    }
    $this->fh = fsockopen($this->url[&#39;host&#39;],$this->url[&#39;port&#39;],$this->errno,$this->errstr,$this->timeout);
  }
  //设置请求行信息
  public function setRequestLine($method){
    $this->requestLine[0] = $method.&#39; &#39;.$this->url[&#39;path&#39;].&#39; &#39;.$this->version;
  }
  //设置请求头信息
  public function setHeader($headerLine){
    $this->header[] = $headerLine;
  }
  //设置请求实体信息
  public function setBody($body){
    $this->body[] = http_build_query($body);
  }
  //发送get请求
  public function get(){
    $this->setRequestLine(&#39;GET&#39;);//设置请求行
    $this->request();//发送请求
    $this->close();//关闭连接
    return $this->response;
  }
  //发送请求
  private function request(){
    //拼接请求的全部信息
    $reqestArr = array_merge($this->requestLine,$this->header,array(&#39;&#39;),$this->body,array(&#39;&#39;));
    $req = implode(self::CRTF,$reqestArr);
    //print_r($req);die;
    fwrite($this->fh,$req);//写入信息
    //读取
    while(!feof($this->fh)){
      $this->response .= fread($this->fh,1024);
    }
  }
  //发送post请求
  public function post($body = array()){
    //设置请求行
    $this->setRequestLine("POST");
    //设置实体信息
    $this->setBody($body);
    //设置Content-Type
    $this->setHeader(&#39;Content-Type:application/x-www-form-urlencoded&#39;);
    //设置Content-Length
    $this->setHeader(&#39;Content-Length:&#39;.strlen($this->body[0]));
    //请求
    $this->request();
    $this->close();//关闭连接
    return $this->response;
  }
  //关闭连接
  public function close(){
    fclose($this->fh);
  }
}
//测试get
// $http = new Http("http://news.163.com/16/0915/10/C10ES2HA00014PRF.html");
// $result = $http->get();
// echo $result;
//测试post
/*set_time_limit(0);
$str = &#39;abcdefghijklmnopqrstuvwxyz0123456789&#39;;
while(true){
  $http = new Http("http://211.70.176.138/yjhx/message.php");
  $str = str_shuffle($str);
  $username = substr($str,0,5);
  $email = substr($str,5,10).&#39;@qq.com&#39;;
  $content = substr($str,10);
  $message = "发表";
  $http->post(array(&#39;username&#39;=>$username,&#39;email&#39;=>$email,&#39;content&#39;=>$content,&#39;message&#39;=>$message));
  //sleep(0.1);
}*/
?>

以上がPHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。