W framework, краткий обзор

Введение

W framework — web framework написанный на двух языках программирования PHP(серверная часть) и JavaScript(клиентская часть), и предназначений для создания интерактивных web-приложений. Под web-приложением понимается один из следующих типов сайтов: социальные сети, биллинговые системы, админ-панели, различные online-менеджеры и вообще на w framework'e может работать любой сайт, который не требует индексирования своих страниц поисковыми роботами.

w framework в действии


Что было более понятно о чем идет речь, Вы можете просмотреть пример написанного мною web-приложения по следующему адресу - http://wframework.com/demo/. На оригинальность мое приложение не претендует, но все же позволят показать принцип работы самого w framework'a и работу некоторых php-классов и w-плагинов. Теперь о самом web-приложении: там Вы сможете заметить регистрацию, регистрация настоящая с проверкой личности при помощи email; так же Вы можете заметить необычную каптчу, суть этой каптчи в том, что человек способен видеть оптические иллюзии, а компьютер нет; после регистрации Вы можете перейти на страницу своего профиля и редактировать там некоторые данные, также Вы можете просматритривать страницы других профилей, но только тех профилей у которых указан противоположный пол(это что то типа социальной сети знакомств).
Читать дальше →

Установка apache, php, mysql в Ubuntu 10.10

В связи с установкой себе новой версии убунты 10.10 решил написать новое руководство по установке и настройки веб-сервера.
Мы будем использовать такие программы:

* Apache
* Php
* MySql
* PhpMyAdmin
* Mod_rewrite


Читать дальше →

Уязвимость связки PHP + nginx на сайтах с возможностью добавления файлов

хотя этот баг и был обнаружен сравнительно давно, еще в конце мая 2010 года, но его описание я увидел недавно :)

В чем заключается этот баг?

В большинстве примеров по настройке связки nginx с php-fpm / php-cgi есть похожие строчки:

location ~ .php$ {
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param script_FILENAME /scripts$fastcgi_script_name;
      include fastcgi_params;
      }


Ошибок в этих строчках нет, но если попросить у удаленного сервера отдать например строку вида uafile.com/skin/blue/images/logo.gif/test.php, то URI примет вид logo.gif/test.php, что подходит под описание location .php$, а script_FILENAME станет равным /scripts/logo.gif/test.php.

Если в настройках php.ini параметр cgi.fix_pathinfo = 1 (это его значение по умолчанию), то script_FILENAME станет равным /scripts/logo.gif, а PATH_INFO будет равен test.php

В итоге php интерпретатор обработает /scripts/logo.gif. То есть любой пользователь имеющий возможность заливать файлы на сервер (например, аватары в форуме) сможет загрузить на сервер часть своего программного кода, который будет иметь права php процесса.
Вроде и мелочь, но для умных людей это весьма полезная фича :) Скорее всего, именно так ранее и ломали форум forum.monk.com.ua :)

Как исправить этот баг?

необходимо дописать в php.ini строку:

cgi.fix_pathinfo=0 


или в описание конфигурации nginx для ваших сайтов убрать возможность выполнения подобных кодов путем добавления подобного кода:

location ~* ^/(images|css|imglib|forum/templates|forum/medals|banner|forum/files)/.* {
      access_log off;
      expires 1d;
      }


второй вариант может быть интересен и полезен тем, что при его использовании ЧПУ url'ы вашего сайта 100% останутся рабочими :)

PHP check url if valid

полезная функция для проверки ссылки на доступность:

function is_valid_url ( $url )
{
$url = @parse_url($url);

if ( ! $url) {
return false;
}

$url = array_map('trim', $url);
$url['port'] = (!isset($url['port'])) ? 80 : (int)$url['port'];
$path = (isset($url['path'])) ? $url['path'] : '';

if ($path == '')
{
$path = '/';
}

$path .= ( isset ( $url['query'] ) ) ? "?$url[query]" : '';

if ( isset ( $url['host'] ) AND $url['host'] != gethostbyname ( $url['host'] ) )
{
if ( PHP_VERSION >= 5 )
{
$headers = get_headers("$url[scheme]://$url[host]:$url[port]$path");
}
else
{
$fp = fsockopen($url['host'], $url['port'], $errno, $errstr, 30);

if ( ! $fp )
{
return false;
}
fputs($fp, "HEAD $path HTTP/1.1rnHost: $url[host]rnrn");
$headers = fread ( $fp, 128 );
fclose ( $fp );
}
$headers = ( is_array ( $headers ) ) ? implode ( "n", $headers ) : $headers;
return ( bool ) preg_match ( '#^HTTP/.*s+[(200|301|302)]+s#i', $headers );
}
return false;
}

Function set_magic_quotes_runtime() is deprecated in PHP 5.3.0

После обновления программного обеспечения на сервере ваши php скрипты стали выдавать сообщение:

Deprecated: Function set_magic_quotes_runtime() is deprecated in…

это сообщение говорит о том, что в следующих версиях PHP эта функция будет удалена
вариант решения данной задачи:

находим в вашем скрипте строку:
set_magic_quotes_runtime(0);

и заменяем её на:
ini_set(«magic_quotes_runtime», 0);

после этого все работает и не ругается :)

Проверка состояния сервера Mysql, сколько запросов, сколько медленных.


Проверка состояния сервера Mysql

Приветствую, Друзья! Я вернулся на небольшое количество времени, что бы написать один интересный пост о том как получить данные о состоянии сервера базы данных Mysql с помощью небольшого кода на php. Проверка mysql делается для того, чтобы всегда быть в курсе всех изменений в работе сервера.
Коротко расскажу о данных, которые можно будет получить:

  1. Время работы сервера.
  2. Количество потоков (соединений).
  3. Количество выполненных запросов за всё время работы сервера.
  4. Количество медленных запросов.
  5. Количество открытых таблиц за всё время работы сервера.
  6. Количество открытых таблиц на текущий момент (при проверке состояния).
  7. Количество очищенных таблиц за всё время работы сервера.
  8. Количество запросов в секунду на текущий момент (при проверке состояния).

Читать дальше →

Защита от DoS-атак

Простая защита от DoS-атак с помощью MySQL:
Организовать простую защиту от DoS-атак для сайтов, использующих PHP + MySQL, можно следующим образом. В MySQL создается таблица (будем называть ее ip_check) с полями lasttime, count, ip (все поля — типа INTEGER, причем ip — первичный ключ). Сразу после подключения к базе данных выполняется проверка, есть ли для данного IP-адреса запись в таблице. Если записи нет, она создается, при этом в count пишется 1, в lasttime — текущее время. Если запись уже есть, то проверяется, когда она была сделана (поле lasttime), и если прошло менее определенного количества секунд, то поле count увеличивается на 1, в противном случае приравнивается единице, и производится обновление записи в таблице (записывается новый count и lasttime). Далее происходит проверка величины count, и если она превысила некоторое пороговое значение, выдается статус 500 (или 403 или 503), сообщение об ошибке, и выполнение скрипта завершается.

Таким образом, для выполнения проверки требуется всего одной таблица с предельно простой структурой и 2 запроса SQL. Также можно добавить еще одно поле status, в которое ставить 1, если IP-адрес забанен навсегда по каким-то причинам, и совместить проверку на DoS-атаки с проверкой на забаненные IP-адреса без добавления дополнительных запросов. При необходимости можно еще одним запросом добавить учет суммарной нагрузки за все время или нагрузки по подсетям.

Кроме того, перед завершением скрипта можно добавить проверку, сколько времени заняло его выполнение, и если оно превышает какую-то пороговую величину (например, 10 секунд), начислять этому IP-адресу “штрафные очки” (т.е. дополнительно увеличивать поле count).

В виде кода это можно представить следующим образом:
Читать дальше →

Функции работы со строками в PHP

* addcslashes — Экранирует спецсимволы в стиле языка C
* addslashes — Экранирует спецсимволы в строке
* bin2hex — Преобразует бинарные данные в шестнадцатиричное представление
* chr — Возвращает символ по его коду
* chunk_split — Разбивает строку на фрагменты…
Читать дальше →

Nginx + PHP + MySQL (Ubuntu)

В стремлении оптимизировать клиентов сервера, мы смотрели на начальном стека программного обеспечения, которое запускается приложение. Как он работает на VPS и имеет ограниченные ресурсы, мы решили использовать Nginx — чрезвычайно легкий веб-сервер, а не Apache, который может брать много ресурсов. Ниже вы найдете мои руководство по установке Nginx 0.7.76, PHP 5.3, MySQL 5.1 и APC кэширования. Наслаждайтесь!
Читать дальше →