коротчайшие сесси - ошибочка В процессе создания своего очередного проекта (ради практики) возникла такая идея.. сейчас попробую вам объяснить и показать примером... например, существует такой инструмент, пусть будет для отправки сообщения. Ради простоты будет только поле ввода и кнопка отправки. index.php HTML: <form method="GET" action="mes.php"> <input type="text" name="message"'> <br> <input type="submit" value="Отправить"> </form> данные идут сюда mes.php PHP: $d = @$_GET['message']; $bd = new Bd('comments'); /* вымышленный класс для работы с бд*/ $db->insert($d); Очень просто .. так же и для понимания. Но ведь фишка всей темы в том, чтобы не сделали вот типа такого http://site.com/mes.php?message=123 и не автоматизировали это. После нескольких минут раздумий думал, что можно защитить этот файл , сделав 1. передачу по POST (это самое очевидное) 2. Защитить работу mes.php какими-то переменными, передающимися в QUERY, например ; 2.1 хеш ИПа 2.2 время (например, с помощью JS добавить туда секунды и сделать проверку на конечном скрипте, с погрешностями) 2.3 ???? еще не придумал 3. Добавить какую-нибудь информацию в кукис (эту же, вероятно ) 4. получается, что первая страница превращается в такую. index.php Code: [COLOR=YellowGreen]<?php $ip=md5($_SERVER['REMOTE_ADDR']); ?>[/COLOR] [COLOR=DarkOrange]<script>function c(){ var t = (new String((new Date).getSeconds())) t = t.substring(t.length-1) document.forms[0].time.value = t document.cookie = 'g=[COLOR=YellowGreen]<?php echo $ip; ?>[/COLOR];' return true; }</script>[/COLOR] <form method="POST" action="mes.php" [COLOR=DarkOrange]onsubmit="return c()"[/COLOR]> <input type="hidden" name="time" value=""> <input type="hidden" name="ip" value="[COLOR=YellowGreen]<?php echo $ip; ?>[/COLOR]"> <input type="text" name="message"'> <br> <input type="submit" value="Отправить'> </form> Хочу сразу cказать, что пишу , возможно, нерабочие примеры. Они требуются только для понимания. а теперь он mes.php PHP: function fu(){setcookie("g", md5($t));header("Location: " . $_SERVER['HTTP_HOST'] . "");die("<script>document.location.href = '" . $_SERVER['HTTP_HOST'] . "';</script>");return false;} /* облом , инфа 100%*/ function g_t($num =0){ @date_default_timezone_set("Europe/Moscow");$t = time();$time = @getdate( $t );$time = @$time['seconds'];$int = (int) $time - $num;$time = (strlen($int)>1) ? substr($int, 1, 1):$int;return $time;} /* функция для короткой записи "погрешности" времени - внизу */ $ip = md5($_SERVER['REMOTE_ADDR']); $a = (isset($_POST['ip'])) ? (($_POST['ip']==$ip) ? true:false):false; /* короче, если ипа в строке нету или он не подходит к вашему настоящему - конец*/ $b = (isset($_COOKIE['g'])) ? (($_COOKIE['g']==$ip) ? true:false):false; /* если ипа в кукис нету или он не подходит к вашему настоящему - конец*/ /* время. */ $c = (isset($_POST['time'])) ? $_POST['time']:false; /* кешируем время, потому что так текста меньше :)*/ if (!$c) fu(); else $c=($c==g_t(0)) ? true:(($c==g_t(1)) ? true:(($c==g_t(2)) ? true:false)); /* если нет переданного времени, или оно не равно настоящему или минус 1 секунду или минус 2 секудны - то, оно равно false*/ if (!$a || !$b || !$c) fu(); /* Так как там die(), можно оставить этот код */ $d = @$_POST['message']; $bd = new Bd('comments'); $db->insert($d); говнокод, несомненно, присутствует. ну, знаю всё это с февраля просьба вас, ачатовцев, развить данную идую и пофиксить приведённый выше "код"
melky плохой план. 1) Предположим самый сложный вариант - ваш движок приватен, и никто не догадывается, как вы генерируете кукис (пусть там например сверхдлинная строка добавляется, что даже не побрутишь). Мне ничего не мешает один раз спарсить это значение, и пока IP не сменится могу спамить как хочу. 2) Со временем между запросами все так же ужасно. Пока работаете на локалхосте - все вроде бы хорошо, но с удаленным сервером у меня например рассинхрон, то есть его часы спешат на 2-3 секунды - получается я смогу отправить сообщение только если звезды устроят парад планет. А вот боту ничто не мешает ввести поправку, например. 3) Кстати о боте - даже взяв одну цифру, например 1, он будет пробиваться с сообщением с вероятностью 30%, а это даже больше чем требуется для автоматического распознавателя капчи (без использования сервиса антикапчи). А если учесть, что в течение 3 секунд можно отправить не одно сообщение - вас заспамят
насчет времени у меня такие же сомнения.. а что, если взять не текущее время, а секунды, прошедшие с начала эпохи Unix? там нет уникального значения. и зашифровать md5 или своим алгоритмом - чтобы не смогли прикручивать значения сами. А чтобы не завалили за 3 секунды, можно добавить анти-ДДос скрипт, не позволяющий делать >2 операций в секунду. Ну, для того, чтобы не было удачнух запросов, зависящих от определенной фазы луны, то пожно еще увеличить погрешность до 5 секунд и более. Сейчас там допускается, что данные идут 0 сек, 1 сек , 2 сек. Еще добавить каптчу (это худший вариант). что скажете?
melky сейчас у вас сравниваются последние цифры в секундах, тогда при рассинхроне в 22 секунды, то на скрипт будут влиять только 2. Если же начнете использовать unixtime, то погрешность будет уже полные 22 секунды. Таким образом - для первого случая увеличение промежутка до 5 секунд эквивалентно тому, что вы вообще отключите этот скрипт. А для второго случая - что слону дробина, почему - думаю понятно. Делать md5 от динамических данных с помощью яваскрипта - гиблая затея, можно просто в лоб переписать этот яваскрипт на другой язык и подставлять свои данные, так еще и профайлер в аддоне FireBug может показать какие функции в каком порядке запускались. Я обеими руками "ЗА" жизнеспособную схему защиты от ботов без использования капчи. Но на данном этапе - люди ничего лучше не придумали
ну, я считаю, вы меня не поняли полностью. я вечером набросаю эту функцию полностью и покажу вам на критику. защита задумавалась первоначально не для блокирования ботов, а для накладывания ограничений на использование определенных скриптов, то есть, чтобы этот файл мог использоваться только со стороны сервера и только с этой формы. хм, эдакая антиюзер зона
Что? Серверу не нужна форма, чтобы взаимодействовать самому с собой, возможно вы имели ввиду: http://ru.wikipedia.org/wiki/Referer
melky Что бы файл использовался только с стороны сервера, клиент обязан сидеть за сервером))) Да и проверить что входящие данные "только с этой формы" невозможно, т.к. реферер передаеться клиентом, и его можно подделать.