пятница, 23 октября 2009 г.

Капча? Как два пальца об асфальт....

Как сделать быструю captcha?
Создаем файл в корне сайта pic.php с таким кодом внутри:


<?
if (!isset($_SESSION)) session_start();

$r=rand(1000000,9999999);

$_SESSION['captcha_code']=$r;

for($i=0;$i < 7;$i++)//разбиваем секретный код на массив чисел
$arr[$i]=substr($r,$i,1);

$im=imagecreate(130,40);//создаем картинку
imagecolorallocate($im,255,255,255);
$a=0;
for($i=0;$i < 7;$i++)//наносим код на картинку
{
$color=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imagestring($im,rand(2,9),$a+=15,rand(0,20),$arr[$i],$color);
}
header("Content-type: image/jpeg");
imagejpeg($im,'',100);//выводим капчу
?>


Данный код будет генерировать нам картинку, и код, изображенный на рисунке сохраняется в переменную $_SESSION. Проверяем, видно ли картинку запросом site.ru/pic.php
Если картинкас цифрами появилась, то все в порядке и идем дальше.
В форме запроса на странице добавляем поле, в которое наш пользователь вводит число с картинки:


Введите число, изображенное на картинке: <img src="/pic.php">
<input type="text" name="captcha_code">


Ну и в скрипте обработчике проверяем, на правильность:


if(!isset($_SESSION)) session_start();
if($_POST != $_SESSION['captcha_code']) echo "Капча введена неверно"; else echo "Капча введена правильно";


Все!
Добавить к вышесказанному можно только еще варианты картинок:

Наклонные цифры:



<?
if (!isset($_SESSION)) session_start();

$r=rand(1000000,9999999);

$_SESSION['captcha_code']=$r;

for($i=0;$i < 7;$i++)//разбиваем секретный код на массив чисел
$arr[$i]=substr($r,$i,1);

$im=imagecreate(130,40);//создаем картинку
$font = 'arial.ttf';
imagecolorallocate($im,255,255,255);
$a=0;
for($i=0;$i < 7;$i++)//наносим код на картинку
{
$color=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imagettftext($im, 13, rand(-50,50), $a+=14,rand(15,25), $color, $font, $arr[$i]);
}

header("Content-type: image/png");
imagepng($im);//выводим капчу
?>



усложняем квадратами


<?
if (!isset($_SESSION)) session_start();

$r=rand(10000,99999);

$_SESSION['captcha_code']=$r;

for($i=0;$i < 5;$i++)//разбиваем секретный код на массив чисел
$arr[$i]=substr($r,$i,1);

$im=imagecreate(130,40);//создаем картинку
imagecolorallocate($im,255,255,255);
$a=0;
$color_w=imagecolorallocate($im,255,255,255);
$color_g=imagecolorallocate($im,50,50,50);
for($i=0;$i < 5;$i++)//наносим код на картинку
$arr_=imagettftext($im, 20, rand(-30,30), $a+=21, rand(17,33),$color_g,
"../gothica.ttf",$arr[$i]);

for($i=20;$i < =100;$i+=40)//ставим 3 защитных квадратика
rev($im,$i,rand(10,30));

function rev(&$im,$x,$y)//функция реверсии цвета
{
global $color_w,$color_g;
$w=$h=rand(15,30);
for($i=$x-$w/2;$i < $x+$w/2;$i++)
for($k=$y-$h/2;$k < $y+$h/2;$k++,$color_p=imagecolorat($im,$i,$k))
if($color_p>$color_w)
imagesetpixel($im,$i,$k,$color_w);
else
imagesetpixel($im,$i,$k,$color_g);
}
header ("Content-type: image/png");
imagepng($im); //выводим капчу
imagedestroy($im);
?>

среда, 7 октября 2009 г.

Возвращаем в индекс страницы virtuemart

Я не поклонник joomla. Эта неприязнь идет с давних времен, когда на ней бегал мой сайт. Все было хорошо, пока сайт не взломали. Через уязвимость в одной из компонент (к сожалению не помню в какой), на сайт внедрили исполняемый файл. Этот файл остался мне на память - очень полезная тулза, выдает всю информацию о сервере, работает как файл-менеджер, позволяет исполнять серверные команды.
При этом мне говорили - сама джумла безопасна, взлом происходит через компоненты сторонних разработчиков, но для меня это не аргумент. Сама система управления контентом должна быть ответственна за безопасность, и предоставлять разработчикам компонентов безопасную среду, в которой они не должны задумываться об уязвимостях кода.
На днях, джумла преподнесла еще один сюрприз, точнее не сама joomla, а компонент интернет-магазина virtuemart. Проблема заключалась в том, что страницы интернет-магазина не индексируются яндексом. Анализ проблемы показал, что виной всему 301-й редирект.
Оказывается, данный компонент проверяет, включены ли cookies в браузере посетителя. Причем метод проверки основывается на следующем алгоритме:
1. ставим cookie
2. редиректим на проверочный урл
3. проверяем cookie
4. удаляем cookie
Для поисковой системы, которая пытается проиндексировать данную страницу, она выглядит, как простой редирект. В моем случае редирект происходил совсем на другую страницу, поэтому запрошенных страниц в индексе не было.
Итак, лекарство.
Находим файл /administrator/components/com_virtuemart/classes/ps_session.php
Находим function doCookieCheck()
Коментим код внутри функции.
Проверка cookies будет отключена, и посетитель, браузер которого их не поддерживает, не будет проинформирован, однако ничто не сможет помешать поисковым системам индексировать странички вашего магазина.