Blog. Just Blog

Быстрый поиск

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

HTTP-заголовки на PHP: Status или HTTP/1.x?

05.12.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
Для управления переадресацией, установки ответов сервера и передачи пользовательских заголовков в PHP используется функция Header. C ее помощью можно, например, установить статус ошибки 404, чтобы сообщить браузеру или поисковой системе, что такой страницы сайта больше не существует. В официальной документации такой случай описывается следующим образом:
  1. <?
  2. header ("HTTP/1.0 404 Not Found");
  3. ?>
Или же, как более корректный вариант:
  1. <?
  2. Header($_SERVER['SERVER_PROTOCOL']." 404 Not Found");
  3. ?>
Теперь приступим к тестам. Для проверки поведения скрипта возьмем менеджер закачек Download Master и браузер Firefox с дополнением LiveHTTPHeaders. В качестве тестовых систем для скрипта будут два локальных компьютера и хостинговый сервер. Конфигурация локальных машин: сервер Apache 1.3 и 2.0, PHP версии 5 установлен как CGI/FastCGI, операционная система Windows XP и Windows Seven. Результат плачевный: на обеих системах скрипт рушится с Internal Server Error, а в логе Apache ошибка записана как:

malformed header from script. Bad header=HTTP/1.1 404 Not Found

Хостинговый сервер ведет себя более дружелюбно. Конфигурация: Apache 1.3, PHP версии 4 установлен как CGI, операционная система Linux. При попытке "скачать" скрипт при помощи Download Master, его лог будет вполне ожидаемым, за исключением потери нашего сообщения, что файл не найден Not Found.

Читать статью целиком »
Просмотров: 11029 | Комментариев: 7

Определение браузера посетителя сайта на PHP

16.11.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
Для сбора внутренней статистики я написал простую функцию для определения браузеров посетителей сайта. За несколько месяцев активной "дрессировки" в нее были добавлены сигнатуры практически всех популярных браузеров, и вот уже достаточно длительное время она не обновляется. Информация берется из переменной окружения HTTP_USER_AGENT, но так как строка идентификации браузера формируется на стороне пользователя, то она может быть легко подделана. Например, при помощи расширения User Agent Switcher для браузера Firefox или какого-нибудь локального прокси-сервера. Поэтому 100% достоверной эту информацию считать никак нельзя. Но для подавляющего большинства случаев ее будет вполне достаточно. Функция возвращает строку с названием браузера и его версией типа Internet Explorer 6.0, Mozilla Firefox 3.0.14, или же Unknown, если браузер определить не удалось.
  1. //-------------------------------------------------------------------
  2. // Функция определения браузера по данным поля User-Agent
  3. //-------------------------------------------------------------------
  4. function GetUserAgent() {
  5.   // Получить переменную окружения
  6.   $str=getenv('HTTP_USER_AGENT');
  7.   // Попытаться определить известные браузеры по сигнатурам
  8.   if (strpos($str,"Avant Browser",0)!==false) {
  9.     return "Avant Browser";
  10.   }
  11.   elseif (strpos($str,"Acoo Browser",0)!==false) {
  12.     return "Acoo Browser";
  13.   }
  14.   elseif (eregi("Iron/([0-9a-z\.]*)",$str,$pocket)) {
  15.     return "SRWare Iron ".$pocket[1];
  16.   }
  17.   elseif (eregi("Chrome/([0-9a-z\.]*)",$str,$pocket)) {
  18.     return "Google Chrome ".$pocket[1];
  19.   }
  20.   elseif (eregi("(Maxthon|NetCaptor)( [0-9a-z\.]*)?",$str,$pocket)) {
  21.     return $pocket[1].$pocket[2];
  22.   }
  23.   elseif (strpos($str,"MyIE2",0)!==false) {
  24.     return "MyIE2";
  25.   }
  26.   elseif (eregi("(NetFront|K-Meleon|Netscape|Galeon|Epiphany|Konqueror|".
  27.           "Safari|Opera Mini)/([0-9a-z\.]*)",$str,$pocket)) {
  28.     return $pocket[1]." ".$pocket[2];
  29.   }
  30.   elseif (eregi("Opera[/ ]([0-9a-z\.]*)",$str,$pocket)) {
  31.     return "Opera ".$pocket[1];
  32.   }
  33.   elseif (eregi("Orca/([ 0-9a-z\.]*)",$str,$pocket)) {
  34.     return "Orca Browser ".$pocket[1];
  35.   }
  36.   elseif (eregi("(SeaMonkey|Firefox|GranParadiso|Minefield|".
  37.           "Shiretoko)/([0-9a-z\.]*)",$str,$pocket)) {
  38.     return "Mozilla ".$pocket[1]." ".$pocket[2];
  39.   }
  40.   elseif (eregi("rv:([0-9a-z\.]*)",$str,$pocket) &&
  41.           strpos($str,"Mozilla/",0)!==false) {
  42.     return "Mozilla ".$pocket[1];
  43.   }
  44.   elseif (eregi("Lynx/([0-9a-z\.]*)",$str,$pocket)) {
  45.     return "Lynx ".$pocket[1];
  46.   }
  47.   elseif (eregi("MSIE ([0-9a-z\.]*)",$str,$pocket)) {
  48.     return "Internet Explorer ".$pocket[1];
  49.   }
  50.   else {
  51.     // Это какой-то неизвестный браузер
  52.     return "Unknown";
  53.   }
  54. }
Кроме статистики определение браузера посетителя можно использовать для переадресации или выдачи определенных страниц сайта, показа целевых информационных блоков, подгонки стилей или дизайна и т.п. При необходимости функцию можно легко расширить собственными сигнатурами, например, добавить определение поисковых роботов. Для определения браузеров мобильных устройств используется отдельный скрипт.

Просмотров: 19905 | Комментариев: 16

Определение географического положения по IP-адресу

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

Определение географического положения по IP-адресу

Определение страны и города посетителя сайта по его IP-адресу применяется во многих случаях. Например, автоматическая подстройка языка отображения сайта, более точный таргетинг рекламных или информационных блоков сайта, разграничение доступа к разделам сайта для разных источников трафика, а также для многих других целей. Наиболее полные базы географического положения IP-адресов в настоящее время предоставляет компания MaxMind в своей базе GeoLite City. Бесплатный вариант базы содержит данные с точностью до города, его можно скачать с сайта в бинарном формате (в распакованном виде около 30 мегабайт) и в формате CSV (в распакованном виде около 130 мегабайт). На сайте также можно оформить подписку на коммерческие варианты базы, содержащие данные с точностью до улиц и обновляющиеся еженедельно, но это только если вашему проекту действительно требуется такая точность. Обновления бесплатной базы выходят регулярно, обычно в первых числах каждого месяца. Пример работы скрипта с коммерческой географической базой можно посмотреть на сайте MaxMind. Там же на сайте можно скачать бесплатные базы стран мира, почтовые индексы некоторых стран и много других полезных данных. К сожалению, самые вкусности предоставляются только за деньги.

Читать статью целиком »
Просмотров: 17385 | Комментариев: 16

Защита файлов на сервере от прямых ссылок (antileech)

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

Защита файлов на сервере от прямых ссылок (antileech)

Защита от скачивания файлов по прямым ссылкам, или как ее еще называют "антилич-защита" - задача не менее важная, чем защита остального контента сайта. Грамотно сделанная система защиты от прямых ссылок позволит разграничивать доступ к файлам разным категориям пользователей, вести подробную статистику скачиваний, скрывать истинное место размещения файлов, а также привлечет новых посетителей на ваш сайт. А то обычно получается так, что сторонние сайты публикуют прямую ссылку на файл, размещенный на вашем сервере, они получают посетителей, рейтинги, стригут купоны с рекламы, а вы получаете только счета за трафик. Справедливое разделение? Нет. В последнее время появилось огромное количество файлообменных сервисов, и на каждом из них используется своя система антилич-защиты, где-то более удачно реализованная, где-то менее. За счет этого они имеют возможность регулировать скорость отдачи файлов премиум-пользователям и халявщиками, определять лимит на скачивание по времени, поддерживать или не поддерживать докачку и т.д. В этой статье я расскажу о самом принципе построения антилич-системы, а также приведу пример простейшего, но вполне работоспособного скрипта.

Читать статью целиком »
Просмотров: 34558 | Комментариев: 40

gzuncompress и gzinflate: Assembler vs PHP

11.08.2009 | Категория: Темная сторона Силы | Автор: ManHunter
При разработке проекта Massacre возникла необходимость реализовать функции распаковки PHP-кода на Ассемблере. В этой статье я распишу все выкладки по этому вопросу. Кому-нибудь пригодится - хорошо, не пригодится - оставлю для себя, чтобы не забыть. Как всегда, начнем с теории. Функции gzuncompress и gzinflate обратны к функциям gzcompress и gzdeflate, соответственно. Все они используют алгоритм сжатия LZW, который также используется в бесплатной библиотеке zlib. Сперва скачаем эту библиотеку и воспользуемся Ассемблером, чтобы сжать какую-нибудь эталонную строку.
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include 'win32a.inc'
  5.  
  6. section '.data' data readable writeable
  7.  
  8. strr    db 'ManHunter'  ; Строка для компрессии
  9. lend    = $-strr
  10. bsize   = 1000
  11.  
  12. blen    dd bsize
  13.  
  14. tmp     rb bsize
  15. tmp2    rb bsize
  16. tmp3    rb bsize
  17.  
  18. mask    db '%.2X ',0
  19.  
  20. ;----------------------------------------------------------
  21.  
  22. section '.code' code readable executable
  23. start:
  24.  
  25.         invoke  compress,tmp,blen,strr,dword lend
  26.  
  27.         mov     ecx,[blen]
  28.         mov     esi,tmp
  29. @@:
  30.         push    ecx
  31.         movzx   eax,byte [esi]
  32.         invoke  wsprintf,tmp2,mask,eax
  33.         add     esp,12
  34.         invoke  lstrcat,tmp3,tmp2
  35.         inc     esi
  36.         pop     ecx
  37.         loop    @b
  38.  
  39.         invoke  MessageBox,HWND_DESKTOP,tmp3,NULL,MB_OK
  40.         invoke  ExitProcess,0
  41.  
  42. ;----------------------------------------------------------
  43.  
  44. section '.idata' import data readable writeable
  45.  
  46. library kernel32,"kernel32.dll",\
  47.         user32,"user32.dll",\
  48.         zlib,"zlib1.dll"
  49.  
  50. include "apia\kernel32.inc"
  51. include "apia\user32.inc"
  52.  
  53.   import zlib,\
  54.          compress,'compress'
В окне будет показана следующая строка:

78 9C F3 4D CC F3 28 CD 2B 49 2D 02 00 11 11 03 93
Часть строки я специально выделил красным цветом, дальше будет понятно зачем это сделано.

Читать статью целиком »
Просмотров: 6725 | Комментариев: 7

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0076 сек.) / Память: 4.5 Mb
Наверх