PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)
この記事では、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="/static/imghw/default1.png" data-src="http://imgsrc.baidu.com/forum/pic/item/03a4462309f79052204229be04f3d7ca7acbd5d5.jpg" class="lazy" / alt="PHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)" > </body> </html>
#エラーの理由
主な理由は、このサイトの画像がホットリンク防止ルールを採用しているためです。実際、このルールは比較的単純です。一度説明すればすぐにわかるでしょう。主な理由リクエストがあったことをサイトが認識している場合は、まずリクエストヘッダーの情報を判断し、リクエストヘッダーにReferer情報があれば、そのRefererヘッダー情報が要件を満たしているかどうかを独自の基準で判断します。リファラー情報は、要求されたイメージのソース アドレスです。
ブラウザでのリクエスト ヘッダー情報:
(1) 通常、画像のリクエスト ヘッダー情報を表示するには、Baidu Tieba を使用します。
(2) 私のコードのヘッダー情報
これを見れば、私のコードが画像にアクセスできないのに、ホットリンクの警告が表示される理由が読者には理解できると思います。 画像の場合、 Referer ヘッダー情報が Baidu Tieba のそれと異なるため、リクエストが送信されると、サイトは Referer ヘッダー情報をチェックし、ソースがこのサイトではないことを確認すると、別の画像にリダイレクトします。
独自のサイトの画像アンチホットリンクを構成します:
(1) Web サーバーで mod_rewrite モジュールを有効にします
#LoadModule rewrite_module modules/mod_rewrite.so, //前述の部分を置き換えます # を削除してサーバーを再起動します
#(2) 盗難から保護する必要がある Web サイトまたはディレクトリに .htaccess ファイルを記述し、リーチ防止ルールを指定します手順:.htaccess ファイルを作成し、Windows の名前を付けて保存メソッドを使用して新しいファイルを作成します。マニュアルを検索し、通常のルールを使用して .htaccess ファイル内で判断します
ルールを指定します:
RewriteCond %{SCRIPT_FILENAME} .*\.(jpg|jpeg|png| gif) [NC]
RewriteCond %{HTTP_REFERER} !localhost [NC]RewriteRule .* no.png
ローカルホストからのアクセス:
2. ホットリンク対策
#私のサーバーは画像のホットリンク対策が設定されています。次に、それを使用してホットリンク対策について説明します。写真を収集する際に、アンチホットリンク技術を使用するサイトに遭遇したときに、Referer ヘッダーを偽造する可能性があります。 以下のコードは、画像のアンチホットリンクが設定されたサイトから画像をダウンロードします。
<?php /** * 下载图片 * @author webbc */ require './Http.class.php';//这个类是我自己封装的一个用于HTTp请求的类 $http = new Http("http://localhost/booledu/http/apple.jpg"); //$http->setHeader('Referer:http://tieba.baidu.com/');//设置referer头 $res = $http->get(); $content = strstr($res,"\r\n\r\n"); file_put_contents('./toutupian.jpg',substr($content,4)); echo "ok"; ?>
Referer ヘッダー情報なしのダウンロード結果:
Referer ヘッダー情報ありのダウンロード結果:3. カプセル化された HTTP リクエスト クラス
<?php /** * Http请求类 * @author webbc */ class Http{ const CRTF = "\r\n"; private $errno = -1; private $errstr = ''; private $timeout = 5; private $url = null;//解析后的url数组 private $version = 'HTTP/1.1';//http版本 private $requestLine = array();//请求行信息 private $header = array();//请求头信息 private $body = array();//请求实体信息 private $fh = null;//连接端口后返回的资源 private $response = '';//返回的结果 //构造函数 public function __construct($url){ $this->connect($url); $this->setHeader('Host:'.$this->url['host']);//设置头信息 } //通过URL进行连接 public function connect($url){ $this->url = parse_url($url);//解析url if(!isset($this->url['port'])){ $this->url['port'] = 80; } $this->fh = fsockopen($this->url['host'],$this->url['port'],$this->errno,$this->errstr,$this->timeout); } //设置请求行信息 public function setRequestLine($method){ $this->requestLine[0] = $method.' '.$this->url['path'].' '.$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('GET');//设置请求行 $this->request();//发送请求 $this->close();//关闭连接 return $this->response; } //发送请求 private function request(){ //拼接请求的全部信息 $reqestArr = array_merge($this->requestLine,$this->header,array(''),$this->body,array('')); $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('Content-Type:application/x-www-form-urlencoded'); //设置Content-Length $this->setHeader('Content-Length:'.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 = 'abcdefghijklmnopqrstuvwxyz0123456789'; 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).'@qq.com'; $content = substr($str,10); $message = "发表"; $http->post(array('username'=>$username,'email'=>$email,'content'=>$content,'message'=>$message)); //sleep(0.1); }*/ ?>
以上がPHP+Refererで画像ホットリンク防止を実現! (サンプルコードを添付)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。
