htaccess log запрещен доступ - PullRequest
       16

htaccess log запрещен доступ

2 голосов
/ 09 августа 2011

В моем .htaccess есть пара строк, которые блокируют горячее связывание изображений. Это прекрасно работает. Однако мне любопытно узнать, кто это делает.

Есть ли возможность для меня регистрировать HTTP_REFERER при срабатывании RewriteRule?

Спасибо

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

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

Я бы перенаправил бы горячие линкеры через RewriteRule на указанный сайт PHP, а затем обработал и сохранил данные, такие как IP-адрес ($ _SERVER ['REMOTE_ADDR']), реферер ($ _SERVER ['HTTP_REFERER') ]), пользовательский агент ($ _SERVER ['HTTP_USER_AGENT']) и отметка времени посещения базы данных (например, MySQL) ИЛИ одного файла.
Но вы должны позаботиться о том, чтобы не перегружать сервер большим количеством записей в базу данных / файл (если имеется много горячих ссылок).

Я проверил свое решение ниже, оно работает.

.htaccess file:

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

log_hotlinkers.php файл:

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

?>

В MySQL моя таблица 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;

Вы можете проверить хотлинкинг здесь: Проверка хотлинков .
Я надеюсь, что это было полезно.

1 голос
/ 09 августа 2011

Я не знаю о возможности что-то записать в журнал командой .htacess.Я думаю, что проще всего проанализировать файлы apache access.log.Он должен содержать REFERER уже, если нет, использовать директиву LogFormat .

1 голос
/ 09 августа 2011

Все журналы запрещенного доступа уже находятся в вашем файле access.log.Он должен быть доступен из клиентской панели вашего хостинга.

Если у вас нет к ним доступа, единственным решением будет перенаправить эти запросы в php-файл (или другой скрипт), который бы регистрировал их иотправить запрещенный заголовок в браузер.

...