Стана ми интересно доколко бих могъл да защитя някоя картинка от сваляне през браузъра, та мъдренето ми засега стигна до следния PHP код:
Файл image.php
GeSHi (PHP):
<?php
if ($_GET['check'] == md5(date('U').'parola')) {
header("Expires: Mon, 26 Jul 2012 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header('Content-Type: image/jpeg');
$img = imagecreatefromjpeg('http://път.до.jpg.картинка');
imagejpeg($img);
imagedestroy($img);
}
?>
Файл page.php
GeSHi (PHP):
<?php
echo '<img src="image.php?check='.md5(date('U').'parola').'">';
?>
Казано без код, страницата page.php не извиква директно картинката, а извиква PHP файла image.php, който има грижата да изобрази картинката, с което се скрива реалния път до картинката, прави се проверка валидността на хеширан стринг, валиден 1 секунда, с което се предотвратява самостоятелно извикване на image.php с картинката след тази секунда, и се добавят хедъри за забрана на кеша в браузъра, за да не може при цъкване с десен бутон върху картинката и опит за запазване, картинката да се запази от кеша, вместо да се мине през image.php, когато проверката с хеша няма да мине. По принцип, ако човек прави подобни опити за защити, няма да е зле да сложи и някой и друг JavaScript по въпроса, така че още в началото да откаже поне незапознатите.
С това "защитата" не е завършена, не съм забравил нито за screenshot-ите, нито за това, че на скрипт с wget или curl ще му е достатъчна тази 1 секунда валидност на стринга за проверка, за да свали картинката чрез наличния в page.php хеш... Но не пълната защита е поводът да пусна тази тема.
Поводът е, че с горните 3 защити в PHP кода (индиректното извикване на картинката, проверката със стринга и забраната на кеша) общо взето се получи добра забрана за сваляне на картинката в Google Chrome, при което в първия момент реших, че това ще е достатъчно откъм действията в браузъра. Ама ядец!
Оказа се, че Google Chrome е единственият браузър, който се съобразява с meta tag-овете за забрана на кеша. Не че съм пробвал всички браузъри и всичките им версии на света, но пробвах с Firefox 22, Opera 12 и IE 8, и никой от тях не се съобрази със забраната на кеша - във всички тях си цъкаш десен бутон върху картинката, запазване на картинката и си изтегляш картинката като пич. Вярно, не с оригиналното ѝ име, но това няма никакво значение - картинката се изтегля и се изтегля от кеша.
Та това ми е питанката. Пропускам ли нещо в начина, по който се опитвам да забраня кеша (за сефте го правя, но ровенията ми из Мрежата ме доведоха до тази сборка), или Google Chrome е единственият браузър, който се съобразява с HTML спецификацията по въпроса? Ако не пропускам нищо, това всеобщ бъг в браузърите ли ще е или някакъв бойкот на въпросния meta tag?
П.П.: Темата по принцип е за функционалността на забраната на кеша, но ако на някой много му се пишат хрумвания по въпроса със защитите от изтегляне на картинки през браузъра, нека се чувства свободен да пише