Blog. Just Blog

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

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

Определение мобильных браузеров на PHP

30.04.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
С быстрым развитием рынка мобильных устройств становится актуальной тема создания сайтов для них. Это могут быть самостоятельные страницы сайтов, или же просто облегченные версии страниц с минимумом графики, особыми стилями, версткой, чтобы сайт можно было комфортно просматривать на маленьком экранчике мобильного телефона или КПК. И лучше делать это автоматически, не заставляя пользователя искать на основном сайте какие-то дополнительные ссылки. Например, если вы откроете с мобильного телефона любую страницу моего сайта, то вас автоматически переадресует на облегченную версию этой же страницы для мобильных устройств. Определять браузер средствами PHP мы уже умеем, главная сложность - выделить сигнатуры браузеров мобильных устройств. К счастью, это уже сделано на сайте Detect Mobile Browsers. Весь сайт целиком посвящен только одному скрипту для определения мобильных браузеров, но сам скрипт обвешан ненужными наворотами и написан каким-то жутким стилем, так что в исходном виде практически бесполезен. А вот позаимствовать из него сигнатуры и некоторые другие методы определения вполне можно, что и было сделано. Код полностью вычищен и оптимизирован.
  1. //--------------------------------------------------------------------
  2. // Функция проверки принадлежит ли браузер к мобильным устройствам
  3. // Возвращает 0 - браузер стационарный или определить его не удалось
  4. //            1-4 - браузер запущен на мобильном устройстве
  5. //--------------------------------------------------------------------
  6. function is_mobile() {
  7.   $user_agent=strtolower(getenv('HTTP_USER_AGENT'));
  8.   $accept=strtolower(getenv('HTTP_ACCEPT'));
  9.  
  10.   if ((strpos($accept,'text/vnd.wap.wml')!==false) ||
  11.       (strpos($accept,'application/vnd.wap.xhtml+xml')!==false)) {
  12.     return 1// Мобильный браузер обнаружен по HTTP-заголовкам
  13.   }
  14.  
  15.   if (isset($_SERVER['HTTP_X_WAP_PROFILE']) ||
  16.       isset($_SERVER['HTTP_PROFILE'])) {
  17.     return 2// Мобильный браузер обнаружен по установкам сервера
  18.   }
  19.  
  20.   if (preg_match('/(mini 9.5|vx1000|lge |m800|e860|u940|ux840|compal|'.
  21.     'wireless| mobi|ahong|lg380|lgku|lgu900|lg210|lg47|lg920|lg840|'.
  22.     'lg370|sam-r|mg50|s55|g83|t66|vx400|mk99|d615|d763|el370|sl900|'.
  23.     'mp500|samu3|samu4|vx10|xda_|samu5|samu6|samu7|samu9|a615|b832|'.
  24.     'm881|s920|n210|s700|c-810|_h797|mob-x|sk16d|848b|mowser|s580|'.
  25.     'r800|471x|v120|rim8|c500foma:|160x|x160|480x|x640|t503|w839|'.
  26.     'i250|sprint|w398samr810|m5252|c7100|mt126|x225|s5330|s820|'.
  27.     'htil-g1|fly v71|s302|-x113|novarra|k610i|-three|8325rc|8352rc|'.
  28.     'sanyo|vx54|c888|nx250|n120|mtk |c5588|s710|t880|c5005|i;458x|'.
  29.     'p404i|s210|c5100|teleca|s940|c500|s590|foma|samsu|vx8|vx9|a1000|'.
  30.     '_mms|myx|a700|gu1100|bc831|e300|ems100|me701|me702m-three|sd588|'.
  31.     's800|8325rc|ac831|mw200|brew |d88|htc\/|htc_touch|355x|m50|km100|'.
  32.     'd736|p-9521|telco|sl74|ktouch|m4u\/|me702|8325rc|kddi|phone|lg |'.
  33.     'sonyericsson|samsung|240x|x320vx10|nokia|sony cmd|motorola|'.
  34.     'up.browser|up.link|mmp|symbian|smartphone|midp|wap|vodafone|o2|'.
  35.     'pocket|kindle|mobile|psp|treo|android|iphone|ipod|webos|wp7|wp8|'.
  36.     'fennec|blackberry|htc_|opera m|windowsphone)/'$user_agent)) {
  37.     return 3// Мобильный браузер обнаружен по сигнатуре User Agent
  38.   }
  39.  
  40.   if (in_array(substr($user_agent,0,4),
  41.     Array("1207""3gso""4thp""501i""502i""503i""504i""505i""506i",
  42.           "6310""6590""770s""802s""a wa""abac""acer""acoo""acs-",
  43.           "aiko""airn""alav""alca""alco""amoi""anex""anny""anyw",
  44.           "aptu""arch""argo""aste""asus""attw""au-m""audi""aur ",
  45.           "aus ""avan""beck""bell""benq""bilb""bird""blac""blaz",
  46.           "brew""brvw""bumb""bw-n""bw-u""c55/""capi""ccwa""cdm-",
  47.           "cell""chtm""cldc""cmd-""cond""craw""dait""dall""dang",
  48.           "dbte""dc-s""devi""dica""dmob""doco""dopo""ds-d""ds12",
  49.           "el49""elai""eml2""emul""eric""erk0""esl8""ez40""ez60",
  50.           "ez70""ezos""ezwa""ezze""fake""fetc""fly-""fly_""g-mo",
  51.           "g1 u""g560""gene""gf-5""go.w""good""grad""grun""haie",
  52.           "hcit""hd-m""hd-p""hd-t""hei-""hiba""hipt""hita""hp i",
  53.           "hpip""hs-c""htc ""htc-""htc_""htca""htcg""htcp""htcs",
  54.           "htct""http""huaw""hutc""i-20""i-go""i-ma""i230""iac",
  55.           "iac-""iac/""ibro""idea""ig01""ikom""im1k""inno""ipaq",
  56.           "iris""jata""java""jbro""jemu""jigs""kddi""keji""kgt",
  57.           "kgt/""klon""kpt ""kwc-""kyoc""kyok""leno""lexi""lg g",
  58.           "lg-a""lg-b""lg-c""lg-d""lg-f""lg-g""lg-k""lg-l""lg-m",
  59.           "lg-o""lg-p""lg-s""lg-t""lg-u""lg-w""lg/k""lg/l""lg/u",
  60.           "lg50""lg54""lge-""lge/""libw""lynx""m-cr""m1-w""m3ga",
  61.           "m50/""mate""maui""maxo""mc01""mc21""mcca""medi""merc",
  62.           "meri""midp""mio8""mioa""mits""mmef""mo01""mo02""mobi",
  63.           "mode""modo""mot ""mot-""moto""motv""mozz""mt50""mtp1",
  64.           "mtv ""mwbp""mywa""n100""n101""n102""n202""n203""n300",
  65.           "n302""n500""n502""n505""n700""n701""n710""nec-""nem-",
  66.           "neon""netf""newg""newt""nok6""noki""nzph""o2 x""o2-x",
  67.           "o2im""opti""opwv""oran""owg1""p800""palm""pana""pand",
  68.           "pant""pdxg""pg-1""pg-2""pg-3""pg-6""pg-8""pg-c""pg13",
  69.           "phil""pire""play""pluc""pn-2""pock""port""pose""prox",
  70.           "psio""pt-g""qa-a""qc-2""qc-3""qc-5""qc-7""qc07""qc12",
  71.           "qc21""qc32""qc60""qci-""qtek""qwap""r380""r600""raks",
  72.           "rim9""rove""rozo""s55/""sage""sama""samm""sams""sany",
  73.           "sava""sc01""sch-""scoo""scp-""sdk/""se47""sec-""sec0",
  74.           "sec1""semc""send""seri""sgh-""shar""sie-""siem""sk-0",
  75.           "sl45""slid""smal""smar""smb3""smit""smt5""soft""sony",
  76.           "sp01""sph-""spv ""spv-""sy01""symb""t-mo""t218""t250",
  77.           "t600""t610""t618""tagt""talk""tcl-""tdg-""teli""telm",
  78.           "tim-""topl""tosh""treo""ts70""tsm-""tsm3""tsm5""tx-9",
  79.           "up.b""upg1""upsi""utst""v400""v750""veri""virg""vite",
  80.           "vk-v""vk40""vk50""vk52""vk53""vm40""voda""vulc""vx52",
  81.           "vx53""vx60""vx61""vx70""vx80""vx81""vx83""vx85""vx98",
  82.           "w3c ""w3c-""wap-""wapa""wapi""wapj""wapm""wapp""wapr",
  83.           "waps""wapt""wapu""wapv""wapy""webc""whit""wig ""winc",
  84.           "winw""wmlb""wonu""x700""xda-""xda2""xdag""yas-""your",
  85.           "zeto""zte-"))) {
  86.     return 4// Мобильный браузер обнаружен по сигнатуре User Agent
  87.   }
  88.  
  89.   return false// Мобильный браузер не обнаружен
  90. }
Функция возвращает false, если браузер стационарный или по каким-то причинам его не удалось определить. Если браузер запущен на мобильном устройстве, то результат будет от 1 до 4, это код метода, которым он был определен. Сигнатуры на сайте время от времени пополняются, так что можете брать их оттуда самостоятельно и дополнять эту функцию.

Просмотров: 34800 | Комментариев: 14

Сервис аккредитации PHP-разработчиков

28.02.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Чуть больше года назад натолкнулся на интересный сайт для web-программистов inPHP.org. Вот что пишут про него сами его создатели:


Сервис inPHP.org представляет собой удобный, надежный и высокотехнологичный инструмент, полезный как для IT-разработчиков, так и для работодателей. В основе проекта заложена идея обеспечения подтверждения компетенции программистов в реальном времени для любого пользователя сети интернет. Общий диапазон уровня навыков PHP-разработки, в рамках системы, условно разбит на 8 уровней (где 1-й уровень - самый простой, а 8-й наиболее сложный). Кроме того, существуют специализированные уровни, призванные охарактеризовать узкие профессиональные качества разработчика. Любой зарегистрированный участник имеет возможность, последовательно проходя тесты семи уровней, подтвердить собственную квалификацию и передать ссылку на персональную страницу в системе заинтересованным лицам (заказчикам, работодателям). Более того, после достижения седьмого уровня, участник получает возможность пройти аккредитацию сотрудником сервиса на высший уровень компетенции. Лица, заинтересованные во взаимовыгодном сотрудничестве с профессиональными PHP-разработчиками, в свою очередь, получают возможность подтверждения профессиональной пригодности того или иного кандидата просто изучив его персональную страницу в сервисе.


Смысл аккредитации в том, что надо пройти несколько бесплатных тестов по 10 вопросов в каждом, все тесты с возрастающей сложностью и разной тематикой. Если дан хоть один неправильный ответ, то повторная пересдача разрешена только через три часа. Кроме бесплатных тестов есть три дополнительных теста для специализированных аккредитаций, доступ к которым дается после оплаты (по 10 баксов за каждый), но это исключительно по желанию. Недавно в закладках снова наткнулся этот сайт, а там, оказывается, добавился новый 7-й уровень тестирования. Теперь я тоже в тридцатке хайлевелов на этом сайте :)

Просмотров: 4381 | Комментариев: 6

PCL's JS_Protect 1.0

27.01.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Небольшой класс на PHP для шифрования скриптов JavaScript. Изначально задумывался как дополнительная мера противодействия спамботам, но пока успешно работают более простые методы, и PCL's JS_Protect остался в качестве proof of concept. Класс позволяет шифровать исходные тексты скриптов JavaScript с целью затруднения их автоматического анализа. Любителей всякой малвары и шаровары сразу огорчу: JS_Protect легко снимается вручную при помощи Eval JavaScript Unpacker. Главный недостаток этой защиты в том, что зашифрованный скрипт очень сильно увеличивается в размерах.
  1. // Подключение модуля
  2. include "js_protect.php";
  3.  
  4. // Создание класса
  5. $js_protect = new JS_Protect;
  6.  
  7. // Исходный код скрипта для шифрования
  8. $js_protect->js_source=$code;
  9.  
  10. // Уровень вложенности шифровки. Рекомендуется 1, максимум 2
  11. $js_protect->code_level=1;
  12.  
  13. // Количество внутренних функций. Повышают надежность, но значительно
  14. // увеличивают размер получаемого кода
  15. $js_protect->func_level=rand(0,6);
  16.  
  17. // Выполнить URL-кодирование защищенного скрипта или нет
  18. $js_protect->enable_raw=false;
  19.  
  20. // Запуститиь процедуру шифрования
  21. echo $js_protect->protect();
Вложенность шифрования не рекомендуется выставлять более 2, потому что в этом случае размер скрипта вырастет до совсем недопустимых размеров. Опция "использовать внутренние функции" дает дополнительную защиту, но также увеличивает размер получаемого скрипта. Если эта опция не нужна, то установите значение func_level = 0. URL-кодирование также дает дополнительную защиту и скрывает обработанный текст, но при этом еще больше увеличивает размер.

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

PCL's Mini-Chat 1.0

27.12.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
По просьбам трудящихся выкладываю облегченную версию своего мини-чата. На этом сайте используется похожий скрипт, но он тесно интегрирован с остальными модулями движка и отделить его с сохранением всего функционала не представляется возможным. Скрипт написан практически заново и содержит минимальный набор функций, но его функционал можно легко расширять. Скрипт легко интегрируется в любые сайты, написанные на PHP, генерируемый HTML-код и стили CSS проходят валидацию. Для работы скрипта на сервере требуется PHP версии 4 и выше, база MySQL версии 4 и выше, клиентской части требуется поддержка в браузере пользователя JavaScript. Перед установкой мини-чата и заливкой его на сервер надо настроить данные подключения MySQL-базы (файл chat_engine/chat_config.php):
  1. // Данные для подключения к базе
  2. $chat_config['mysql_name']="test";
  3. $chat_config['mysql_host']="localhost";
  4. $chat_config['mysql_user']="root";
  5. $chat_config['mysql_password']="";
  6. // Таблица мини-чата в базе
  7. $chat_config['mysql_table']="chat_table";
и данные авторизации администратора чата:
  1. // Логин админа чата
  2. $chat_config['admin_login']="admin";
  3. // Пароль = md5(md5('password'))
  4. // по умолчанию пароль "password"
  5. $chat_config['admin_password']="696d29e0940a4957748fe3fc9efd22a3";
Обязательно смените дефолтный логин и пароль! Пароль, естественно, должен храниться только в виде хэша, который можно вычислить любой программой для расчета MD5. Логин и пароль чувствительны к регистру. Настройки самого чата лучше не изменять:
  1. // Количество сообщений, одновременно отображаемых в чате
  2. $chat_config['message_count']=20;
  3. // Максимальное количество символов в сообщении
  4. $chat_config['message_text']=200;
  5. // Максимальное количество символов в имени
  6. $chat_config['message_name']=20;
Для защиты от спама используется скрытое поле с ключевым словом, его значение меняется в настройках. Лучше использовать только латинские буквы и цифры.
  1. // Кодовое слово для защиты от спама
  2. $chat_config['chat_nospam']="NO-MORE-SPAM";
Настройки внешнего вида и размеры окна чата изменяются стилями в файле chat_styles.css, в соответствующих шаблонах в папке chat_template, а иконки на кнопках в папке chat_images. По умолчанию все пути к компонентам мини-чата относительные, кодировка windows-1251.

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

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.

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

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