
Быстрый поиск
Введите фрагмент названия статьи для поиска

Защита файлов на сервере от прямых ссылок (antileech)
29.08.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
Защита от скачивания файлов по прямым ссылкам, или как ее еще называют "антилич-защита" - задача не менее важная, чем защита остального контента сайта. Грамотно сделанная система защиты от прямых ссылок позволит разграничивать доступ к файлам разным категориям пользователей, вести подробную статистику скачиваний, скрывать истинное место размещения файлов, а также привлечет новых посетителей на ваш сайт. А то обычно получается так, что сторонние сайты публикуют прямую ссылку на файл, размещенный на вашем сервере, они получают посетителей, рейтинги, стригут купоны с рекламы, а вы получаете только счета за трафик. Справедливое разделение? Нет. В последнее время появилось огромное количество файлообменных сервисов, и на каждом из них используется своя система антилич-защиты, где-то более удачно реализованная, где-то менее. За счет этого они имеют возможность регулировать скорость отдачи файлов премиум-пользователям и халявщиками, определять лимит на скачивание по времени, поддерживать или не поддерживать докачку и т.д. В этой статье я расскажу о самом принципе построения антилич-системы, а также приведу пример простейшего, но вполне работоспособного скрипта.Сперва начнем с изучения предмета. Посмотрим лог работы какого-нибудь менеджера закачки, который скачивает обычный файл с обычного web-сервера. Конкретно нас интересуют служебные заголовки, которые сервер отдает менеджеру закачки или браузеру:
HTTP/1.1 200 OK
Date: Sat, 15 Aug 2009 17:24:40 GMT
Server: Apache/1.3.41 (Win32)
Connection: close
Content-Type: application/octet-stream
Accept-Ranges: bytes
Content-Disposition: Attachment; filename=filename.rar
Content-Length: 2676708
В заголовках есть вся нужная информация: тип файла, его имя, размер файла. После этого идет непосредственно содержимое файла. Если сервер отдает такие заголовки, значит их точно так же может отдавать и наш PHP-скрипт через функцию header.
Читать статью целиком »
Просмотров: 34073 | Комментариев: 40

gzuncompress и gzinflate: Assembler vs PHP
11.08.2009 | Категория: Темная сторона Силы | Автор: ManHunter
При разработке проекта Massacre возникла необходимость реализовать функции распаковки PHP-кода на Ассемблере. В этой статье я распишу все выкладки по этому вопросу. Кому-нибудь пригодится - хорошо, не пригодится - оставлю для себя, чтобы не забыть. Как всегда, начнем с теории. Функции gzuncompress и gzinflate обратны к функциям gzcompress и gzdeflate, соответственно. Все они используют алгоритм сжатия LZW, который также используется в бесплатной библиотеке zlib. Сперва скачаем эту библиотеку и воспользуемся Ассемблером, чтобы сжать какую-нибудь эталонную строку.Code (Assembler) : Убрать нумерацию
- format PE GUI 4.0
- entry start
- include 'win32a.inc'
- section '.data' data readable writeable
- strr db 'ManHunter' ; Строка для компрессии
- lend = $-strr
- bsize = 1000
- blen dd bsize
- tmp rb bsize
- tmp2 rb bsize
- tmp3 rb bsize
- mask db '%.2X ',0
- ;----------------------------------------------------------
- section '.code' code readable executable
- start:
- invoke compress,tmp,blen,strr,dword lend
- mov ecx,[blen]
- mov esi,tmp
- @@:
- push ecx
- movzx eax,byte [esi]
- invoke wsprintf,tmp2,mask,eax
- add esp,12
- invoke lstrcat,tmp3,tmp2
- inc esi
- pop ecx
- loop @b
- invoke MessageBox,HWND_DESKTOP,tmp3,NULL,MB_OK
- invoke ExitProcess,0
- ;----------------------------------------------------------
- section '.idata' import data readable writeable
- library kernel32,"kernel32.dll",\
- user32,"user32.dll",\
- zlib,"zlib1.dll"
- include "apia\kernel32.inc"
- include "apia\user32.inc"
- import zlib,\
- compress,'compress'
78 9C F3 4D CC F3 28 CD 2B 49 2D 02 00 11 11 03 93
Часть строки я специально выделил красным цветом, дальше будет понятно зачем это сделано.
Читать статью целиком »
Просмотров: 6493 | Комментариев: 7

Нанесение графических водяных знаков на изображение
13.07.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
Наносить текстовые надписи на картинки средствами PHP мы уже умеем. Теперь рассмотрим как делать то же самое, только на этот раз вместо текста будет графический маркер. Сам маркер представляет собой картинку в формате PNG-8 (глубина цвета - 8 бит), допускается прозрачность и произвольная форма. Если маркер будет с другой глубиной цвета, то при наложении прозрачный цвет будет заменен на черный. Другой формат маркеров не поддерживается! Файл PNG определяется по расширению, можно анализировать внутреннюю структуру, но это, наверное, в данном случае лишнее и остается на совести вебмастера.Code (PHP) : Убрать нумерацию
- //-------------------------------------------------------------------
- // Функция нанесения графического водяного знака на изображение
- // Copyright (C) ManHunter / PCL
- // http://www.manhunter.ru
- //-------------------------------------------------------------------
- // Параметры вызова:
- // $picture - путь к файлу картинки на сервере
- // $marker - путь к файлу водяного знака на сервере
- // $opacity - процент прозрачности
- // $watermark_position - положение водяного знака на картинке
- //-------------------------------------------------------------------
- // Константы положения водяного знака на картинке
- define ("WATERMARK_LEFT_BOTTOM",0);
- define ("WATERMARK_LEFT_TOP",1);
- define ("WATERMARK_RIGHT_BOTTOM",2);
- define ("WATERMARK_RIGHT_TOP",3);
- define ("WATERMARK_CENTER",4);
- function Watermark_PNG_Image($picture, $marker, $opacity=100,
- $watermark_position=WATERMARK_RIGHT_BOTTOM) {
- // Проверки на наличие файлов и допустимые параметры
- if (!file_exists($picture)) { return false; }
- if (!file_exists($marker)) { return false; }
- // Получить размеры исходного изображения
- list ($sx,$sy)=GetImageSize($picture);
- if ($sx==0 || $sy==0) { return false; }
- // Получить размеры маркера
- list ($mx,$my)=GetImageSize($marker);
- if ($mx==0 || $my==0 || $sx<($mx+20) || $sy<($my+20)) { return false; }
- // Если расширение маркера не .PNG, то выход с ошибкой
- if (strtolower(substr($marker,-4))!=".png") { return false; }
- // Если расширения нет, то выход с ошибкой
- $pocket=Array();
- eregi("\.([a-z]*)$",$picture,$pocket);
- if ($pocket[1]=="") { return false; }
- // На основании расширения создать картинку
- switch (strtolower($pocket[1])) {
- case "jpeg":
- case "jpg": {
- if (!$im=@ImageCreateFromJpeg($picture)) { return false; }
- break;
- }
- case "gif": {
- if (!$im=@ImageCreateFromGif($picture)) { return false; }
- break;
- }
- case "png": {
- if (!$im=@ImageCreateFromPng($picture)) { return false; }
- break;
- }
- default: { return false; }
- }
- // Получить координаты блока на картинке для нанесения надписи
- switch ($watermark_position) {
- case WATERMARK_LEFT_BOTTOM: {
- $pos_x=10;
- $pos_y=$sy-$my-10;
- break;
- }
- case WATERMARK_RIGHT_BOTTOM: {
- $pos_x=$sx-$mx-10;
- $pos_y=$sy-$my-10;
- break;
- }
- case WATERMARK_LEFT_TOP: {
- $pos_x=10;
- $pos_y=10;
- break;
- }
- case WATERMARK_RIGHT_TOP: {
- $pos_x=$sx-$mx-10;
- $pos_y=10;
- break;
- }
- case WATERMARK_CENTER: {
- $pos_x=intval($sx/2-$mx/2);
- $pos_y=intval($sy/2-$my/2);
- break;
- }
- default: {
- imageDestroy($im);
- return false;
- }
- }
- // Нанести водяной знак с нужной прозрачностью
- $watermark=@ImageCreateFromPng($marker);
- ImageCopyMerge($im, $watermark, $pos_x, $pos_y, 0, 0, $mx, $my, $opacity);
- ImageDestroy($watermark);
- // Записать измененный файл на место
- switch (strtolower($pocket[1])) {
- case "jpeg":
- case "jpg": {
- ImageJPEG($im,$picture,90);
- break;
- }
- case "gif": {
- ImageGIF($im,$picture);
- break;
- }
- case "png": {
- ImagePNG($im,$picture);
- break;
- }
- }
- ImageDestroy($im);
- return true;
- }
Читать статью целиком »
Просмотров: 9387 | Комментариев: 13

Грабберы контента с других сайтов
16.06.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
Грабберы контента - это специальные скрипты или программы, которые получают некоторую информацию напрямую из текста html-страниц других сайтов, чаще всего без их ведома или разрешения. Название произошло от транскрипции английского глагола "to grab" - "захватывать", "использовать", хотя и русский вариант корня "грабить" тоже иногда подходит. Вообще, тырить чужой контент и использовать его на своих сайтах нехорошо. Но в некоторых случаях считаю это допустимым, например, когда для мобильных устройств требуется получить облегченные версии страниц сайтов, которые не имеют такой штатной функции. Или же надо удалить со страницы всякую рекламу, а то некоторые ублюдочные сайты умудряются заталкивать баннеры даже в RSS-ленты. Или, например, если требуется получать информацию с сайтов, у которых нет собственных API для выгрузки контента.Самый простой способ получить текст нужной html-страницы сайта - при помощи функции PHP file_get_contents. Текст загруженной страницы разбирается регулярными выражениями. Вот пример граббера для Цитатника Рунета. После извлечения цитат с главной страницы можно вывести их все списком, как сделано в этом примере, или показать случайным образом одну из них.
Code (PHP) : Убрать нумерацию
- <?
- //-----------------------------------------------------------
- // Граббер цитат с Цитатника Рунета bash.org.ru
- // Загружает и парсит главную страницу, цитаты помещает в массив
- //-----------------------------------------------------------
- // Получить html-страницу
- $grab=@file_get_contents("http://bash.org.ru");
- if ($grab) {
- // Заменить теги переноса строки на простые переносы строки
- $grab=str_replace("<br>","\n",$grab);
- // Получить регулярным выражением тексты цитат
- preg_match_all("/<div class=\"vote\">([^>]*>){12}([^<]*)/",$grab,$matches);
- // В массиве содержатся все найденные строки
- for ($i=0; $i<count($matches[2]); $i++) {
- echo nl2br($matches[2][$i]);
- echo '<hr>';
- }
- }
- else {
- echo "Connection Error";
- }
- ?>
Читать статью целиком »
Просмотров: 50680 | Комментариев: 17

Антиникотиновый информер
02.05.2009 | Категория: Web-мастеру и не только | Автор: ManHunter

Антиникотиновый информер
Когда я бросил курить, то в качестве стимула сделал себе такой антиникотиновый информер и использую его в подписи на некоторых форумах. Это PHP-скрипт, который считает в реальном времени сколько всего сэкономлено и выводит результат в виде графического файла.
Code (PHP) : Убрать нумерацию
- <?
- //-------------------------------------------------------------
- // Скрипт антиникотинового информера с интервалами дат
- // Copyright (C) ManHunter / PCL
- // http://www.manhunter.ru
- //-------------------------------------------------------------
- // Настройки информера
- $cig_per_day=20; // Сигарет в сутки, шт.
- $rub_per_day=65; // Денег на сигареты в сутки, руб.
- $nikotin=1.2; // Количество никотина в 1 сигарете, мг.
- $d=28; // Месяц, когда бросил курить
- $y=2008; // Год, когда бросил курить
- $m=7; // День, когда бросил курить
- $h=11; // Время, когда бросил курить, часы
- $i=30; // Время, когда бросил курить, минуты
- $size=10; // Размер шрифта информера
- $font="my_font.ttf"; // Файл с TTF-шрифтом
- $border=10; // Отступ текста от границ
- //-------------------------------------------------------------
- // Дальше лучше ничего без надобности не менять
- function num2word($num,$words) {
- $num=$num%100;
- if ($num>19) { $num=$num%10; }
- switch ($num) {
- case 1: { return($words[0]); }
- case 2:
- case 3:
- case 4: { return($words[1]); }
- default: { return($words[2]); }
- }
- }
- $start_date=mktime($h,$i,0,$m,$d,$y);
- $end_date=time();
- $day=intval(($end_date-$start_date)/(24*60*60));
- $hour=intval(($end_date-$start_date-$day*24*60*60)/(60*60));
- $days_array=Array("день", "дня", "дней");
- $hour_array=Array("час", "часа", "часов");
- // Сгенерировать текст информера
- $str="Не курю: ".$day." ".num2word($day,$days_array)." ".
- ($hour==0?"ровно":$hour." ".num2word($hour,$hour_array))."\n".
- "Не выкурено сигарет: ".
- intval(($day+($hour/24))*$cig_per_day)." шт.\n".
- "Не потрачено денег: ".
- intval(($day+($hour/24))*$rub_per_day)." руб.\n".
- "Не убито лошадок: ".
- intval(($day+($hour/24))*$cig_per_day*$nikotin/50)." шт.";
- // Перевести в юникод, чтобы корректно отображались русские буквы
- $str=iconv('windows-1251','utf-8',$str);
- // Получить размер графического блока для вывода текста
- list($ldx,$ldy,$rdx,$rdy,$rux,$ruy,$lux,$luy)=imageTTFBBox($size,0,$font,$str);
- // Получить размер информера
- $xx=$rdx+$border*2+$size;
- $yy=$rdy+$border*2+$size;
- // Создать изображение
- $im=imageCreatetruecolor($xx,$yy);
- // Определить цвета
- $black=imageColorAllocate($im,0,0,0);
- $red=imageColorAllocate($im,255,0,0);
- $white=imageColorAllocate($im,255,255,255);
- // Белый прямоугольник с красной рамкой
- ImageFilledRectangle($im,0,0,$xx,$yy,$red);
- ImageFilledRectangle($im,1,1,($xx-2),($yy-2),$white);
- // Наложить текст на фон
- imagettftext($im,$size,0,$border+5,$border+$size,$black,$font,$str);
- // Вывести картинку в формате PNG
- Header("Content-type: image/png");
- imagePNG($im);
- ?>
Читать статью целиком »
Просмотров: 7261 | Комментариев: 11
