Передача номера из картинки
Предлагаю немного пообсуждать на эту тему:). Есть картинка на которой генериться случайный номер (типа защита от спама:)) и после передаёться скрипту для сравнения. Я лично умнее чем заносить этот номер в БД и по ID сравнивать эти цифру, затем подчищить базу не придумал. Если кто это реализовывал сам, делиться тут:).
Кхм)))) А как еще? И шем же мсье этот вариант не нраца?
Кхм)))) А как еще? И шем же мсье этот вариант не нраца?
Просто интерестно как кто это делает. Слышал, что номер шифруют и называют этим шифром саму картинку, потом расшифровывают. Мне кажеться это больше ресурсов будет требовать нежеле чем INSERT, SELECT, DELETE. Хотя кто знает.
Просто интерестно как кто это делает. Слышал, что номер шифруют и называют этим шифром саму картинку, потом расшифровывают. Мне кажеться это больше ресурсов будет требовать нежеле чем INSERT, SELECT, DELETE. Хотя кто знает.
Ага))) Прикольно, а представь шифровальщик один, так и смысл отпадает в этих картинках, всегда на сервер отправляй одно и тоже название картинки и код, всегда получаей положительный результат от сервера)))
А с ID и номером, можно например сделать,только одноразовое использование.
Ага))) Прикольно, а представь шифровальщик один, так и смысл отпадает в этих картинках, всегда на сервер отправляй одно и тоже название картинки и код, всегда получаей положительный результат от сервера)))
А с ID и номером, можно например сделать,только одноразовое использование.
Нет, смотри. Картинка генериться в отдельной папки, мы её название не знаем. Есть какая то соль. Далее получаем номер с картинки через форму. Имя картинки делаем по принципу код + соль. Читаем папку, вытаскиваем имя картинки дефифруем и сравниваем с данными из формы. Всё.
Просто интерестно как кто это делает. Слышал, что номер шифруют и называют этим шифром саму картинку, потом расшифровывают. Мне кажеться это больше ресурсов будет требовать нежеле чем INSERT, SELECT, DELETE. Хотя кто знает.
Дык написать и замерить, че гадать-то?
Дык написать и замерить, че гадать-то?
Тут в шапке было написано, что не help, а просто немного поразмыслить на эту тему, т.к. по моемому она стоит того. По поводу "написать и замерить", то может у кого какие нормальные алгоритмы в голову прийдут или кто-то что-то своё прикольное навоял.
Картинка grayscale. 100х100.
Создание (соблюдать порядок!).
Все параметры даны на глаз для конкретики.
0. имеем ключевую строчку $key = 'fdgkj43b235^^%F&^%I&'. Эта строчка СЕКРЕТНАЯ! ХРАНИТЬ В СЕЙФЕ! ;)
1. генерируем строчку из 6 букв. пусть $code = 'arbqcc'.
2. генерируем из строки массив 5х3 таким образом чтобы array[0] и array[1] были числами от 0 до 99, а array[2] от 0 до 255. Способы самые разнообразные. Мой пример смотрите по коду.
Получилось что-то вроде $arr = array( array(34, 23, 122), ..., array(31, 32, 1));
4. Создаем саму картинку. Пишем кривые циферки/буковки.
5. наносим сверху точечный шум 15-20% (кому как нравится на глаз)
6. наносим закодированную последовательность точек на картинку, т.е. как вы уже наверное поняли, первые два числа - координаты, а третья - цвет. Всё, картинка есть.
Проверка.
0. отправили картинку (ну вот тут минус, конечно, надо будет работать с закачкой файлов) и введенный код серверу.
1. генерируем аналогично как в пункте 2 при создании картинки, массив.
2. по массиву проверяем совпадение в цветах соответствующих пикселей.
из плюсов - ничего на серваке хранить не надо.
из минусов - нагрузка на сервер во время генерации и декодирования. и надо будет закачивать картинку обратно.
в среднем gif'ованая картинка такого типа (100х100х255) весит килобайт 8, можно сделать картинку черно-белой, это уже около килобайта, и затрат ресурсов сервака поменьше, но и стойкость будет меньше, на сером надо же еще и оттенок угадать а тут тока положение. Хотя при присутствии дополнительного шума отгадать сложно. причем даже если ключ сопрут, то еще надо угадать способ его применения, а если уж и способ сперли, то чего это ж вы так уж всем все показываете? ))
Собственно код.
[COLOR=red]TIP: Есть проблема. как передать уже закачаную картинку обратно на сервер? чето не допер. если кто подскажет метод будет отлично функционировать. пока что тест ограничивается "сохранил на винт, глянул чо там, набил, отправил сохраненную пикчу". [/COLOR]
<html><body>
<form action="decode.php" method="post" enctype="multipart/form-data">
<input type="text" name="code">
<input type="file" name="picture">
<input type="Submit">
</form></body></html>
//--------- picture.php ----------
<?php
header("Content-type: image/gif");
$key = 'KYF^&R^&9f6wrq37vI&^DDCOocf86F^&D&C&^^DFO'; // секретный ключ
$code = ''; // код который надо ввести
$noise = 0.15; // 15%-ный шум
$size = 100; // размер картинки
srand(time());
// код из просто буковок, для примера хватит
$num = 5;
while($num--)
$code .=chr(rand(ord(a), ord(z)));
$hash = md5(md5($key.$code));
for($i=0;$i<5;$i++)
$pixels[$i] = array((ord($hash[$i*6])*16+ord($hash[$i*6+1])) % 100, (ord($hash[$i*6+2])*16+ord($hash[$i*6+3])) % 100, (ord($hash[$i*6+4])*16+ord($hash[$i*6+5])) % 255); // вот например таким ужасом генерируем массив
$img = imagecreate($size, $size);
// возьмем сразу весь grayscale
for($i=0;$i<256;$i++)
$colors[$i] = imagecolorallocate($img, $i, $i, $i);
imagefill($img, 0, 0, $colors[255]);
//пишем код
imagettftext($img, 18, 35, 20, 60, $black, "arial.ttf", $code);
// шум
$precentage = $size*$size*$noise;
for($i=0;$i<$precentage;$i++)
imagesetpixel($img, rand()%100, rand()%100, $colors[rand()%200]);
// кодирующие пиксели
for($i=0;$i<5;$i++)
imagesetpixel($img, $pixels[$i][0], $pixels[$i][1], $pixels[$i][2]);
imagegif($img);
?>
//---------- decode.php -----------
<?php
$key = 'KYF^&R^&9f6wrq37vI&^DDCOocf86F^&D&C&^^DFO'; // секретный ключ
$code = $_POST["code"]; // код который надо ввести
$hash = md5(md5($key.$code));
for($i=0;$i<5;$i++)
$pixels[$i] = array((ord($hash[$i*6])*16+ord($hash[$i*6+1])) % 100, (ord($hash[$i*6+2])*16+ord($hash[$i*6+3])) % 100, (ord($hash[$i*6+4])*16+ord($hash[$i*6+5])) % 255); // еще раз генерируем массив
$upload_file = dirname($_FILES['picture']['tmp_name']).'\\'.$_FILES['picture']['name'];
move_uploaded_file($_FILES['picture']['tmp_name'], $upload_file);
$img = imagecreatefromgif("$upload_file");
for($i=0;$i<5;$i++)
{
$rgb = ImageColorAt($img, $pixels[$i][0], $pixels[$i][1]);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
if($r != $g || $g != $b || $b != $r || $r!= $pixels[$i][2])
{
echo "rgb at {$pixels[$i][0]}, {$pixels[$i][1]} is $rgb, must be {$pixels[$i][2]}";
exit("\nWrong code!!!");
}
}
echo 'Check succesful!';
?>
Фух. Усё. ))
Предложение к модерам. Предлагаю ввести новый новый подраздел "Обсуждение" и туда подобные посты постить. Дело нужное и важное (как мне кажеться). Даже если темы тут подобные создовать, то они рано или поздно, но сойдут с первых страничек и забудуться, а потом вообще изчезнут. И так, если начальство даёт добро, то даже 2 названия придумал "Аналитика", "Обсуждение".
1) Кодируемая последовательность случайна
2) использование хэширования которое обеспечивает отсутствие каких бы то ни было зависимостей положения пикселя и его цвета от кода (ну т.е. если код 111111 последовательность одна, а если 111112 то она уже ну совсем-совсем другая %)))
Т.е. шум нужен для маскировки кодируемой последовательности. В принципе можно и в имени кодировать, но там стойкость поменьше будет (вопрос о достаточности открыт всегда )). Хотя если сделать имя достаточно длинным, а алгоритм кодирования с достаточным количеством стадий, то подобрать уже и строку будет нереально.
Вот как я подумал, какой-то конкретный ключ это неправильно. Нужен некий редкосменяющийся ключ, присущий только вашей машине. Можно например написать демон, который создает генератор, который меняет свое значение каждый час. Т.е. если хакер даже и увидит ваш код, то доступ к генератору ключей получить будет ну куда сложнее. Или размер файла какого-нить ).
$count = $size*$size*$precentage;
for($i=0;$i<$count;$i++)
imagesetpixel($img, rand()%100, rand()%100, $colors[rand()%200]);
// кодирующие пиксели (пункт 6)
for($i=0;$i<5;$i++)
imagesetpixel($img, $pixels[$i][0], $pixels[$i][1], $pixels[$i][2]);
Можно например написать демон, который создает генератор, который меняет свое значение каждый час. Т.е. если хакер даже и увидит ваш код, то доступ к генератору ключей получить будет ну куда сложнее. Или размер файла какого-нить ).
По поводу постоянной смены кода (автоматом) - это мысль:).
У тому же, надо подумать - а что мы конкретно хотим от скрипта? ИМХО, нужен способ, которому нужно минимум траффика (насчет обратной передачи картинки я, конечно, погорячился :) ). Он совсем не обязательно не обязан быть неломаемым, т.к. нам не нужна глухая защита, мы всего-лишь проверяем кто перед нами: человек или робот?.. Т.е. скрипт можно сделать даже потенциально крякаемым, но чтобы на его кряк требовалось ну ооочень много ресурсов (не сети, а именно робота).
Имхо ни один нормальный крякер не станет так надрывать свою машину только ради того, чтобы программно сделать то, что ручками сделать ну гораздо быстрее (т.е. просто по-человечески набить код :) ). А от особо упорных робот-чеком не защититься.
Можно реализовать способ a-la предложенный мной с картинкой, только со строками. Т.е. пишем в невидимую форму какую-нибудь строку-индентификатор (с именем картинки я бы не хотел заморачиваться, т.к. надо жестко следить за допустимостью символов в имени, длиной и т.д.). Если в лоб, то можно использовать битовую карту и работать с ней как с картинкой, т.е. тоже накладывать "шум" и кодирующие "пиксели", а при передаче просто преобразовывать по какому-л. алгоритму в строку.
У тому же, надо подумать - а что мы конкретно хотим от скрипта? ИМХО, нужен способ, которому нужно минимум траффика (насчет обратной передачи картинки я, конечно, погорячился :) ). Он совсем не обязательно не обязан быть неломаемым, т.к. нам не нужна глухая защита, мы всего-лишь проверяем кто перед нами: человек или робот?.. Т.е. скрипт можно сделать даже потенциально крякаемым, но чтобы на его кряк требовалось ну ооочень много ресурсов (не сети, а именно робота).
Имхо ни один нормальный крякер не станет так надрывать свою машину только ради того, чтобы программно сделать то, что ручками сделать ну гораздо быстрее (т.е. просто по-человечески набить код :) ). А от особо упорных робот-чеком не защититься.
Тут ещё один нюанс. Если картинку генерить тяжело (много ресурсов), то можно страничку автоматом (скриптом) рефрешить и сервак задумаеться, а потом хостер тебя попросит.
Просто как я это вижу после этого обсуждения:
1. Генерим надпись для картинки.
2. Шифруем с солью и даём это как имя картинки (укладываем в отдельную папку чтоб снизить нагрузку (не искать среди других картинок)).
3. Берём картинку расшифровываем её и сравниваем с введённым.
4. Соль меняем каждый час (день, месяц... по вкусу и потребностям).
5. Можно в оттдельный файл генерить соль при каждом вызове скрипта и получаться она будет каждый раз разная, поэтому раскрытие не к чему не приведёт. Попробую отработать и заняться этим:).