Защита JPG-файлов от копирования с помощью Exif и IPTC-тегов

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем привет! На связи Павел Стариков Fullstack-разработчик digital-агентства Webit. Представьте, вы потратили целый день на создание хороших фотографий для статьи на сайте. Выставили свет, поставили «на уши» множество людей, долго работали в «фотошопе». Фотографии получились отличные, вот только спустя год Яндекс внезапно присылает фильтр «малополезный контент», при этом другие статьи, которые своровали нашу картинку – на первых местах по SEO-высокочастотным запросам. Обидно, не правда ли?

Для предотвращения подобных ситуаций поисковые системы обращают внимания на текстовые мета-теги, которые можно записать в каждую фотографию. Основной формат изображений – JPEG имеет сразу несколько механизмов. Как Exif-данные, содержащие сведения об авторе, камере, дате изменения, так и менее известный стандарт IPTC, который хранит данные в двоичном формате.

В статье я расскажу:

  • про каждый формат, его особенности;

  • как прочитать и записать данные;

  • приведём примеры PHP-кода, который был неоднократно протестирован нами и с легкостью встраивается в любые популярные CMS, такие как Wordpress или Битрикс.

Exif-теги

Exif-теги (Сокращение от Exchangeable Image File Format) являются самыми известными «тегами» - текстовыми данными в файлах изображений. Обычно данные теги автоматически проставляются фотоаппаратом и содержат информацию о технических параметрах съёмки, таких как ISO, фокусное расстояние, модель камеры, иногда – GPS-данные места съёмки. По этим данным, кстати, правоохранительные органы периодически находят преступников.

Exif-данные фотографии можно посмотреть в Windows, нажав правой кнопкой на файл и щёлкнув на «Свойства»:

Отображение Exif-тегов в «свойствах» файла в ОС Windows
Отображение Exif-тегов в «свойствах» файла в ОС Windows

Также самая популярная программа для просмотра и редактирования Exif-данных: ExifTool.

Нас интересуют в контексте статьи теги Copyright, Description, Comment.

Для автоматического проставления Exif на сайтах с PHP потребуется:

  1. Установить библиотеку PEL (PHP Exif Library) с помощью composer.

  2. Пример PHP-кода, который проставляет нужные нам теги:

<?php
// Composer / PEL
require 'PEL/vendor/autoload.php';
use lsolesen\pel\Pel;
use lsolesen\pel\PelConvert;
use lsolesen\pel\PelDataWindow;
use lsolesen\pel\PelEntryAscii;
use lsolesen\pel\PelEntryUserComment;
use lsolesen\pel\PelExif;
use lsolesen\pel\PelIfd;
use lsolesen\pel\PelJpeg;
use lsolesen\pel\PelJpegComment;
use lsolesen\pel\PelTag;
use lsolesen\pel\PelTiff;

$image_path = '/var/www/html/sample.jpg';
webit_add_exif($image_path);

function webit_add_exif($original_image_url)
{
  // Image URLs
  $url_before = $original_image_url;
  $url_after = $original_image_url;
  // Comment
  $comment = ucfirst($_SERVER['HTTP_HOST']);
  // Exif
  $data = new PelDataWindow(file_get_contents($url_before));
  
  // Prepare image data
  $jpeg = $file = new PelJpeg();
  $jpeg->load($data);
  
  // Create new EXIF-headers, overwriting any existing ones (when writing to disk)
   
  $exif = new PelExif();  
  $jpeg->setExif($exif);  
  $tiff = new PelTiff(); 
  $exif->setTiff($tiff);
  
  // Create Ifd-data that will hold EXIF-tags 
  $ifd0 = new PelIfd(PelIfd::IFD0);   
  $tiff->setIfd($ifd0);
  
  // Create EXIF-data for copyright   
  $make = new PelEntryAscii(PelTag::COPYRIGHT, $comment);   
  $ifd0->addEntry($make);
  
  // Create EXIF-data for description 
  $make2 = new PelEntryAscii(PelTag::IMAGE_DESCRIPTION, $comment);
   
  $ifd0->addEntry($make2);
  
  // Create EXIF-data for comment   
  $exif_ifd = new PelIfd(PelIfd::EXIF);   
  $exif_ifd->addEntry(new PelEntryUserComment($comment));   
  $ifd0->addSubIfd($exif_ifd);
  
  // Save to disk   
  $file->saveFile($url_after);   
  return true;

}

В этом и последующих примерах в качестве тега я использую название домена сайта, на котором запускается скрипт. В других случаях, например, если нужно прописать имя и фамилию фотографа, вы можете модифицировать скрипт, изменив значение переменной $comment:

$comment = 'Pavel Starikov';

В таком случае результат будет следующий:

Не только название домена - Кастомное значение мета-тега
Не только название домена - Кастомное значение мета-тега

IPTC-теги

Стандарт IPTC является менее известным, тем не менее все JPG-файлы имеют возможности записи IPTC-тегов и поисковые системы «просматривают» их, вычисляя авторство картинки.

Список IPTC-тегов описан на сайте: https://exiftool.org/TagNames/IPTC.html

Список большой и содержит самые разные данные, такие как «время выпуска», «версия программы» и еще пара сотен различных тегов. Нас интересует копирайт, а именно теги: 

  • By-line – Указание автора

  • CopyrightNotice – Ссылка на лицензию

  • Source, Credit – Ссылка на ваш сайт

PHP-функция, проставляющая IPTC-теги, которой для обработки нужен только путь к картинке в файловой системе сайта (например /var/www/html/sample.jpg):

$image_path = '/var/www/html/sample.jpg';
webit_add_iptc($image_path);

// Main Function
function webit_add_iptc($image_path)
{
// Get Vars
$domain_full = $_SERVER['HTTP_HOST'];
$domain_left = explode('.', $domain_full)[0];
$tags = [
'80' => $domain_left, // By-line
'116' => 'Copyright ' . date('Y') . ', ' . $domain_full, // CopyrightNotice
'115' => $domain_full, // Source
'110' => $domain_full // Credit
];

// To Binary Code
$data = '';
foreach ($tags as $tag => $string) {
$data .= webit_add_iptc_tag(2, $tag, $string);
}

// Add IPTC to Image
$content = iptcembed($data, $image_path);

// Save Image
file_put_contents($image_path, $content);
}

// Sub Function
function webit_add_iptc_tag($rec, $data, $value)
{
$length = strlen($value);
$retval = chr(0x1C) . chr($rec) . chr($data);
if ($length < 0x8000) {
  
  $retval .= chr($length >> 8) . chr($length & 0xFF);
  } else {
  $retval .= chr(0x80) .
  chr(0x04) .
  chr(($length >> 24) & 0xFF) .
  chr(($length >> 16) & 0xFF) .
  chr(($length >> 8) & 0xFF) .
  chr($length & 0xFF);
  }
  return $retval . $value;
  }

Проверку изображения и просмотр IPTC-тегов рекомендуем осуществлять на официальном сайте: https://getpmd.iptc.org/getiptcpmd.html

После запуска вышеуказанного скрипта проверяем фотографию с добавленными тегами и видим, что теги проставились:

Официальный валидатор показывает успешно прописанные мета-теги
Официальный валидатор показывает успешно прописанные мета-теги

Официальный сайт IPTC по неизвестный причинам не показывает тег CopyrightNotice, но он прописан, что подтверждают другие прочие программы и сайты, показывающие IPTC-данные. А значит поисковые системы данный тег прочитают.

Неофициальные валидаторы показывают также тег CopyrightNotice
Неофициальные валидаторы показывают также тег CopyrightNotice

Неуникальные фотографии

Абсолютное большинство копирайтеров пользуются гуглом, не утруждая себя созданием фотографий.

Согласно ст. 1300, 1301 ГК РФ (с изменениями от 29.06.2023) ответственность за нарушение исключительного права на произведение составляет от 10 тысяч до 5 миллионов рублей.

Чтобы обезопасить себя от штрафов при невозможности сделать уникальные фотографии рекомендуем пользоваться нейросетями (Midjourney, Playground) или пользоваться фотостоками, такими как FreePik, Pixabay, Pexels, Unsplash. Использовать Яндекс картинки и Google Images в текущих реалиях – плохой вариант.

Итоги

Поисковые системы обращают внимание на копирайты в мета-данных фотографий, отдавая приоритет указанному в мета-тегах сайту.

Используя вышеуказанный код, при наличии одной и той же картинки на разных сайтах – в глазах поисковых систем вы останетесь первоисточником.

Если у вас остались вопросы по теме статьи – вы можете задать их в комментариях. Рассказать о своём опыте в сфере защиты изображений от копирования вы также можете в находящемся ниже блоке.

Источник: https://habr.com/ru/articles/786412/


Интересные статьи

Интересные статьи

Привет, Хабр! В данной статье мы рассмотрим процесс настройки мониторинга массивов семейства HP EVA (Enterprise Virtual Array) с помощью Open Source продукта Zabbix, объясним, как получать и обра...
Обычно установку компьютерных игр на корпоративных устройствах отслеживают или запрещают по той простой причине, что на работе надо работать, а не играть. Но есть еще один аргумент: большой ассортимен...
Прогнозирование атмосферного CO2 с помощью Python. Как создавать модели прогнозирования временных рядов с помощью Darts.
Всем привет! Меня зовут Никита, и я хотел бы поделиться с вами некоторыми практическими аспектами разработки моей настольной игры “Письма призрака” (в этом месяце будет в...
Тренды E-commerce В последнее время бизнес активно переходит в онлайн-режим. С одной стороны, это обусловлено пандемией коронавируса, которая потребовала от предпринимателей структур...