Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от автопостинга.
 
 автор: mrklon   (21.11.2006 в 20:51)   письмо автору
 
 

Как сделать защиту от автопостинга без использования GD. (типа: "введите текст на рисунке")
Гдто слышал, что можно. Или это бравада?

   
 
 автор: ihoru   (21.11.2006 в 21:27)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Ну, может сессиями?

   
 
 автор: Киналь   (21.11.2006 в 23:40)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Можно, конечно - сессии, рефереры... Но GDlib - это самый надежный способ. Хотя и не 100%-ный.

   
 
 автор: Гончий пёс   (21.11.2006 в 23:50)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Попробуй вот как:
Создай в фотошопе например десять картинок с цифрами и 26(по-моему в английском) с буквами. Присвой картинкам сложные имена. Создай массив с именами картинок и значениями. Рандомно вызови 4(пять или шесть) картинок, параллельно создав сессионную переменную со значениями картинок. Обработчик сравнит значения переданных данных с массивом. Если верно - всё ок, в противном случае - ахтунг.
Есть еще пара вариантов - минут через 15 выложу скрипт.

   
 
 автор: cheops   (22.11.2006 в 00:58)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Надёжнее изображения ничего нет - всё остальной можно подделать, но подделку могут осуществить не многие и это отчасти спасает. Например, вы можете поместить в скрытое поле SID-сессии и проверять равно ли переданное значение, тому что назначено посетителю. Для поддержки сессии - нужно поддерживать сессионный cookie, не каждый скрипт автопостинга это умеет (продвинутые, конечно, умеют).

   
 
 автор: гость 007   (22.11.2006 в 23:26)
 
   для: cheops   (22.11.2006 в 00:58)
 

http://softtime.ru/forum/read.php?id_forum=1&id_theme=9050&page=1
а ведь сами учили всех делать это))

   
 
 автор: Гончий пёс   (22.11.2006 в 01:04)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Оооочень простой вариант. Использовалось десять картинок с цифрами от 0 до 9, имена картинок соответствуют цифрам.
Первый файл: форма
<?php
@session_start();
$quantity 10#количество картинок с символами
$quantity--;
$display 4#количество картинок выводимых на экран
$i 1;
$sess "";
                while (
$i <= $display)
                {
                
$pict rand(0$quantity);
                
$sess .= $pict;
                echo 
"<img src='$pict.gif'>";
                
$i++;
                }
$_SESSION['secure'] = md5($sess);
?>
<form action="handler.php" method="post">
<input type="text" size=4 name="secure"><br>
<input type="submit" value="Отправить"><br>
</form>


Второй файл: обработчик
<?php
session_start
();
if (isset(
$_POST['secure']))
{
                if (
md5($_POST['secure']) == $_SESSION['secure']) 
                {
                echo 
"Правильно!<br><br><br>" ;
                }
                else
                {
                
$_SESSION = array();
                echo 
"Неправильно!<br><br><br>";
                }
}
include 
"index.php";
?>


ГЛАВНЫЙ НЕДОСТАТОК - если проанализировать (разобрать рег.выражением) содержимое страницы, то можно "выдернуть" имена картинок.

   
 
 автор: XPraptor   (22.11.2006 в 04:46)   письмо автору
 
   для: Гончий пёс   (22.11.2006 в 01:04)
 

В принципе, автопостинг, это не всегда плохо. Но если бот не следует правилам, то нужно банить его (сделать анализ IP, USER-AGENT, и REFERER).
А вот от автосубмитерров которые через сокеты напрямую вам пытаются флуд пихать, конечно надо защититься.
ИМХО самый хитрый для автосубмитеров ботов, которые не хотят следовать правилам, способ защиты - это сделать кнопку или ссылку которая отправляет форму через JavaScript.

Вписать в ссылке href="#" onclick="script_before_submit()"

В скрипте script_before_submit сделать фоновым запросом запрос к БД и получить какую нить пару секретных значений (сгенерировать их и записать в БД). Затем эту пару явой вставить в пустые hidden поля формы и только после этого сделать форме submit.

На входе в скрипт получения данных провериь эту пару значений по БД и если их нету или не совпадают, то послать на фиг, если есть, то принять данные и удалить из базы для предотвращения повторного поста.

ИМХО, это самый хитрый метод для прямых ботов. Но он не спасет от ботов, которые работают в реальном окне обозревателя.

   
 
 автор: tuder   (22.11.2006 в 07:30)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Просить ввести ответ на вопрос. :-)
Год рождения известной личности, дату какого-либо события...
И сделать большой набор таких вопросов.

   
 
 автор: Yakor   (22.11.2006 в 07:36)   письмо автору
 
   для: tuder   (22.11.2006 в 07:30)
 

да нафиг это все...

самое надежное - это captcha..... вот отличный сайт про это: http://www.captcha.ru/kcaptcha/

   
 
 автор: mrklon   (22.11.2006 в 08:18)   письмо автору
 
   для: Yakor   (22.11.2006 в 07:36)
 

Спасибо за ответы. Я буду комбинировать защиты, так что думаю не пробьют...:)
Но, на самом деле, я хотел спросит: как сделать защиту на картинках без использования GD Никак?

   
 
 автор: Киналь   (22.11.2006 в 19:42)   письмо автору
 
   для: mrklon   (22.11.2006 в 08:18)
 

>Я буду комбинировать защиты, так что думаю не пробьют...:)
Не обольщайтесь) Захотят - пробьют.

>Но, на самом деле, я хотел спросит: как сделать защиту на картинках без использования GD Никак?

Никак. Просто по определению.

   
 
 автор: Trianon   (22.11.2006 в 20:02)   письмо автору
 
   для: Киналь   (22.11.2006 в 19:42)
 

ну это, положим, преувеличение... формат GIF не настолько сложен, чтобы не сгенерировать картинку средствами php. Да и png наверное, тоже. В некотором смысле даже проще. Компрессор писать не надо.

   
 
 автор: Киналь   (22.11.2006 в 20:51)   письмо автору
 
   для: Trianon   (22.11.2006 в 20:02)
 

А, ну да, действительно=) Не сообразил, что библиотеки тоже пишутся. Тогда, правда. можно обойтись без GDlib - просто написать ее самому=)

   
 
 автор: Loki   (23.11.2006 в 10:30)   письмо автору
 
   для: Киналь   (22.11.2006 в 19:42)
 

>Никак. Просто по определению.
Да нет... на графике свет клином не сошелся... есть и другие методы...

   
 
 автор: mrklon   (23.11.2006 в 11:16)   письмо автору
 
   для: Loki   (23.11.2006 в 10:30)
 

>Да нет... на графике свет клином не сошелся... есть и другие методы...

А, вот сдесь, если можно, по подробней :)

И еще, ролучаеться так, что единственный способ серверу определить ЧЕЛОВЕК ли ему отправляет данные или РОБОТ это картинка, т.к. только чел может прочитать, что там написанно. Все остальное неработает, можно поймать, прочитать, проанализировать и дать ответ. Но почему вы говорите, что даже этот способ не на 100% спасает?

Извините, если янесу чушь, просто хочу разобраться.

   
 
 автор: Loki   (23.11.2006 в 11:30)   письмо автору
 
   для: mrklon   (23.11.2006 в 11:16)
 

инструментов дофига: html, css, JS. Просто никто головой думать не хочет. Вот и приходится на каждом форуме видеть однотипные решения с картинкой разной степени убогости.
Я немного подумал головой и с начала августа у меня в форуме и гостевой небыло ни одного спаммерского сообщения. И никто робота конкретно под мой форум настраивать не будет... а если настроит - у меня в запасе еще 3-4 решения готовы. Кончайте как попки повторять одно и тоже. Поймите, наконец, робот может парсить код, но не может понимать что написано, нарисовано и пр... Отличить робота от человека можно множеством разных способов.

   
 
 автор: Trianon   (23.11.2006 в 11:36)   письмо автору
 
   для: Loki   (23.11.2006 в 11:30)
 

Золотые слова!

   
 
 автор: ssgv   (23.11.2006 в 11:35)   письмо автору
 
   для: mrklon   (23.11.2006 в 11:16)
 

Все завист от того какой бот.... если это хорошо написанная программа и она пришла к вам на сайт то это значит вас кто-то не любит..))))) И избавится от него можно только написав антипрограмму..)))) Например еще один Антивирус-Касперского...)))

Боты бывают разные..., вот в маем случаи каторый у меня был бот обходил и цифирки и картинки :( Он погарел на том что использовал один и тот же url в сообщении..)))
Вообщем с разными потами и гадостью можно бороться исходя из сложившийся ситации наверно... по обстоятельствам и характеристики спасма... наверно так...

   
 
 автор: Гончий пёс   (24.11.2006 в 05:22)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Если я еще не надоел, то есть один забавный вариантец... Небольшой апгрейд предыдущего варианта.

Итак...
Файл первый - форма: index.php

<?php
@session_start();
$quantity 10#количество картинок с символами
$quantity--;
$display 4#количество картинок выводимых на экран
$date date("z"); //Дополнительная переменная - номер дня в году
$i 1;
$sess "";
    while (
$i <= $display
        { 
        
$pict mt_rand(0$quantity); 
        
$sess .= $pict;
        
$picture md5(md5($pict.$pict).$date);//Самый сложний в мире алгоритм хеширования
        
echo "<img src='picture.php?p=$picture'>"
        
$i++; 
        }
$_SESSION['secure'] = md5($sess);
?>
<form action="handler.php" method="post">
<input type="text" size=4 name="secure"><br>
<input type="submit" value="Отправить"><br>
</form>


Файл второй - выводилка картинок: picture.php

<?php
@$p $_GET['p'];
$date date("z"); //Дополнительная переменная - номер дня в году
$k 0;
    while (
$k <= 10)
        {
        
$k_hash md5(md5($k.$k).$date);//Самый сложний в мире алгоритм хеширования
            
if ($k_hash === $p)
                {
                
$file fopen("$k.gif""rb");
                
fpassthru($file);
                
fclose($file);
                break;
                }
        
$k++;
        }
?>


и наконец третий файл всё тот-же обработчик: handler.php

<?php
session_start
();
if (isset(
$_POST['secure']))
{
                if (
md5($_POST['secure']) == $_SESSION['secure']) 
                {
                echo 
"Правильно!<br><br><br>" ;
                }
                else
                {
                
$_SESSION = array();
                echo 
"Неправильно!<br><br><br>";
                }
}
include 
"index.php";
?>



Принцип работы:
1.Генерируется случайное число
2.Случайное число сложным образом хешируется и привязывается к дате.
3.Вместо вывода картинки напрямую мы запрашиваем скрипт-посредник с передачей ему хеша
4.Скрипт-посредник зная алгоритм хеширования подбирает числовое значение.
5.Если значение совпало - читает и выводит картинку в бинарном режиме.
6.Картинка же выводится на основной странице.
7.При попытке пропарсить код, роботнаткнется на не совсем понятное picture.php?p=e7f3b42565c47a156ae6534cea045cae, что вряд ли похоже на 1.gif

Нововведения:
1.Супер-пупер-мега-сложный алгоритм хеширования использован для того, чтобы не было соблазна подобрать значения. Тем паче с такими-то salt`ами:)
2. Дополнительная переменная введена со следующей целью - чтобы хеш доступа (назовем его так) ежедневно менялся. Даже если автору робота и придет в головы сопоставить хеши с выводимыми картинками, то "завтра" они устареют.
ОДНАКО!!! Есть и минус! Существует ненулевая вероятность того, что хеш в форме сгенерируется "сегодня" а в выводилке картинок "завтра", а следовательно, хеши не совпадут и пользователь не увидит картинку. Неприятная, надо заметить, коллизия. Как с этим бороться - пока не придумал. Как вариант - можно подсунуть юзеру заведомую "ветошь", дабы спровоцировать неверный результат - в конце концов, все мы ошибаемся, и предложить оставить сообщение еще раз. Только в этом случае нужно не забыть подставить в уже заполненные поля набитую юзером ранее инфу, а то от осознания того, что "ошибочка вышла" и того, что "многочасовой труд" придется писать заново, озлобит юзера, и он отправится восвояси искать другого пристанища для своей души, которое более user-friendly =)

P.S. В аттаче архив со скриптами и картинками (3.27kB). Если есть желание - можно потестить. Буду признателен!

   
 
 автор: Trianon   (24.11.2006 в 09:45)   письмо автору
 
   для: Гончий пёс   (24.11.2006 в 05:22)
 

У Вас-то он работает?
Какой смысл в том, чтоб в один документ внавал сбрасывать десяток gif-файлов?

   
 
 автор: Loki   (24.11.2006 в 09:57)   письмо автору
 
   для: Гончий пёс   (24.11.2006 в 05:22)
 

Есть еще одна тонкость: так как картинки статичные, то роботу даже не надо их пытаться распознавать - достаточно один раз получить хеш картинки и прописать для него значение. Ну и кроме того, данный вариант не имеет смысла применять для свободно распространяемых движков. Так как зная алгоритм, можно легко вычислять значения.
Но пока это в единственном экземпляре - будет работать:)

   
 
 автор: Гончий пёс   (24.11.2006 в 16:13)   письмо автору
 
   для: Loki   (24.11.2006 в 09:57)
 

2Loki: Я ж как раз это и предусмотрел - ежедневно хеш "устаревает"

2Trianon: Дико извиняюсь, но не понял комментария...

   
 
 автор: Loki   (24.11.2006 в 16:32)   письмо автору
 
   для: Гончий пёс   (24.11.2006 в 16:13)
 

так гет-хеш и не нужен: достаточно получить хеш самой картинки

   
 
 автор: Trianon   (24.11.2006 в 17:29)   письмо автору
 
   для: Гончий пёс   (24.11.2006 в 16:13)
 

Ваш скрипт, насколько я заметил, в цикле читает gif-ы, файл за файлом, и выкидывает их содержимое в поток браузеру. Таким способом мало что можно достичь.
Вот я и поинтересовался, заработал ли скрипт на Вашей собственной машине.

   
 
 автор: Loki   (24.11.2006 в 18:07)   письмо автору
 
   для: Trianon   (24.11.2006 в 17:29)
 

не в поток, а запрашивается пять раз из разных мест.

   
 
 автор: Trianon   (24.11.2006 в 18:16)   письмо автору
 
   для: Loki   (24.11.2006 в 18:07)
 

до меня дошло наконец...
логика аховая....

   
 
 автор: Гончий пёс   (25.11.2006 в 01:59)   письмо автору
 
   для: Trianon   (24.11.2006 в 18:16)
 

Скрипт работает - иначе бы не выкладывал. Простите, но по-моему выложить непровереный (неотлаженый еще так-сяк, но тоже не фонтан) скрипт как-то не есть хорошо.

Стояла задача - защита от автопостинга, но без GD.
Ответ готов - он перед Вами.

Скрипт работает - работает.
Строчек кода не более 50 - тяжолевесным скрипт назвать язык не поворачивается.
Время генерации пляшет вокруг 0.0001 сек (Pentium4 2.6GHz, 512Mb - Dual mode, приоритет Apache.exe - средний, общее число служб и программ - 54) - систему грузит минимально.
Если даже хеш будет проанализирован ботом (или автором) и сопоставлен - "завтра" он устареет и будет непригоден; писать дополнение для ежеразного обновления таблицы "хеш - цифра", ИМХО, хлопотно, ибо под все системы так или иначе не настроишься, и проще банально забить.
Задача решена? По моему скромному мнению, решена.
Очевидных недостатков я не нашел, а мне на нах никто не указал.

Теперь на тему логики.
Возможно, мне не хватает профессионализма, но если исходить из поставленной задачи (топикстартер просил: типа "введите текст на картинке"), то других решений я не нашел. Искал.

Если просто рандомно (самый первый вариант скрипта) выводить рисунки <img>`ом, то они рано или поздно будут проанализированы, тепм паче, что имена совпадают с значением.

Если взять и присвоить картинкам просто-напросто "сложные имена", и выводить их <img>`ом, то они рано или поздно будут проанализированы.

Если открывать+читать связкой fopen+fpassthru статически заданное число раз - первая картинка выводится, остальные - нет. (однако, в Опере 7.23, которая не хотит автоматически определять Content-type в отличие от MSIE 6, в исходном коде присутствуют остальные прочитанные картинки).

Если открывать+читать связкой fopen+fpassthru в цикле, то кроме первой вообще ничего не выводится даже в исходном коде страницы(Та же Опера 7.23); безусловно fclose тоже использовался, ибо нефиг.

Если явно отправлять header("Content-type: image/gif"), то текст после картинок не выводится.

Значит надо вызывать артинки рандомно, но со сложными именами, но не обращаясь к файлу непосредственно. =>

Если обращаться к другому скрипту который выводит картинки в зависимости от параметра переданного ему, то он то как раз и может поочередно выводить картинки в поток, ибо он "рождается и умирает" (простите мне такую вольность в определениях) четыре раза, а значит не возникнет коллизий, описанных двумя и тремя пунктами выше, ибо выводятся картинки в рамках <img>`а

Если передавать скрипту данные POST`ом, то на работу с сокетами уйдет еще несколько строк и это замедлит работу, что критично на посещаемом проекте, вывод - GET.

Сессионная перемнная хешируется тоже не просто так. С недавних пор, вошло в привычку, хешировать все данные, которые даже админу ресурса знать необязательно. В конце концов, где гарантия, что потенциальный злоумышленник (абстрактный, совсем не обязательно, что это будет ботмейкер) не может получить доступ к /tmp. Но этот вопрос в меньшей степени относится к защите от автопостинга.


В паспорте написано, что пол мужской. Окружающими явных перегибов в мышлении замечено не было, если не считать общемужской проблемы с индукцией (вывод от частного к общему). По-моему, алогизмы отсутствуют. Возможно, что существует другой путь решения задачи.

Уважаемый Trianon, если Вам не сложно, то я был бы рад услышать критику в равернутом виде.

   
 
 автор: Loki   (25.11.2006 в 12:12)   письмо автору
 
   для: Гончий пёс   (25.11.2006 в 01:59)
 

> "завтра" он устареет и будет непригоден;
вы уж не обижайтесь, но вы мне напоминаете птицу глухарь, которая прозвана так потому, что когда поет сама, слышать ничего вокруг не желает. Видимо, придется все-таки выкроить время и написать бота обходящего ваш скрипт... Думаю, строчек в 20 я уложусь.

   
 
 автор: Гончий пёс   (25.11.2006 в 15:54)   письмо автору
 
   для: Loki   (25.11.2006 в 12:12)
 

>вы уж не обижайтесь, но вы мне напоминаете птицу глухарь, которая прозвана так потому, что когда поет сама, слышать ничего вокруг не желает. Видимо, придется все-таки выкроить время и написать бота обходящего ваш скрипт... Думаю, строчек в 20 я уложусь.

Loki, насчет глухаря Вы безусловно правы, мне даже жена говорит, что я кроме себя никого слушать не хочу...=)
Тем не менее, бессмысленно не прислушиваться к советам старших. Вашим советам внял, сейчас перепишу кое-что...

   
 
 автор: skazi   (25.11.2006 в 16:08)   письмо автору
 
   для: Гончий пёс   (25.11.2006 в 15:54)
 

Гончий пёс, ваш скрипт очень хорош...

   
 
 автор: Loki   (25.11.2006 в 22:44)   письмо автору
 
   для: Гончий пёс   (25.11.2006 в 15:54)
 

Таки вы невнимательно прочли что я вам написал... Что ж, как и обещал: бот в 20 строчек:

<?php     
$url
="http://tested.l/index.php";
$pict_place="http://tested.l/"// расположение файла picture.php
// хеши цифр
$nums=array('d0b445365297972cde173231fbde4c8f'=>0,'31ba3c6860e6704e44ea3e8d1f80d2ba'=>1,
            
'0511260125fa35fc2781d78234c266e5'=>2,'31430aebff862df2963c95916ded2c3a'=>3,
            
'1ddc4bc052baf5ce313c2c162e4e338f'=>4,'74d090f9fa9455358e12f43f7e4b1e35'=>5,
            
'92dfdef04645c357608d9661a4297f8f'=>6,'2e75b3226096cb777d0da1db85b059ed'=>7,
            
'eeed011204389e08a28d09b5bba62fcc'=>8,'74ffdcf5d4f429a2ff2d6b1fd3c172c7'=>9);
$page=file_get_contents($url); 
preg_match_all('/picture.php\?p=[^\']+/',    $page$digits);
echo 
'это ваша рисунок:  '
foreach (
$digits[0] as $pict) echo "<img src='".$pict_place.$pict."'>";
echo 
'<br/>-------------------------<br/>';
echo 
'А это ваш секретный код: '
foreach (
$digits[0] as $file)
{
  echo 
$nums[md5_file($pict_place.$file)];

?>

Работает с любым количеством цифр, любым днем года и со второй модификацией защитного скрипта тоже должен работать (если вы ее отладите наконец:)

   
 
 автор: Trianon   (25.11.2006 в 22:06)   письмо автору
 
   для: Гончий пёс   (25.11.2006 в 01:59)
 

Прошу прощения. Я не имел в виду Вашу собственную логику. Я говорил о логике реализации алгоритма.
Не заостряя внимания на смысле, Я бы Ваш фрагмент

$k = 0; 
    while ($k <= 10) 
        { 
        $k_hash = md5(md5($k.$k).$date);//Самый сложний в мире алгоритм хеширования 
            if ($k_hash === $p) 
                { 
                $file = fopen("$k.gif", "rb"); 
                fpassthru($file); 
                fclose($file); 
                break; 
                } 
        $k++; 
        } 


написал так:

for($k = 0; $k <=10; $k++) 
    $list[md5(md5($k.$k).$date)] = "$k.gif";
@fpassthru(fopen($list[$p], 'rb'));

   
 
 автор: гость 007   (25.11.2006 в 12:34)
 
   для: mrklon   (21.11.2006 в 20:51)
 

самый лучший способ защиты от автопостинга - это комбинация способов)) + немного инициативы...
а ещё можно ограничить пользователя (робота)... например нельзя делать больше 5 постов в минуту. или в две минуты... каму как угодно, и в зависимости от того, что это за приложение.

   
 
 автор: Гончий пёс   (25.11.2006 в 16:22)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Спасибо всем за критику и за идею. "Светить" хеш - несколько опасно (тем более, что мне уже пригрозили изготовлением бота=))

Система полностью переработана. В аттаче все три файла и картинки.
Файл первый: index.php

<?php
$display 
4#количество картинок выводимых на экран
for ($i 1$i <= $display$i++)
    {
    echo 
'<img src="picture.php?p='.$i.'">';
    }
?>
<form action="handler.php" method="post">
<input type="text" size=4 name="secure"><br>
<input type="submit" value="Отправить"><br>
</form>


Файл второй: picture.php

<?php
session_start
();
$quantity 10;//Общее число картинок в каталоге
$quantity--;
$number rand(0$quantity);
if (empty(
$_SESSION['secure']))
    {
    
$_SESSION['secure'] = $number;
    }
    else
    {
    
$_SESSION['secure'] .= $number;
    }
$picture fopen ("$number.gif""rb");
fpassthru($picture);
fclose($picture);
?>

Файл третий: handler.php

<?php
session_start
();
if (isset(
$_POST['secure']))
{
if (
$_POST['secure'] == $_SESSION['secure']) 
    {
    echo 
"Правильно!<br>" ;
    }
    else
    {
    echo 
"Неправильно!<br>";
    }
}
$_SESSION = array();
include 
"index.php";
?>

   
 
 автор: deman-b   (25.11.2006 в 19:53)   письмо автору
 
   для: Гончий пёс   (25.11.2006 в 16:22)
 

вообще вещ интересная) но маленька касячит(
т.е. бывает всё верно ввожу, но пишит "неправильно!"...
наверное это из за того, что одновременно запускаются 4 файла picture.php
и в одно и тоже время обращаются к одному и тому же файлу gif (в некоторых из них совпали значения rand(); )

....скрипт уязвим если не бросать в каталог с рисунками .htaccess с содержимым deny from all
хотя ... даже с ним всё равно не надёжно... рисунки то статичны(
и их всего 10
достаточно один раз вмешатся человеку...
и дальше он напишет робота ..... минутное дело

например :

злоумышленник зайдёт на страницу index.php потыкает на кнопку... сохранит все рисунки)
в таком ж е виде, ну.. 1 ...2...3... и.т.д.
тока не в виде файлов, а в виде массива .. т.е. $arr[1] = тело рисунка1; и т.д.
затем использует их при написании робота...
т.е. робот будет знать что рисунок с таким то наполнением соответствует номеру такому то...
и дальше дело несложное... подмена сессии и ещё немного муры фсякой)

   
 
 автор: deman-b   (25.11.2006 в 20:01)   письмо автору
 
   для: deman-b   (25.11.2006 в 19:53)
 

хотя нет... я понял в чем касяк.... что бы всё стабильно работало...
браузер должен загружать эти картинки в сторгой последовательности...
но он почему то так не делает))
особенно если выключены рисунки... эт оваще ПЦЦ)))
нужно будет в опр. послед. нажимать на них что бы они загрузились... и не дай боже два раза нажать на один, или лишний раз подгрузить...)))
вообще белеберда получается какаято)))

   
 
 автор: deman-b   (25.11.2006 в 20:06)   письмо автору
 
   для: deman-b   (25.11.2006 в 20:01)
 

помоему гораздо проще сделать при помощи GD )))

   
 
 автор: Гончий пёс   (25.11.2006 в 20:44)   письмо автору
 
   для: deman-b   (25.11.2006 в 20:01)
 

Действительно так.
Для отладки вызвал сессионную и пост переменную в третьем скрипте - цифры правильные, но они хаотично и непериодично меняются местами.

>особенно если выключены рисунки... эт оваще ПЦЦ)))
>нужно будет в опр. послед. нажимать на них что бы они загрузились... и не дай боже два раза >нажать на один, или лишний раз подгрузить...)))
>вообще белеберда получается какаято)))

значит механизм генерации рандомного числа нужно оставить в первом скрипте! Тханькс!=)

   
 
 автор: Гончий пёс   (25.11.2006 в 22:48)   письмо автору
 
   для: deman-b   (25.11.2006 в 20:01)
 

Ну всё... Давно я так не парился...=) Короче так, браузер может грузить картинки как ему вздумается. Единственная переменная, передаваемая picture.php - 'p', которая говорит, какая это картинка по порядку. Сам же picture.php сверяет p с переданным ему сессионным параметром, в котором также указан порядковый номер, если значения равны - выводим многострадальную картинку. Кстати, без 'p' не обойтись, иначе браузер кеширует картинку и все четыре штуки будут одинаковыми, но на самом деле то это не так!=) использование нескольких сессионных переменных кому-то может показаться несколько притянутым за уши, но мне видится такое решение...
От слов к делу. В аттаче многострадальный скрипт с картинками.

index.php

<?php
@session_start();
$quantity 10;
$quantity--;
$display 4;
$_SESSION['secure'] = "";
$_SESSION['n'] = "";
$_SESSION['p'] = array();
for (
$p=1$p <= $display$p++)
    {
    
$number rand(0$quantity);
    
$_SESSION['secure'] .= $number;
    
$_SESSION['p'][$p] = $number;
    
$_SESSION['n'][$p] = $p;
    echo 
'<img src="picture.php?p='.$p.'">';
    }
?>
<form action="handler.php" method="post"> 
<input type="text" name="secure" size="3" maxlength="4"><br> 
<input type="submit" value="Отправить"><br> 
</form>


picture.php

<?php
session_start
();
$p $_GET['p'];
$pict $_SESSION['p'][$p];
$number $_SESSION['n'][$p];
if (
$number == $p)
    {
    
$picture fopen("$pict.gif""rb"); 
    
fpassthru($picture);
    
fclose($picture);
    }
?>


handler.php

<?php 
session_start
(); 
if (isset(
$_POST['secure'])) 
    { 
    if (
$_POST['secure'] == $_SESSION['secure'])  
        { 
        echo 
"Правильно!<br>" 
        } 
        else 
        { 
           echo 
"Неправильно!<br>"
        } 
    } 
include 
"index.php"
?>

   
 
 автор: deman-b   (25.11.2006 в 23:07)   письмо автору
 
   для: Гончий пёс   (25.11.2006 в 22:48)
 

я так понимаю ещё одну сессионную переменую вы прекрутили для того чтобы браузер оламывался с кешированием?

   
 
 автор: deman-b   (25.11.2006 в 23:34)   письмо автору
 
   для: Гончий пёс   (25.11.2006 в 22:48)
 

вроде работает стабильно! но некоторые рисунки долго пдгружаются .. аж по 10 сек
надо проверять на баги и пробовать и зо всех сил написать бота, который смог бы обойти эту защиту..
как только в голову перестанут приходить идеи (по взлому), то можно считать что продукт готов и можно приступть к серийному выпуску!))
а чо?!! немного тюнингу навести (рисункам), хтатсес кинуть им...

ну а сейчас у мня в голове есть идея коя какая), но спать уже надо! пока снова режим не сбил (в новосибе пол 3 ночи) ....
завтра попробую реализовать эту иНдейку))

и ещё раз, на последок повторюсь:
>злоумышленник зайдёт на страницу index.php потыкает на кнопку... сохранит все рисунки)
>в таком ж е виде, ну.. 1 ...2...3... и.т.д.
>тока не в виде файлов, а в виде массива .. т.е. $arr[1] = тело рисунка1; и т.д.
>затем использует их при написании робота...
>т.е. робот будет знать что рисунок с таким то наполнением соответствует номеру такому то...

вся проблема в том что рисунки с одинаковыми числами - одинаковы...
вот если бы ещё при выводе рисунка можно было бы его так подредактировать, что внешне не изменится, но внутри.......... (и причом при последующем выводе рисунка его содержимое не совпадало бы с исходным ) т.е. дописывать в рисунок в случайном режиме, чтонибудь, что не влияло бы на его отображение, но влияло на содержание, размер, и т.п.

но без использования GD!))) в этом весь цинус!))

хотя опять же незначительное изменение от исходника тоже не защита(
робот может использовать similar_text() и определять по схожести(

   
 
 автор: mrklon   (25.11.2006 в 21:09)   письмо автору
 
   для: deman-b   (25.11.2006 в 19:53)
 

Спасибо за кучу инфы - буду писать.
Еще один вопрос: насколько сложно подсмотреть и поменять сессию роботу.

Во всех примерах я вижу такое (не только сдесь):

От правляем из index.php в add_msg.php:
get-ом - хпароль
Сессией - хэш пароля

Потом в add_msg.php
Проверяем равенство сесии и GET-а. Так?

Ну, а че бы не подменить сессию хешом таким, каким нравиться (сгенерированнымпо GET-у самому)

Короче, что я хотел спросить: есть лм в ПХП встроенное шифрование? Чтоб можно было сессию ЗАШИФРОВАТЬ!.

   
 
 автор: deman-b   (25.11.2006 в 21:30)   письмо автору
 
   для: mrklon   (25.11.2006 в 21:09)
 

http://softtime.ru/forum/read.php?id_forum=1&id_theme=9050 - про подделку сессий...

>Короче, что я хотел спросить: есть лм в ПХП встроенное шифрование? Чтоб можно было >сессию ЗАШИФРОВАТЬ!.

<?php
session_start
();
$sid session_id();
$hsid md5($sid);
?>

так что ли?
или что бы потом можно было расшифровать?
если да то нужна какя нибудь другая - выбор большой)

   
 
 автор: mrklon   (25.11.2006 в 21:48)   письмо автору
 
   для: deman-b   (25.11.2006 в 21:30)
 

А втроенных нет? Или их нужно устанавливать, как GDlib (пропиской в php.ini и т.д.)?

   
 
 автор: deman-b   (25.11.2006 в 22:27)   письмо автору
 
   для: mrklon   (25.11.2006 в 21:48)
 

как это устанавливать? 0_о
это функции ... такие же как например strlen()...
не ... конечно ты можш написать свой алгоритм шифрования , зафигачить его в класс, и подключать потом этот модуль куда угодно)

   
 
 автор: Гончий пёс   (25.11.2006 в 22:13)   письмо автору
 
   для: mrklon   (25.11.2006 в 21:09)
 

>От правляем из index.php в add_msg.php:
>get-ом - хпароль
>Сессией - хэш пароля
>
>Потом в add_msg.php
>Проверяем равенство сесии и GET-а. Так?

Пароль через GET не отправляют!!!

   
 
 автор: deman-b   (25.11.2006 в 22:39)   письмо автору
 
   для: Гончий пёс   (25.11.2006 в 22:13)
 

:о) ну это каму как нравится))
может человек гостевуху пишит)
.. хотя, зачем там пароли?))

   
 
 автор: deman-b   (25.11.2006 в 22:44)   письмо автору
 
   для: deman-b   (25.11.2006 в 22:39)
 

а.... нет! под словом пароль он имел ввиду кодовое число.
так я понимаю?

   
 
 автор: mrklon   (25.11.2006 в 23:00)   письмо автору
 
   для: deman-b   (25.11.2006 в 22:44)
 

Именно! В сессию закладывают кодовое число на картинке(надо же с чем то сравнивать)
А в GET - то, что ввел пользователь. Потом сравнивают.

Теоритечески, робот может взять число "8", запихать его в GET, а хеш "8" запихать в подделаную сессию. И все сойдеться. Вот что я хотел сказать...

Наверное имеет смысл пойти и почитать что-нить по криптографии :)

   
 
 автор: deman-b   (26.11.2006 в 14:25)   письмо автору
 
   для: mrklon   (25.11.2006 в 23:00)
 

тебе стоит почитать теории)
сессионная кука - это такая штука , которая хранится на сервере!
а сессионный идентификатор посылается пользователю..
по этому идентификатору сервак определяет где кука этого пользователя....
так что бот максимум что может изменить (что ему дано) - это идентификатор сесси, а это ему и не надо))
подделка сессий заключается в том что:
бот - не браузер..
ему нужно эмулировать браузер..
т.е. он(бот) выполняет ту работу , которую выполняет браузер
а если сессией прошита форма..., то ему и ето нужно эмулить)

   
 
 автор: Loki   (26.11.2006 в 15:23)   письмо автору
 
   для: deman-b   (26.11.2006 в 14:25)
 

>тебе стоит почитать теории)
>сессионная кука - это такая штука , которая хранится на сервере!
Вам бы тоже что-нибудь почитать не мешало...

   
 
 автор: deman-b   (26.11.2006 в 15:55)   письмо автору
 
   для: Loki   (26.11.2006 в 15:23)
 

это в каком смысле?..
у меня и так все полки забиты всякими книгами, справочниками...
на столе только шт.5 -10 ...
или вы про грамотические ошибки?)....

   
 
 автор: Loki   (26.11.2006 в 16:12)   письмо автору
 
   для: deman-b   (26.11.2006 в 15:55)
 

сессионная кука хранится у клиента, а на сервере - сессионные переменные.

   
 
 автор: deman-b   (26.11.2006 в 18:47)   письмо автору
 
   для: Loki   (26.11.2006 в 16:12)
 

я это и имел ввиду!
Идентификатор который хранится у пользователя - session_id();
Сама кука с её переменными хранится на сервере - $_SESSION['cookie'] = "value";

   
 
 автор: Loki   (26.11.2006 в 22:30)   письмо автору
 
   для: deman-b   (26.11.2006 в 18:47)
 

Куки создает броузер. Он при всем желании не сможет ее создать ее на сервере. Так что прислушайтесь к моему совету выше. Наверняка вы понимаете о чем говорите, но в вашей терминологии получается полный бред.

   
 
 автор: mrklon   (26.11.2006 в 16:36)   письмо автору
 
   для: deman-b   (26.11.2006 в 15:55)
 

Вот что я написал за ночь. Не бейти сильно, я только учусь, могу сделать элементарные асипки.

rab.php - форма ввода


<?php

session_start
();

##########################################
$ip_block=60;//время запрета
$ip $_SERVER['REMOTE_ADDR'];//ip пользователя
$s_time time();// серверное время
$ip_zapret 0;//запрет на запись
##########################################

################################################################################
### Проверка на давность ип по времени #########################################
################################################################################

$ip_open fopen("add.ip","r");
flock($ip_open,1);//защита чтения


    
while(!feof($ip_open/*and filesize($ip_open)*/)
    {
    
$ip_fgets fgets($ip_open);
    list(
$ip_ip,$ip_time)=explode("|",$ip_fgets);

        if(
$ip_ip==$ip and $s_time<($ip_time+$ip_block) )
        {
        
$ip_zapret 1;
        echo 
"<hr>ПОДОЖДИТЕ некоторое время!<hr>";
        break;
        
//Запрещаем писать
        
}
        else
        {
        
$ip_zapret 0;
        
//Разрешаем писать
        
}

    }


flock($ip_open,3);//снимаем защиту
fclose($ip_open);




################################################################################
### Пишем защиту от двойного клика #############################################
################################################################################


if($ip_zapret==0)
    {
    
$_SESSION['flag'] = "on";

################################################################################
### Пишем формы ################################################################
################################################################################

    
echo"<form method=\"get\" action=\"msg.php\">";

    echo
"Имя:<br> <input type=\"text\" name=\"nik\"><br>";
    echo
"Майл:<br> <input type=\"text\" name=\"mail\"><br>";
    echo
"ВЕБ: <br><input type=\"text\" name=\"web\"><br>";
    echo
"ТЕКСТ: <br><textarea name=\"msg\" COLS=64 ROWS=6><br>";

    echo
"<input type=\"submit\"><br><br></form>";
    }

?>


msg.php -обработчик форм


<?php
session_start
();

##########################################
$ip_block=60;//время запрета
$ip $_SERVER['REMOTE_ADDR'];//ip пользователя
$s_time time();// серверное время
##########################################


if(isset($_SESSION['flag']))
    {
    unset (
$_SESSION['flag']);
    
OBNOVLENIE_ADDIP($ip_block,$s_time,$ip);
    
#####################################
    ## Обрабатываем формы и пишем инфу #
    ###################################
    
echo "<hr>VSE OK<HR>";
    }
    else
    {
    echo 
"Нехорошо использовать двойной клик!";
    }





function 
OBNOVLENIE_ADDIP($ip_block,$s_time,$ip)
//Вычищаем из add.ip устаревшие записи
{
$prov_open=fopen("add.ip","r");
flock($prov_open,1);

    for(
$i=0; !feof($prov_open) ;$i++)
    {
    
$prov_fgets=fgets($prov_open);
    list(
$ip_ip[$i],$ip_time[$i])=explode("|",$prov_fgets);

        if( 
$s_time > ($ip_time[$i]+$ip_block) )//вынрызаем старые записи
        
{
           unset(
$ip_ip[$i],$ip_time[$i]);//удаляем старье
          
$i--;
        }
    }


flock($prov_open,3);
fclose($prov_open);

######## запись чистых ip ##############

$prov_open=fopen("add.ip","w");
flock($prov_open,2);

    for(
$y=0;    $i>$y    ;$y++)
    {
    
fputs($prov_open,$ip_ip[$y]."|".$ip_time[$y]);
    }
    
fputs($prov_open,$ip."|".$s_time);//запись ip пользователя

flock($prov_open,3);
fclose($prov_open);
}

?>


Что я сделал:
-Сессиями отрубил возможность отправки сообщения несколько раз, через двойной клик
-Записываю IP пользователей и ставлю порог 60 сек. Чтоб не писали множество раз.

Как вам такая защита?

На подходе скрипт защиты картинками (без GDlib). Только незнаю как убивать временные файлы, если юзвер будет баловаться рефрешами. Тож наверное через сессии...

   
 
 автор: XPraptor   (27.11.2006 в 00:22)   письмо автору
 
   для: mrklon   (26.11.2006 в 16:36)
 

Ты прикололся браток :)
Тут тебе с начала ветки толкуют ,что бот приходит с разных IP по проксям, не использует сессию если она не нужна. Иди учи матчасть.

Мой бот умеет обходить любую защиту сессионную, кукную, подтверждение по e-mail, картинки (настроенные на распознование).
Единственное что он не может, это распознать специально деформированные картинки. Алгоритмы деформации изображения и алгоритмы распознования деформированных изображений постоянно соперничают. Но соответственно, деформаторы всегда на время опережают распозновальшиков, поэтому некоторые картинки временно не могут быть обработаны существующими алгоритмами.

Все остальное - бот имеет как хочет и ни что вас не защитит.

   
 
 автор: deman-b   (27.11.2006 в 00:34)   письмо автору
 
   для: XPraptor   (27.11.2006 в 00:22)
 

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

   
 
 автор: XPraptor   (27.11.2006 в 00:37)   письмо автору
 
   для: deman-b   (27.11.2006 в 00:34)
 

Это точно. Какой тугодум будет добавлять в своего бота никому не нужный сайт, только трафик и время жрать при рассылке.

   
 
 автор: Гончий пёс   (27.11.2006 в 00:52)   письмо автору
 
   для: mrklon   (26.11.2006 в 16:36)
 

Так-с... как вариант, можно было бы порекомендовать вставить в index.php проверку на наличие файла add.ip, если не существует, то создать, и записать в него 0.0.0.1|0000000001, ибо list($ip_ip,$ip_time)=explode("|",$ip_fgets) (23 строчка в index.php и почти такая же в 38 строчке msg.php) посылает в баню. Однако имеются противопоказания к использованию данного метода.

<?php
###Вот так делать не надо!
if (!file_exists("add.ip"))//проверка на существование
{
$ip_open fopen("add.ip","w");
//далее пишем  в файл какие-то тестовые значения...
}
else
{
$ip_open fopen("add.ip","r");

}
?>

Данный вариант НЕ РЕКОМЕНДУЕТСЯ!!! Почему? Сначала мы проверим файл на существование, узнаем, что его нет и создадим новый пустой или очистим существующий (в соответствии со спецификацией режима). А вот тут-то как раз и возникает коллизия. Есть ненулевая вероятность, что другой процесс вклинится и что-то запишет в файл, а мы это вжик и очистим...

В связи с чем, предлагается, предварить вышеуказанные функции оператором "@", а вместо режима "r" в спорных случаях использовать режим "a+". Вот такие вот поправочки приходят на ум, если бегло просмотреть скрипт.

Ну я так понимаю, в скрипте реализована только система защиты от автопостинга?

   
 
 автор: cheops   (27.11.2006 в 13:56)   письмо автору
 
   для: mrklon   (21.11.2006 в 20:51)
 

Дальнейшее обсуждение в теме http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=28398.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования