Heim >Backend-Entwicklung >PHP-Tutorial >PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

藏色散人
藏色散人nach vorne
2022-11-21 17:25:502100Durchsuche

Dieser Artikel stellt Ihnen die Probleme im Zusammenhang mit PHP-Anti-Hotlinking vor. Der Hauptinhalt besteht darin, das Referrer-Prinzip und die Implementierungsmethode von Bild-Anti-Hotlinking zu erklären. ~

1 . Bild-Anti-Hotlinking

Auf einigen großen Websites, wie z. B. Baidu Tieba, gelten für die Bilder auf dieser Website Anti-Hotlinking-Regeln, sodass die Verwendung des folgenden Codes zu Fehlern führt. [Empfohlen: PHP-Video-Tutorial]

Einfacher Code:

<!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 realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)" >
</body>
</html>

Probleme:

PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

Der Grund für den Fehler

ist hauptsächlich, dass die Bilder auf dieser Website Anti-Hotlinking-Regeln anwenden. Auch diese Regel ist relativ einfach. Der Hauptgrund dafür ist, dass die Site, wenn sie erfährt, dass eine Anfrage vorliegt, zunächst die Informationen im Anfrageheader ermittelt Im Anforderungsheader wird dann ermittelt, ob die Referrer-Header-Informationen auf seinen eigenen Regeln basieren. Wenn die Anforderungen erfüllt sind, handelt es sich bei den Referrer-Informationen um die Quelladresse der Anforderung für das Bild.

Header-Informationen im Browser anfordern:

(1) Verwenden Sie normalerweise Baidu Tieba, um die Header-Informationen des Bildes anzuzeigen.

PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

(2) Header-Informationen meines Codes

PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

Ich glaube, die Leser sehen das Ich verstehe, warum mein Code nicht auf das Bild zugreifen kann, zeigt aber eine Warnung zum Hotlinking an, da sich unsere Referrer-Header-Informationen von denen von Baidu Tieba unterscheiden. Wenn meine Anfrage gesendet wird, überprüft die Site die Referer-Header-Informationen Die Quelle stammte nicht von dieser Seite, ich wurde zu einem anderen Bild weitergeleitet.

Konfigurieren Sie den Bild-Hotlink-Schutz für Ihre Site:

(1) Aktivieren Sie das mod_rewrite-Modul im Webserver

#LoadModule rewrite_module module/mod_rewrite.so, //Entfernen Sie das # vor und starten Sie dann den Server neu

( 2) Schreiben Sie in die Website oder das Verzeichnis, die vor Diebstahl geschützt werden müssen, eine .htaccess-Datei und legen Sie die Anti-Hotlinking-Regeln fest

Schritte:

Erstellen Sie eine neue .htaccess-Datei und verwenden Sie „Speichern unter“ in Windows, um diese Datei zu erstellen
Suchen Sie das Handbuch unter „Regelmäßiges Urteilsvermögen verwenden“

, um Regeln in der .htaccess-Datei anzugeben:

Wenn es sich um eine Bildressource handelt und die Referrer-Header-Informationen von dieser Site stammen, verwenden Sie

, um die Regeln wie folgt umzuschreiben:

Unter der Annahme, dass mein Server localhost ist, bedeutet die Regel: Wenn die Anforderung eine Bildressource betrifft, die Quelle der Anforderung jedoch nicht von dieser Site stammt, wird sie zu einem Bild ohne PNG im aktuellen Verzeichnis umgeleitet

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} .*.(jpg|jpeg|png |gif) [NC]
RewriteCond %{HTTP_REFERER} !localhost [NC]
RewriteRule .* no.png

Besuche von localhost:

PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

Besuche von anderen Websites:

PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

An diesem Punkt haben wir das Wissen über Anti-Hotlinking erlernt, aber beeilen Sie sich nicht, da es sich um einen Anforderungsheader handelt, der natürlich gefälscht werden kann Sprechen Sie über die Anti-Hotlinking-Regeln.

2. Anti-Hotlinking

Mein Server ist mit Bild-Anti-Hotlinking konfiguriert. Wenn wir beim Sammeln von Bildern auf eine Website stoßen, die Anti-Hotlinking verwendet Sie können beim Sammeln von Bildern einen Referer-Header fälschen.

Der folgende Code lädt ein Bild von einer Website herunter, die mit Bild-Hotlink-Schutz konfiguriert ist.

<?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";
?>

Das Ergebnis des Herunterladens ohne Hinzufügen von Referrer-Header-Informationen:

PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

Das Ergebnis des Herunterladens mit Referer-Header-Informationen:

PHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode)

Wenn Sie dies sehen, sollten Sie entsprechend erkennen können, wie Sie dies verhindern können Beim Hotlinking handelt es sich tatsächlich um das Hinzufügen von Referrer-Header-Informationen. Wo kann ich dann die Referer-Header-Informationen für jede Site finden? Dies sollte durch Paketerfassung und -analyse herausgefunden werden!

3. Gekapselte HTTP-Anfrageklasse

<?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);
}*/
?>

Das obige ist der detaillierte Inhalt vonPHP+Referer realisiert die Verhinderung von Bild-Hotlinks! (Beigefügt mit Beispielcode). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen