Антиспамерка, не пойму как обходят.

p@R@doX

Новичок
Антиспамерка, не пойму как обходят.

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

Вкратце схема такова:

В форме вывожу:
PHP:
<?$_SESSION['chislo']=RAND(1000,9999);?>
<img src="image.php"> //Картинка выводит число из сессии .
<input type="text" size="3" name="proverka">
Далее, если форма была просабмичена.
PHP:
if (($_SESSION['chislo']<>$_POST['proverka']) and (!empty($_SESSION['chislo']))) {?>
//В сад
} else {
//добавляем сообщение
}
В процессе проверки стал сохранять все поля, и что удивило:
- в поле проверки вводится произвольное значение
- поле сессии пустое

Есть идеи?
Подскажи в какую сторону копать...
 

SiMM

Новичок
> if (($_SESSION['chislo']<>$_POST['proverka']) and (!empty($_SESSION['chislo']))) {?>
Совсем запутали. Что мешает делать запрос без SID'а?
 

Zetruger

ivan.chistyakov.name
p@R@doX
если
<?$_SESSION['chislo']=RAND(1000,9999);?>
<img src="image.php"> //Картинка выводит число из сессии .
<input type="text" size="3" name="proverka">

и
if (($_SESSION['chislo']<>$_POST['proverka']) and (!empty($_SESSION['chislo']))) {?>
//В сад
} else {
//добавляем сообщение
}

один файл
то это не работающий бред!
ибо нельзя сначала генерить число, а потом сравнивать его с ПОСТ
это похоже на игру угадай число в диапазоне 1000,9999
 

SiMM

Новичок
Zetruger, написано же
> если форма была просабмичена
так что один файл, или нет - роли не играет.
 

Popoff

popoff.donetsk.ua
Zetruger
if (empty($_SESSION['chislo'])||empty($_POST['proverka'])||$_POST['proverka']!==$_SESSION['chislo']) {
//В сад


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

-~{}~ 24.09.07 08:46:

использовать !==, если буквы и более слабый допускающий несовпадение типов !=, если цифры, сгенерированные rand.
 

Zetruger

ivan.chistyakov.name
SiMM
есть
если файла 2 а число генериться только в первом, то это уже на защита, а так пародия =)
 

Фанат

oncle terrible
Команда форума
Zetruger
не мог бы ты пояснить эту глубокую мысль?
 

cDLEON

Онанист РНРСlub
Popoff
Не совсем понятно зачем использывать !== для букв.
буквы могут иметь не только тип string ? )
 

SiMM

Новичок
> Поменяй AND на ||.
Только это не только спам поубавит :)
PHP:
if (($_SESSION['chislo']==$_POST['proverka']) and (!empty($_SESSION['chislo']))) {
  // ок
} else {
  // в сад
}
?>
А в том, что было - мне ничто не мешало сделать запрос без SID'а, соответственно, с пустым $_SESSION['chislo']
 

HraKK

Мудак
Команда форума
SiMM
А я о чем.

-~{}~ 24.09.07 10:11:

в чем разница
if (($_SESSION['chislo']!==$_POST['proverka']) OR (!empty($_SESSION['chislo'])))
от твоего?
 

SiMM

Новичок
В том, что если $_SESSION['chislo'] не empty, то значение $_POST['proverka'] не имеет значения, следовательно любой честный пользователь пойдёт лесом :)
PHP:
if (($_SESSION['chislo']!==$_POST['proverka']) OR (empty($_SESSION['chislo']))) в сад
ещё проканало бы :)
 

Zetruger

ivan.chistyakov.name
*****
не мог бы ты пояснить эту глубокую мысль?
серьезно?
оч хочется ответить вам в вашем же стиле
что-нить вроде
"да кому ты сдался - переубеждать тебя? щас все брошу и начну на коленях уговаривать"



форма и генерирование числа в файле 1.php
скрипт проверки и добавления данных в файле 2.php
таким образом, чтобы обойти проверку достаточно сохранить форму на диск, убрать из нее картинку и отсылать данные сколь угодно раз
 

Фанат

oncle terrible
Команда форума
Zetruger
Я даже и не знаю, что тебе сказать.
Оставим в стороне "картинки в формах" и "сохранение на диск"
Спрошу, пожалуй, не по мелочам, а самое глобальное.
Скажи, ты действительно веришь в то, что количество скриптов хоть как-то влияет на работоспособность приложения? Что между скриптом, который вызывается два раза и двумя скриптами по одному есть хоть какая-то разница?
 

Zetruger

ivan.chistyakov.name
*****
я лишь привел конкретный пример при котором можно обойти защиту от спама
из сообщения автора не до конца ясно как у него она организованна

а строить зависимости между количеством страниц и ошибками я на собираюсь
 

cDLEON

Онанист РНРСlub
Zetruger
http://phplang.info - ни пайду сюда )
Хочешь я тебе сделаю тестовый пример, в котором генерация случайного значения и проверка будет в одном файле.
А вывод картинки в другом. При чём без особых извращений, не напрягаясь, в несколько строк...
А ты мне попытаешься её обойти? )
 

YasonDelAlt

Новичок
p@R@doX, отвечу коротко и по существу. У тебя ошибка в условии: Если (chislo не равно proverka) и chislo НЕ пустое то идем в сад, иначе куда надо. То есть если chislo будет пустым (сессия не была открыта, число не сгенерированно), то в независимости от значения proverka сообщение создастся. Грамотнее будет сделать условие так, как показал несколькими постами выше SiMM: if (($_SESSION['chislo']!==$_POST['proverka']) OR (empty($_SESSION['chislo']))) в сад else создаем сообщение.
 
Сверху