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

Проверка доступности функции PHP
23.09.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Ковырялся как-то в очередном сплойте, которым скрипткиддисы пытались проломить блог. Среди всякого говна нашел там интересную идею о проверке доступности функций PHP перед их вызовом. Реализация была такая же кривая, как и весь остальной код этих быдлохакеров, поэтому я переписал функцию проверки по-своему. Проверка выполняется тремя способами: анализом значения параметра disable_functions в файле php.ini, а также через функции PHP function_exists и is_callable. Использование всех трех способов проверки дает абсолютно точный результат.Code (PHP) : Убрать нумерацию
- //--------------------------------------------------------------------------
- // Функция проверки существования и доступности другой функции PHP
- //--------------------------------------------------------------------------
- // Параметры: $func - строка имени функции
- // На выходе: true - функция есть и доступна для вызова,
- // false - функция недоступна по какой-либо причине
- //--------------------------------------------------------------------------
- function is_function_enabled($func) {
- $func=strtolower(trim($func));
- if ($func=='') return false;
- // Получить список функций, отключенных в php.ini
- $disabled=explode(",",@ini_get("disable_functions"));
- if (empty($disabled)) {
- $disabled=array();
- }
- else {
- // Убрать пробелы и привести названия к нижнему регистру
- $disabled=array_map('trim',array_map('strtolower',$disabled));
- }
- // Проверить доступность функции разными способами
- return (function_exists($func) && is_callable($func) &&
- !in_array($func,$disabled)
- );
- }
Code (PHP) : Убрать нумерацию
- // Проверка доступности функции shell_exec
- if (is_function_enabled('shell_exec')) {
- echo shell_exec('ping yandex.ru');
- }
Просмотров: 7892 | Комментариев: 5

Определение MIME-type файла по его расширению
03.07.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
MIME - Multipurpose Internet Mail Extension - стандарт для определения типа передаваемой информации и механизмов ее обработки. Он сообщает браузерам о том, как им надо обращаться с запрошенными файлами, имеющими то или иное расширение. Так, например, если сервер отдает браузеру в заголовках тип MIME "text/html" для файлов с расширениями htm, html и shtml, то браузер интерпретирует все файлы с этими расширениями как файлы HTML. Также очень желательно передавать корректный MIME-type при отдаче файлов скриптом в антилич-системах.Недавно я ковырялся в одной коммерческой CMS с закрытым кодом и нашел там одну полезную функцию с большим списком MIME-типов для различных расширений файлов (всего около 400). Реализация самой функции была сделана ужасно, поэтому я ее тут даже приводить не буду. Список я немного почистил и сохранил в удобном для работы виде. Функцию тоже переписал:
Code (PHP) : Убрать нумерацию
- //----------------------------------------------------------
- // Функция определения MIME-типа файла по его расширению
- //----------------------------------------------------------
- function get_mime_type($ext) {
- // Массив с MIME-типами
- global $mimetypes;
- // Расширение в нижний регистр
- $ext=trim(strtolower($ext));
- if ($ext!='' && isset($mimetypes[$ext])) {
- // Если есть такой MIME-тип, то вернуть его
- return $mimetypes[$ext];
- }
- else {
- // Иначе вернуть дефолтный MIME-тип
- return "application/force-download";
- }
- }
Читать статью целиком »
Просмотров: 16696 | Комментариев: 9

Исследование защиты программы PHP Locker
21.05.2010 | Категория: Темная сторона Силы | Автор: ManHunter

Скриншот программы PHP Locker
В поисках очередных пациентов для PHPiD наткнулся на софтину под названием PHP Locker. "Мощная программа для шифрования ваших PHP-скриптов. Она превращает исходный код в нечто трудное для понимания и реверсивного исследования. В отличие от других систем шифрования, не требует установки дополнительных модулей на серверную часть". Это мнение о программе самих разработчиков, так что "мопед не мой, я просто разместил объяву" :) Там же на офсайте вывешен целый иконостас орденов и медалей, коими наградили этот продукт различные популярные софтообозревательные сайты. И да, к слову, цена за персональную лицензию 180$, а за корпоративную аж все 2800$.
Читать статью целиком »
Просмотров: 5768 | Комментариев: 15

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

Сервис аккредитации PHP-разработчиков
28.02.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
Чуть больше года назад натолкнулся на интересный сайт для web-программистов inPHP.org. Вот что пишут про него сами его создатели:
Сервис inPHP.org представляет собой удобный, надежный и высокотехнологичный инструмент, полезный как для IT-разработчиков, так и для работодателей. В основе проекта заложена идея обеспечения подтверждения компетенции программистов в реальном времени для любого пользователя сети интернет. Общий диапазон уровня навыков PHP-разработки, в рамках системы, условно разбит на 8 уровней (где 1-й уровень - самый простой, а 8-й наиболее сложный). Кроме того, существуют специализированные уровни, призванные охарактеризовать узкие профессиональные качества разработчика. Любой зарегистрированный участник имеет возможность, последовательно проходя тесты семи уровней, подтвердить собственную квалификацию и передать ссылку на персональную страницу в системе заинтересованным лицам (заказчикам, работодателям). Более того, после достижения седьмого уровня, участник получает возможность пройти аккредитацию сотрудником сервиса на высший уровень компетенции. Лица, заинтересованные во взаимовыгодном сотрудничестве с профессиональными PHP-разработчиками, в свою очередь, получают возможность подтверждения профессиональной пригодности того или иного кандидата просто изучив его персональную страницу в сервисе.
Смысл аккредитации в том, что надо пройти несколько бесплатных тестов по 10 вопросов в каждом, все тесты с возрастающей сложностью и разной тематикой. Если дан хоть один неправильный ответ, то повторная пересдача разрешена только через три часа. Кроме бесплатных тестов есть три дополнительных теста для специализированных аккредитаций, доступ к которым дается после оплаты (по 10 баксов за каждый), но это исключительно по желанию. Недавно в закладках снова наткнулся этот сайт, а там, оказывается, добавился новый 7-й уровень тестирования. Теперь я тоже в тридцатке хайлевелов на этом сайте :)
Просмотров: 4320 | Комментариев: 6
