[Intro] С недавнего времени я начал изучать AJAX библиотеку jQuery.. На мой взгляд это лучшая, удобная и легкая либа для AJAX... Прочитав некоторые статьи, доки по либе я решил сделать так, чтобы пользователям на вашем сайте не пришлось смотреть на закорюченные символы [Start] Имеем форму: PHP: <form method="post" id="xek"> Text: <input type="text" name="text" /><br/> <input type="submit" name="sub" value="Ok" /> </form> Ну тут роботу ничего не стоит как отправлять POST запросы text=ss,sub=Ok на наш скрипт... А если добавить через js некую форму..... В хидере( Между <head> и </head>) страницы напишем следующее: Code: <script src="jquery-1.2.3.pack.js"></script> <script type="text/javascript"> $(document).ready(function() { $.get("md5.php",function(hash) { $("#xek").append('<input type="hidden" name="code" value="'+hash+'" />'); }); }); В этом коде мы делаем GET запрос (сразу при загрузке страницы с формой) к файлу md5.php, получаем оттуда данные и jQuery сам вставляет новый инпат в нашу форму на странице, но исходный код страницы при этом не изменяется.. в md5.php мы можем выводить допустим такое: PHP: <?php echo md5($_SERVER['REMOTE_ADDR']).'xekxek'); ?> Тем самым если робот будет отправять пост запросы через обычную форму, то скрипт его не пропустит, потому что проверить робот это или нет можно след.кодом: PHP: <?php if(!isset($_POST['hash']) || $_POST['hash'] != md5($_SERVER['REMOTE_ADDR']).'xekxek')) echo 'You are not human'; ?> [End] Вы скажите, а что сложного человеку посмотреть JS код, узнать файл md5.php и ботом сначала парсить инфу оттуда? Ну так существует ведь http://ru.wikipedia.org/wiki/Обфускация JS кода с помощью которой вам надо обфуцировать небольшой JS код в хидере.. Спросите вы: А разве сложно его раскодировать? Отвечаю также: А разве сложно его хорошо криптануть??)))
Либо еще лучше подключить мод реврайт и отправлять запросы на что-то типа PHP: <?php $_SERVER['REMOTE_ADDR'].time(); ?> /IP_time.jpg Так уже даже можно название файла не прятать т.к. пока робот зайдет на файл и отправит форму, то значения time() будут разные
Либо вообще в md5.php создавать сессию с указанным выше содержимым и если форма отправляется без сессии, то робот!
ты забыл про безскриптовых людей.. к тому же гораздно проще давать рандомные имена полям формы еще перед генерацией странице, я кстати писал об этом ..
GreenBear, да, тоже вариант, а безскриптовые люди сделать ничего не смогут если допустим сделать еще проверку по IP
неее буду лечше на ранмоде(типа капча) сидеть,по мне эфективнее. и некие мои замороченные проверочки.
Сам факт того что ты юзаешь jQuery, или любую аяксовую либу, говорит о том, что твой сайт заточен под людей с включеным js. (А на людей с выключеным js ты в принципе забил, равно как и на любителей старых или специфических браузеров)
А что мешает выяснить как сервак возвращает этот хеш и научить робота заходить на страницу и снифать его от сервера, а потом дописывать в запрос при отправке? З.Ы. Прошу прощения, что разными сообщениями. З.З.Ы. Лучше вместо запроса яваскриптом ответа с сервера, как тут: Code: <script type="text/javascript"> $(document).ready(function() { $.get("md5.php",function(hash) { $("#xek").append('<input type="hidden" name="code" value="'+hash+'" />'); }); }); Просто тупо зашить ещё на сервере это поле в скрипт и пройтись обфускатором. Тогда если снифать трафф, ты не получишь хеш, а получишь только страницу целиком. Ну и логичный вывод - Тогда, а при чём тут jQuery и аякс, если речь идёт о клиентской генерации элементов страницы яваскриптом ))
кстати генерация рандомных имен полей неэффективна имхо - что мешает боту скачать и отпарсить форму? Да и кодить под этот сабж тоже тот еще гемор. носкрипт и капча ибо этот метод неприменим тогда ты не понял о чем речь.
Да ладно, он предлагает генерить сервером на странице jQuery код, который будет генерить скрытое поле которое будет передавать на сервер хеш, который будет аяксовыми методами спрашиваться у сервера. Фишка в том, что сначала клиенту отдаётся страница с яваскриптом, который этот запрос хеша и сгенерит, затем аяксом запрос "дай мне хеш" уйдёт на сервер, и вот после этого уже можно снифать ответ от сервера. Всё. Если непонятно: 1) Серверу отдаётся страничка с яваскриптом (обработано обфускатором) 2) Яваскрипт на клиенте запрашивает у сервера хеш-код для скрытого поля 3) сервер возвращает хеш-код 4) при запросе, на сервер передаётся этот хеш код 5) они там сравниваются А теперь прикинь, что между 2 и 3 я включил снифер.
Ну а что мешает спереть сессию? Если до отправки формы включили сниффер. Т.е. когда тебе уже пришла страница, но когда на md5.php запрос ещё не ушёл.
Ну или если оч не хочется напрягать юзера, то куда надёжнее генерить хеш ещё до того как отдаёшь страницу юзеру, потом писать его в js ещё на сервере, пройтись обфускатором и отдать клиенту. Тогда и аякс не нужен и проблем с MIM не будет