Защита изображений на всем сайте. PHP+mod_rewrite

Тема в разделе "Статьи и Co", создана пользователем gid, 9 мар 2007.

Статус темы:
Закрыта.
  1. gid

    gid Прохожие

    На многих популярных сайтах с уникальным контентом, нередко можно увидеть, что почти на всех изображениях стоит либо картинка-логотип, либо подпись с названием сайта. Делается это для того, что бы хоть как то защитить сайт от недобросовестных веб-мастеров, забывающих указывать первоисточник материала. Очень актуален такой вид защиты для сайтов с уникальными галереями всевозможных картинок и изображений. Конечно, скажете вы, можно просто обрезать или замазать то место, где стоит подпись или логотип, но это все равно лучше, чем вообще не пытаться защитить свои изображения от посягательств со стороны конкурентов.

    Для реализации защиты изображений на всем сайте нужно будет использовать mod_rewrite + PHP. Идея данной защиты очень проста: mod_rewrite перенаправляет все запросы идущие к папке image, а php-скрипт, в зависимости от типа запрашиваемого файла, решает, что с ним делать – накладывать копирайт, если это изображение или не стоит, если это файл. Единственным минусом данного подхода является то, что все защищаемые изображения нужно хранить в отдельной папке, что бы mod_rewrite мог определить, нужно или нет защищать данное изображение. Если же вы вдруг захотите "пометить" все изображения на сайте, то приготовьтесь к тому, что от вашего графического дизайна, ничего на останется – все будет усеяно вашими копирайтами.

    И так, реализация данной защиты изображений на сайте проста, так же как и сама идея. Для начала дописываем в .htaccess пару строчек:
    RewriteEngine on
    RewriteBase /
    Options +FollowSymlinks

    RewriteRule ^image/(.*) image.protect.php?img_name=$1
    После добавления этих строчек в .htaccess все запросы идущие к папке image будут автоматически перенаправляться на php-скрипт, в переменной $img_name с указанием оставшейся части пути к файлу.


    PHP-скрипт тоже не слишком сложен для понимания, в нем реализованы функции защиты для основных типов изображений, который в основном используются в интернете:
    <?php
    /* http://wm-help.net/ */
    /* Функция для наложения на изображение своего копирайта в виде текста */
    /* для использования других шрифтов используйте imageloadfont() */
    function img_nalogenie(&$im, $img_info)
    {
    if ($img_info[0]>50 and $img_info[1]>20) /* проверка, влезит ли надпись */
    {
    $green = imagecolorallocate ($im, 0, 255, 0); // установка зеленого цвета
    imagestring($im, /* наше изображение */
    2, /* id шрифта (0-5 - системные), остальные грузятся через imageloadfont() */
    5, /* смещение по X */
    5, /* смещение по Y */
    "(c) wm-help.net", /* защитная надпись на изображении */
    $green); /* цвет выводимого текста */
    }
    }

    if (isset($img_name))
    {
    $img_name = "image/" . $img_name; /* дополнение пути */
    $info = @getimagesize($img_name); /* получение информации о изображении */
    $ext = @$info[2]; /* тип изображения */
    $header = @$info['mime']; /* правильный заголовок для использования в header() */

    switch($ext) /* выбор способа открытия по типу изображения */
    {
    case 1: // GIF
    {
    $im = @imagecreatefromgif($img_name); /* попытка открыть */
    if ($im) /* Открылось или нет */
    {
    header("Content-type: " . $header); /* отправляем заголовок */
    img_nalogenie($im, $info); /* накладываем свой текст на изображение */
    imagegif($im); /* выводим изображение в браузер */
    }
    break;
    }

    case 2: // JPG
    {
    $im = @imagecreatefromjpeg($img_name);
    if ($im)
    {
    header("Content-type: " . $header);
    img_nalogenie($im, $info);
    imagejpeg($im);
    }
    break;
    }

    case 3: // PNG
    {
    $im = @imagecreatefrompng($img_name);
    if ($im)
    {
    header("Content-type: " . $header);
    img_nalogenie($im, $info);
    imagepng($im);
    }
    break;
    }

    case 6: // BMP
    {
    $im = @imagecreatefromwbmp($img_name);
    if ($im)
    {
    header("Content-type: " . $header);
    img_nalogenie($im, $info);
    imagewbmp($im);
    }
    break;
    }
    default: /* если ничего не подошло */
    {
    $f = @file($img_name); /* пробуем считать файл */
    if ($f) /* если файл считался */
    {
    echo implode("", $f); /* выводим массив строкой */
    }
    break;
    }
    }
    }
    ?>

    Ну а для тех, у кого по какой-то причине данная защита изображений на всем сайте не работает, советую проверить: установлен ли на вашем хостинге mod_rewrite; правильно ли указанна директория с изображениями, в данном примере это – images; все ли вы правильно сделали.
    Скачать данный пример защиты изображений от плагиата можно здесь: http://wm-help.net/download/image.protect.zip
     
  2. saltru

    saltru Создатель

    Регистр.:
    19 фев 2007
    Сообщения:
    20
    Симпатии:
    1
    а как насчет кэша браузера?
     
  3. gid

    gid Прохожие

    Несовсем понимаю чем вас так волнует кэш, но если вы нехотите его сохранять, то перед switch() можно дописать следуещее:

    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // дата в прошлом
    header("Last-Modified: " . gmdate("D, d M Y H:i:s", 10000) . " GMT"); // 1 января 1970
    header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
    header("Cache-Control: post-check=0, pre-check=0", false); // еще раз, для надежности
    header("Pragma: no-cache"); // HTTP/1.0
    header("Content-Type:image/png");

    99% гарантия - что в кэш картинка не попадет.
     
  4. NickCC

    NickCC Писатель

    Регистр.:
    2 авг 2007
    Сообщения:
    7
    Симпатии:
    0
    Дело не в том что картинку не стащить, а то что к ним на лету цепляется подпись :read:
     
  5. WebSpider

    WebSpider Постоялец

    Регистр.:
    21 ноя 2006
    Сообщения:
    82
    Симпатии:
    1
    Все это конечно классно, но зачем создавать лишнюю и совсем ненужную нагрузку на сервер? Не проще ли поставить копирайт на картинку ОДИН раз и сохранить ее с тем же именем?
     
  6. tcp

    tcp Писатель

    Регистр.:
    10 июн 2007
    Сообщения:
    7
    Симпатии:
    0
    нагрузка будет бешенная для сайтов типа CJ. WebSpider дело говорит !
     
  7. censored!

    censored!

    Регистр.:
    3 авг 2007
    Сообщения:
    293
    Симпатии:
    106
    Тоже согласен. gd2 слишком много жрет. И на странице изображений требующих наложения много, и много страниц, и много пользователей. Вас хостер нафиг выгонет.
    И остаются варианты:
    1-й. Делать как и нормальные люди через photoshop (написав в нем простенький макрос - открыть изображение, сделать ниже рамочку, туда написать адрес сайта). И не забывать что в Фотошопе есть пакетная обработка! Т.е. написав макрос (порядок действий) потом натравить на папку с изображениями - он сам откроет и сделает все что вы выше записали в макрос.
    2-й. Использовать код выше, но его в начале и в конце дополнить. Чтобы при обращении к изображению проверялось - нету ли у нас уже его но с копирайтом. Если нету - то запустить наложение копирайта и сохранить в папку с изображениями которые уже обработаны. Если есть - то уже просто вывести.
    Но первый вариант все-равно будет лучше:
    - быстрее
    - размер файлов при сохранении в фотошопе (через Сохранить для Веб) гораздо меньше чем gd2 и качество лучше
    p.s. Тоже не понятно причем кэш браузера и наложение копирайта, но кэширование изображениям лучше сделать
     
  8. lobzik

    lobzik

    Регистр.:
    8 авг 2006
    Сообщения:
    311
    Симпатии:
    49
    Как у вас сложно все, лучше сделать что бы water marks накладывались на рисунок при постинге статьи или новости, при заливке картинки и сохранялась с этим водяным знвком раз и навсегда.
     
  9. Relikt

    Relikt Постоялец

    Регистр.:
    8 май 2007
    Сообщения:
    123
    Симпатии:
    5
    а как потом?

    А что делать если покупатель запросит картинки высокого качества? я просто выкладываю их с разрешением 92 дпи... это ни в газету ни в журнал.... да плюс еще джмпег компрессия... ваще для печати не годится... http://photo.rakurs.pl.ua
    А если уж один раз водяной знак накладывать... так ложи рядом картинку без него и высокого качества... только имя меняй...
     
  10. kaskader

    kaskader Постоялец

    Регистр.:
    31 окт 2007
    Сообщения:
    126
    Симпатии:
    33
    Да, и...
    printscreen никто не отменял!:)
     
Статус темы:
Закрыта.