2011-08-09 7 views
2

私は、私の.htaccessにイメージのホットリンクをブロックする行がいくつかあります。 これは素晴らしいです。しかし、私は誰がそれをやっているかを知ることは興味があります。htaccess log forbidden access

RewriteRuleがトリガーされたときにHTTP_REFERERを記録する可能性はありますか?

おかげ

RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain.com/.*$ [NC] 
RewriteRule \.(gif|jpg|png)$ - [F,NC,L] 
+0

既に書いてある書き換えルールを共有するので、これを行う方法を提案できます。 – Shef

答えて

1

.htacessコマンドで何かがログに記録される可能性についてはわかりません。私は最も簡単なのは、apacheのaccess.logファイルを分析することだと思います。既にREFERERを含める必要があります。そうでない場合はLogFormat directiveを使用してください。

1

すべて禁じアクセスログは、あなたのaccess.logファイルに既にあります。 ホスティングのクライアントパネルからアクセス可能である必要があります。

アクセス権がない場合は、これらの要求をPHPファイル(または他のスクリプト)にリダイレクトしてログに記録し、ブラウザに禁止ヘッダーを送信することが唯一の解決策です。

2

私は、特定のPHPサイトへのRewriteRule経由ホットリンカーをリダイレクトし、処理し、IPアドレス($ _SERVER [ 'REMOTE_ADDR'])、リファラ($ _SERVER [ 'HTTP_REFERER'])のようなデータを保存しますユーザエージェント($ _SERVER ['HTTP_USER_AGENT'])を呼び出し、データベース(例えば、MySQL)のタイムスタンプまたは単一のファイルにアクセスします。
しかし、多くのデータベース/ファイル書き込み(ホットリンクが多数ある場合)を使用してサーバーを過負荷にしないように注意する必要があります。

私のソリューションは以下の通りテストしました。

.htaccessファイル:

RewriteEngine On 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?domain.com/.*$ [NC] 
RewriteRule .*\.(jpe?g|gif|bmp|png)$ log_hotlinkers.php [L] 

log_hotlinkers.phpファイル:MySQLで

<?php 

    // I use PDO with a wrapper class 
    require_once($_SERVER['DOCUMENT_ROOT'].'/PHP/classes/class.DB.php'); 

    $session_return_value = session_start(); 

    // is is already stored (per session)? 
    $is_stored = (bool)!empty($_SESSION['user_visit_stored']); 

    // we store this hotlinker only once per session 
    if(!$is_stored){ 

     // IP address 
     $IP_address = $_SERVER['REMOTE_ADDR']; 
     // user agent variable is not always set, in this case we set variable to "unknown" 
     $HTTP_USER_AGENT = !empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'unknown'; 

     // session id 
     $session_id = session_id();    

     // the $_SERVER['HTTP_REFERER'] variable is not always set (in this case we will store it with a NULL value) 
     $HTTP_REFERER = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'NULL'; 



     // we store hotlinker's data in MySQL database (e.g. in a table called hotlinkers with an auto_increment id with the following fields) 

     $query = 'INSERT INTO hotlinkers (IP_address, user_agent, session_id, HTTP_REFERER) '; 
     $query .= '  VALUES (:REMOTE_ADDR, :HTTP_USER_AGENT, :session_id, :HTTP_REFERER) ;'; 

     // I use PDO with a wrapper class 
     $stmt = DB::getDB()->prepare($query); 
     $stmt->bindParam(':REMOTE_ADDR',  $IP_address);  // IP address 
     $stmt->bindParam(':HTTP_USER_AGENT', $HTTP_USER_AGENT); // user agent 
     $stmt->bindParam(':session_id',  $session_id);  // session_id() 
     $stmt->bindParam(':HTTP_REFERER', $HTTP_REFERER); // referer 

     $exec_result = $stmt->execute(); 
     if($exec_result){ 
      // we store that agent is beállítjuk a megfelelő session-változót: a látogató eltárolva 
      $_SESSION['user_visit_stored'] = true; 
      $_SESSION['user_visit_time'] = time(); 
     } 
     else{ 
      // throw new PDOException('Couldn\'t store hotlinker\'s data...'); 
     } 
    } 

    // we output another image which signs blocking 

    $path = './block-hotlinking-image.png'; 

    $im = imagecreatefrompng($path); 

    header('Content-Type: image/png'); 

    imagepng($im); 
    imagedestroy($im); 

?> 

、私のhotlinkerテーブルの構造は以下の通りです:

CREATE TABLE `hotlinkers` (
    `id` int(11) not null auto_increment, 
    `IP_address` varchar(40) not null default '0.0.0.0', 
    `visit_timestamp` timestamp not null default CURRENT_TIMESTAMP, 
    `user_agent` text not null, 
    `session_id` char(32) not null, 
    `HTTP_REFERER` varchar(255), 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; 

テストホットリンクここにHotlink checkerがあります。
これは役に立ちましたと思います。