Тэг ‘php’

PHP - пасхальные яйца - fun

Пасхальные яйца в PHPПасхальными яйцами (Easter Eggs) называют “секреты” спрятанные от глаз пользователя и не связанные с основной идеей игры или программы.

Разработчиков PHP, вдохновение и чувство юмора тоже не обошло стороной. Достаточно передать специальные GET  параметры, чтобы “найти яичко” :)

любой_сценарий.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42

В зависимости от версии PHP-интерпретатора Вы сможете увидеть что-то из этого (заодно и проверить версию php :) ):

1. фотография Thies Arntzen (версии 4.1.2, 4.2.2)
2. фотография таксы (владелец Stig Bakken) (версии 4.3.2, 4.3.3, 4.3.8 — 4.3.10)
3. фотография чёрного терьера (владелец Zeev Suraski) (версии 4.3.11, 4.4.0 — 4.4.4, 5.1.0, 5.1.2)
4. фотография кролика (версии 4.3.1, 5.0.0, 5.0.3)
5. искажённый логотип PHP (последние версии)

Логотипы PHP и ZEND отображаются при следующих значениях:

любой_сценарий.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
любой_сценарий.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42

Кстати, существуют функции php_logo_guid для логотипа PHP и zend_logo_guid для логотипа Zend.

Чтобы увидеть список всех авторов PHP, вводим следующее значение:

любой_сценарий.php?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

ps. Кстати, похоже, в компании Masterhost, с чувством юмора похуже. :) На хостинге (проверил парочку сайтов с разных серверов… на всякий случай) ни одного яйца PHP не найдено. :) А на вашем хостинге есть яйца?

Опубликовано Март 4, 2010 | автор: levik  |  Нет комментариев »

open_basedir restriction in effect

Столкнулся с необычным проявлением ошибки open basedir restriction:

Warning: open_basedir restriction in effect.
File /path/to/file is not within the allowed path(s):
(/path/to/dir1:/path/to/dir2) in /path/to/dir/filename.php on line 385

Сообщение такого рода возникает при попытке обратиться к файлу, который расположен за пределами “разрешенных” для php каталогов. Настройки хостинга обычно не препятствуют открытию файлов в пределах “домашнего” каталога пользователя или корневого каталога сайта. Значение переменной php_value open_basedir изменяется в httpd.conf или в php.ini. В .htaccess значение open_basedir изменить нельзя!!!

Часто сообщение open_basedir restriction вызвано неправильной обработкой загруженных при помощи php файлов - использование функции copy, unlink, rename вместо правильного move_uploaded_file. Об особенностях использования функции move_uploaded_file более подробно можно прочитать тут

Однако, как оказалось, такая ошибка может возникать ещё и при использовании функции tempnam(string $dir, string $prefix), которая должна создавать временный файл в каталоге $dir, если же каталог не существует, то пытается создать этот файл во временном каталоге системы. Стоит также проверить каталог $dir на запись - в моем случае именно права на доступ к каталогу стали причиной ошибки open basedir restriction.

ps. обнаружил при работе с simple csv upload интернет-магазина на базе virtuemart

Опубликовано Февраль 5, 2010 | автор: levik  |  Нет комментариев »

SMF ошибки форума в таблице _log_errors

SMF (Simple Machines Forum) ведет лог ошибок, который сохраняет в базе в таблице _log_errors

2: strpos() [<a href=’function.strpos’>function.strpos</a>]: Offset not contained in string<br />Файл: smfdir/Themes/default/BoardIndex.template.php (eval?)<br />Строка: 1

2: gzinflate() [<a href=’function.gzinflate’>function.gzinflate</a>]: data error
Файл: smfdir/Themes/default/BoardIndex.template.php (eval?)
Строка: 1

2: strpos() [<a href=’function.strpos’>function.strpos</a>]: Offset not contained in string<br />Файл: smfdir/Themes/default/Register.template.php (eval?)<br />Строка: 1

8: Undefined index: dhhag
Файл: smfdir/Themes/default/BoardIndex.template.php (eval?)
Строка: 1

И еще куча записей с аналогичной ошибкой в разных файлах. Что-то подсказывает - видимо, “не все в порядке”..
Заглядываем в первую строку и видим что-то вроде:

<?php /**/eval(base64_decode('aWY ... 7fX19')); ?>

Подобное безобразие творится и в остальных “ошибочных файлах”. Файлы в одном каталоге, кстати имеют одинаковую дату изменения. Видимо имеет место, массовое изменение файлов по ftp или скриптом. Наблюдаем… Не исключено, что вирус на локальном компьютере.

upd 10.12.2009
После такой зачистки ошибки smf-форума довольно долго не появляются. Похоже, все в порядке.
Кстати, видимо, эта “зараза” поддерживает “обновления”. То есть при обновлении форума на более новую версию, она переносится (возможно, изменяясь) в файлы новой версии. И периодически “обновляется” - “зараженные” файлы имели довольно свежую дату изменения, причем в каждом каталоге свою и “одну на всех”…

Опубликовано Ноябрь 26, 2009 | автор: levik  |  Комментарии (2) »

Капча (captcha) для Wordpress

Думаю, сегодня, практически каждый, кто ведет свой блог на Wordpress, сталкивался со спам-комментариями. Комментируют все подряд, иногда даже “похоже, что в тему”, но все чаще - либо слишком общие фразы, либо вообще невпопад. :)

Как защититься от спамеров в комментариях?

Общепризнанный вариант - CAPTCHA (Капча, каптча) , от английского Completely Automated Public Turing test to tell Computers and Humans Apart (полностью автоматизированный публичный тест Тьюринга для различия компьютеров и людей).

В последнее время все чаще этим термином стали называть любую защиту от спама. Можно встретить сочетания “графическая капча”, “звуковая капча”. Не будем вникать в корректность этих словосочетаний.. Сделаем упор на защиту от спамера, неважно каким способом.

Плагины Капча для Вордпресс - краткий обзор / CAPTCHA for Wordpress

Капча yacaptcha

Yacaptcha

Плагин несложен в установке и довольно просто “разбирается” последовательность символов на картинке. Все-таки не нужно забывать о тех, кто будет вводить символы с клавиатуры.

Капча AntispamImage
Капча AntispamImage
Особенность состоит в том, что кроме изображения, присутствует еще и текст… Какие символы вводить, а какие - “пропустить”. Тоже довольно “разборчивый”.Особых сложностей в установке у меня не вызвал. :)

Капча “Клик и готово”

Один из “оригинальных” плагинов, который в силу своей оригинальности, простоты и удобства приобрел значительную массовость. Вся “фишка” заключается в том, что человеку нужно всего-лишь “кликнуть” на квадратик напротив надписи “Я не робот”. Надо отдать должное, и идея, и реализация - на высоте. А самое главное, он прост в изменении… На случай “взлома”..

Будем ждать, чем ответят спамерские скриптописатели…

Капча reCaptcha

Recaptcha - графическая и звуковая капча
Капча - монстр. :) Графическая и звуковая капча в “одном лице”. Причем, графические символы “не могут быть распознаны” обычным OCR алгоритмом. Однако, и человеку не всегда удается с первого раза распознать, о чем пишут.. И уж тем более, говорят (по-забугорному говорят.. )

Да, еще момент.. Много отзывов о проблемах с установкой плагина…

Simple CAPTCHA

Simple Captcha

Еще один пример графической капчи. Плагин устанавливается без проблем, работает “как часы”, однако, судя по отзывам, “взломан” спамерскими алгоритмами. Хотя, часть комментариев отсеивает - проверено. :)

Опубликовано Август 25, 2009 | автор: levik  |  Комментарии (9) »

Apache, htaccess и настройки PHP (php_value и php_flag)

Правильная (точнее, желаемая) работа PHP интерпертатора зависит от правильной конфигурации. Конфигурационные настройки PHP или директивы php.ini (php_value или php_flag) можно задавать несколькими способами:

  • в файле php.ini (скорее всего, если у Вас не выделенный сервер, то туда Вас не пустят. Хотя, некоторые хостинги предоставляют возможность создать собственный php.ini. Можно уточнить у хостинг-провайдера… Но в любом случае переживать пока рано, ведь это только первый способ;
  • если PHP используется как модуль Apache (или другого веб-сервера), то можно прописать настройки в файле httpd.conf (файл настроек веб-сервера, к которому пользователя простого хостинга тоже навряд ли допустят);
  • в файле .htaccess (в очередной раз речь про web-сервер, к примеру, Apache) - в последнее время обработка этого файла считается нормой для хостинга. И собственные настройки PHP, как правило, устанавливаются в этих файлах;
  • непосредственно в скриптах php с использованием функции ini_set().

Мы рассмотрели все возможные способы задания конфигурационных настроек интерпретатора PHP (Да, если кто знает другие варианты - сообщите.)

Есть еще маленькое “но”. Не все переменные php_value разрешено изменять в файле .htaccess (в зависимости от настроек сервера, изменение конфигурации PHP пользователем вообще может быть запрещено)

Некоторые настройки (:

php_value register_globals on
php_flag session.use_trans_sid off
php_flag session.use_only_cookies on
php_value max_execution_time 60
php_value upload_max_filesize 8M
php_flag display_errors off
php_flag log_errors on
php_value error_reporting 2047
php_value error_log log-file.txt

Опубликовано Июнь 27, 2009 | автор: levik  |  Нет комментариев »

Водяные знаки на PHP

Проблема: иногда недобросовестные (или добросовестные, но без злого умысла и задней мысли) представители интернет-индустрии используют эксклюзивные авторские изображения без указания авторства и без всякого на то разрешения. Конечно, нормативные документы, гласящие об авторском праве в настоящее время упоминаются чуть ли не на каждом шагу; множество решений в суде, вынесенных в пользу автора…

Одним из способов указания авторства изображений, который довольно широко используется в Интернет - так называемые Watermark или Водяные знаки - изображения, содержащие информацию об авторе или сайте, для дальнейшего наложения на оригинальные авторские изображения.

В сети можно найти массу реализаций. Наиболее простым мне показался следующий вариант - наложение 8-битного (при желании - прозрачного) png-изображения (идентификатор в переменной $watermark_img_obj) с определенной прозрачностью ($alpha_level от 0 до 100) на основное изображение ($main_img_obj)

function watermark( $main_img_obj, $watermark_img_obj, $alpha_level = 100) {
$watermark_width = imagesx($watermark_img_obj);
$watermark_height = imagesy($watermark_img_obj);
$dest_x = imagesx($main_img_obj) - $watermark_width - 10; // правый
$dest_y = imagesy($main_img_obj) - $watermark_height - 10; // нижний угол изображения
imagecopymerge($main_img_obj, $watermark_img_obj, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $alpha_level);
return $main_img_obj;
}

Конечно, это не “супер-мегакласс” с кучей параметров, но защитить изображения водяным знаком функция позволяет сделать без особых сложностей. Можно написать свою, как, например тут. Можно воспользоваться готовыми классами - watermark от PixelJeck-а, imagemanipulator, который предоставляет гораздо более широкие возможности для работы с изображениями, или же написать свой.

Еще, думаю, есть смысл обратить внимание на ImageMagic, а точнее на его интерфейс в php - IMagick.

Как лучше расположить надпись/водяной знак на изображении, чтобы с одной стороны сохранить информацию об авторе изображения, а с другой - не испортить изображение… Нельзя забывать, что желательно, чтобы посетитель мог сконцентрироваться не на водяном знаке, а на самом изображении.

Для Wordpress существует отдельный плагин wp-watermark, который кстати можно использовать для массового наложения водяных знаков на все файлы из каталога.

Любой класс или функцию можно взять за основу для своих наработок, которые в дальнейшем можно использовать как готовые “кирпичики” в своих проектах. Перерабатывая классы и функции “под себя” не только лучше вникаешь в алгоритм самой функции, но и можешь сделать то, что считаешь нужным. :)

Удачи!

Опубликовано Май 5, 2009 | автор: levik  |  Нет комментариев »

СURL в PHP (libcurl)

CURL (Client URL Library), libcurl - библиотека функций для работы с серверами по различным протоколам (http, ftp, https … и ряд других - более подробно смотрите описание последней версии).

В php включена  (если точнее, имеется возможность включить - зависит от конфигурации сервера) поддержка curl. Проверить, поддерживается ли сервером функции curl проще всего, произведя вызов любой из функций, например
<?php
$ch = curl_init("http://www.example.com/");
?>

Если исполнение этого кода не приведет к ошибке - все в порядке, можем использовать CURL в “корыстных целях”. Если же “функция не существует”… Но, впрочем, это уже совсем другая история. А пока вернемся к нашим.. CURL ам.

В PHP самый простой вариант использования библиотеки обычно  сводится к следующим шагам:

Инициализация - curl_init($url);
Установка параметров - curl_setopt($ch, $opt, $value);
Выполнение запроса - curl_exec($ch);
// Получение и обработка информации - обычно хватает результата, возвращенного предыдущей функцией, однако, существует несколько дополнительных функций, например curl_getinfo($ch);
Закрытие - curl_close($ch);

Особенности и подводные камни:
CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR при работе в  WINDOWS будут правильно работать только при указании полного пути к файлу.

Опубликовано Апрель 7, 2009 | автор: levik  |  Нет комментариев »

И снова бланки - работа с word средствами javascript и php

В очередной раз стала актуальной задача с подготовкой бланков. Однако, способ с бланком в формате rtf не подходит - файл .doc весит ~2 Мб, файл же rtf ~ 34 Мб. Видимо, зависит от хранения рисунков…

Работать с COM-объектом Word можно непосредственно из PHP:

// Код PHP
$word=new COM("Word.application") or die("Couldn't start Word!");
//после создания объект невидимый
//сделаем его видимым и активизируем (разумеется, для работы на сервере это необязательно)
$word->visible =1;
$word->Activate();
//Создать документ по шаблону:
$word->Documents->Add("c:\\template.dot");
// действия - найти-заменить и т.д. Описаны в документации по VisualBasic for Application - в справке MS Word (по умолчанию не устанавливается)
$word->ActiveDocument->SaveAs("C:\\".$fname);
$word->Quit();

Однако, подобный способ подходит только для Windows-серверов.

Еще один вариант - работа с COM-объектом на стороне клиента через Active-X при помощи JavaScript:


><script language="javascript">
// Создание объекта MS Word:
word = new ActiveXObject ("Word.Application");
// Создание документа и установка параметров страницы:
with (word) {
Documents.Open('c:\\0.doc');
ActiveDocument.Label1.Caption = < ?=$sum?>;
ActiveDocument.SaveAs ('c:\\1.doc');
Quit (); // завершает работу MS Word
}
</script>

Предварительно следует сохранить документ-шаблон на диск C:\ с именем 0.doc.
В шаблоне - создать “Label”-ы и расположить их в соответствии с нужным расположением текста.
С учетом специфики задачи - получаем еще один небольшой выйгрыш - “основной” файл не качается с сервера.
Технология, думаю, понятна. Вариации - насколько фантазии хватит.

ps. Не забудьте поставить разрешения в свойствах обозревателя.

( Свойства обозревателя - безопасность - Выбираем “Надежные узлы”. После чего, нажимаем “Другой..” - и устанавливаем все переключатели, где упоминается ActiveX в “Разрешено”.)

А в Надежные узлы следует добавить “Наш” сайт - где формируются бланки.

Опубликовано Март 18, 2009 | автор: levik  |  Нет комментариев »

HTTP заголовок - как передать?

Вебмастеру частенько нужно передать служебную информацию при помощи HTTP-заголовка. Как это можно сделать?

Передаем Http заголовок средствами HTML

Если быть совсем точным, то формулировка не совсем верна, поскольку мы передаем не заголовок, а служебную информацию, аналогичную информации заголовка, однако содержится она непосредственно в сообщении. Однако, META-теги, например могут влиять на кэширование страниц в браузере по аналогии с HTTP-заголовками.
<meta http-equiv=”Expires” content=”Mon, 19 Jan 2009 20:37:25 GMT”>
<meta http-equiv=”Pragma” content=”no-cache”>

Передаем HTTP-заголовок средствами PHP

В PHP (да и в любом серверном языке программирования) для передачи заголовков существует специальная функция. В PHP она носит название header(). В качестве параметра указывается текст http-заголовка:
header('Content-Language: ru');
header("HTTP/1.0 404 Not Found");
// далее следует вывод страницы
?>

Следует отметить, что  вывод заголовков должен предшествовать выводу содержимого документа. Иначе, php-интерпретатор выдаст предупреждение, а заголовок передан не будет.

Передаем HTTP-заголовок средствами сервера

Часть заголовков формируется без явного указания в скрипте, непосредственно сервером или его модулями (например, php-интерпретатор сообщает заголовок “X-Powered-By”). Мы можем подсказать серверу, какие заголовки выдавать в том или ином случае.

В частности, Apache-сервер позволяет формировать HTTP-заголовки при помощи служебного файла .htaccess
Header set Cache-Control “no-cache, must-revalidate”
Header set Expires “Mon, 19 Jan 2009 20:41:25 GMT”
Header set Pragma “no-cache”

Для этого случая при запросе любого файла с расширением .xml, будет передана служебная информация, запрещающая кэширование файла на стороне клиента.

Возможно, рассмотрены далеко не все варианты, но их вполне достаточно, чтобы использовать на практике.

Опубликовано Январь 19, 2009 | автор: levik  |  Комментарий (1) »

OsCommerce - замеченные глюки-баги

Решил собрать некоторые глюки Oscommerce (версии и сборки различные) , потому как порой, как оказалось, они встречаются чаще одного раза.. А когда помнишь, что ты уже это делал.. и не помнишь, как.. а поиск выдает что-то не то..

Возможно, окажется полезным не только мне..

OsCommerce не отображает некоторые товары

Поскольку в этом SHOP-монстре куча всевозможных настроек, следует убедиться, что “скрытый” от глаз посетителя товар не отключен этими настройками. Естественно, если один товар отображается, а другой - нет, следует… сравнить атрибуты/параметры этих товаров в админ панели Oscommerce или непосредственно в базе. В моем случае, для не отображаемых товаров просто не был указан производитель.

OsCommerce не добавляет некоторые товары в корзину

Столкнулся с “чудесами” - все товары (все проверенные - порядка 30) в корзину добавляются нормально, один - ну никак не хочет. При попытке добавить в корзину происходит переход на пустую корзину.
Проблема оказалась в добавлении к атрибуту action в теге form дополнительного параметра &sid=id_sesion..

Oscommerce не дает войти в админ центр

Проблема оказалась в принудительной установке Cookies - поправил изменением значения в таблице configuration (непосредственно в базе)

Oscommerce выдает ошибку при обновлении версии MySQL

При обновлении базы MySQL, используемой OsCommerce с версии 4 на версию 5, магазин “радует” нас англоязычными сообщениями об ошибках. Поиск по аглицким форумам помог решить проблему - в свое время  пару часов пришлось повозиться. Однако, сейчас уже и не вспомню… Если повторится - дополню…

На самом деле, несмотря на кажущуюся “громоздкость”, oscommerce , если разобраться, не такой уж сложный магазин. Наличие форумов, как русскоязычных, так и забугорных, дает возможность вникнуть и решить практически любую проблему.. (не путать с “проблему решат за тебя”.. хотя, обычно, вопрос цены…)

Опубликовано Август 19, 2008 | автор: levik  |  Нет комментариев »