Есть старый форум, не совместимый с jQuery (долго объяснять). Соотвессна, пользуясь только JavaScript нужно сделать крохотный антиспам. Я его вроде сделал, но почему-то, если в диалоговом окне нажать "отмена", то форма всё-равно отправляется. Где я накосячил? HTML: <form name="register" method="post" action="{S_UCP_ACTION}" onSubmit="return reg_alert();"> [js]function reg_alert() { var m=window.prompt('Вы спам-бот?','Да, я пришёл засрать форум'); m=m.toLowerCase(); var n=false; if (m=='нет') { n=true; } return n; }[/js]
У меня с баттона форма полюбас отправлялась а с инпута - работало как надо. Или наоборот. Я не помню. Так что не факт что в коде косяк.
Freakmeister Спамботы просто отправляют форму. Им плевать на JavaScript. А вообще такой код: HTML: <script type="text/javascript"> function reg_alert() { var m=window.prompt('Вы спам-бот?','Да, я пришёл засрать форум'); m=m.toLowerCase(); var n=false; if (m=='нет') { n=true; } return n; } </script> <form name="register" method="post" action="" onSubmit="return reg_alert();"> <input type="hidden" name="test" value="test" /> <input type="submit" value="send it" /> </form> работает. Ищи косяк где-то ещё. Может пользователи пишут что-то другое? Например: "Нет, я не спам-бот". Или "Я? Нее..."
Не внимательно прочитал вопрос, что не работает именно когда нажимаешь "Отмена". Там не работает из-за того, что если нажать на отмену, то значение переменной m будет равно null (это не строка). Когда ты пытаешься сделать m=m.toLowerCase(); это приводит к ошибке сценария (null - это не строка и у него нет метода toLowerCase()). Выполнение сценария завершается ошибкой, форма не получает никакого ответа от функции-обработчика и отправляется. Попробуй закомментировать эту строку (m=m.toLowerCase() и увидешь.
Ну так, я ведь прописал это дело на onSubmit в форме. Как боты могут отправить форму без выполнения этого события? Юзаю reCapcha - не помогает, поэтому решил поизвращаться. И вроде помогло кстати, за последние 3 дня ни одного спам-бота не зарегистрировалось. Факап действительно был в toLowerCase, спасибо.) Сделал так: [js]function reg_alert() { var m=window.prompt('Вы спам-бот?','Да, я пришёл засрать форум'); if (m == null) { m='ass'; } m=m.toLowerCase(); var n=false; if (m=='нет') { n=true; } return n; }[/js]
Запросто. Спам-бот не браузер, это программа, которая может быть написана на том же PHP. Эта программа и события никакие не обрабатывает. Ну, т.е. может обрабатывать, может нет - это от автора зависит. А может, например сперва попробовать обработать, а потом попробовать не обработать. Я знаю две основных разновидности спам-ботов. 1) Те, которые ползают по интернету и ищут всякие регистрации и добавление комментов. Он находит страничку с формой, просматривает форму, выискивая все инпуты в ней (в том числе и hidden-ы) и далее делает запрос к той страничке, которая должна обработать данные из формы (то, что прописано в action). Он не заполняет форму на твоей страничке. Он просто делает запрос к скрипту-обработчику формы, передавая ему данные, названия которых нашёл в форме (input name="...") и подставляя свои значения (собственно, придуманное имя и спамный текст). 2) Те, которые постят что-то по базе. Т.е. у них есть отдельно часть, которая ползает по интернетам и ищет где что-то можно запостить (опять-таки, получает названия полей в формах, адреса обработчиков форм) и сохраняет в базе данных. Другая часть (которая, собственно, постит) может спать по несколько недель или месяцев, пока хозяин не разбудит и не скажет что-нибудь запостить, рекламку какую-нибудь навязчивую. И тогда он по всей накопленной б.д. запостит что-то. Но, опять таки, он не будет обрабатывать всякие onsubmit-ы. Т.е. он, конечно может посмотреть на них, но они ему не помеха. Он просто делает запрос к скрипту, который должен обработать запрос и передаёт в него те данные, которые скрипт-обработчик ожидает. Есть роботы по умнее, есть по глупее, некоторые запоминают полученные от сервера куки и в дальнейшем отправляют их с каждым запросом, некоторые - нет. Но суть в том, что от них невозможно защититься средствами HTML/JavaScript. Они не заполняют форму у тебя на сайте. Они получают нужную им информацию из html-кода (что и куда нужно отправить, что бы добавить комментарий) и просто отправляют нужные данные по нужному адресу. А реферер поставят такой, что как будто действительно с твоей странички пришли (подделать его как нефиг делать, 1 строчка кода). Я в своё время (когда мне на форум ломанулись автоматические спамеры) просто переименовал поля в форме в ничего не значащие сочетания символов. Например, вместо <input type="text" name="username" /> написал <input type="text" name="hfyjenb6d53dfj5dskd6" /> Этого было достаточно. Робот просто не знает, что эта строка означает и какие данные ему нужно туда подставить.