За последние 24 часа нас посетили 38664 программиста и 1284 робота. Сейчас ищут 1070 программистов ...

prompt - не срабатывает "отмена"

Тема в разделе "JavaScript и AJAX", создана пользователем Freakmeister, 1 ноя 2011.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Есть старый форум, не совместимый с jQuery (долго объяснять). Соотвессна, пользуясь только JavaScript нужно сделать крохотный антиспам. Я его вроде сделал, но почему-то, если в диалоговом окне нажать "отмена", то форма всё-равно отправляется. Где я накосячил?

    HTML:
    1. <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]
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    У меня с баттона форма полюбас отправлялась а с инпута - работало как надо. Или наоборот. Я не помню. Так что не факт что в коде косяк.
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Freakmeister
    Спамботы просто отправляют форму. Им плевать на JavaScript.
    А вообще такой код:
    HTML:
    1. <script type="text/javascript">
    2. function reg_alert() {
    3.     var m=window.prompt('Вы спам-бот?','Да, я пришёл засрать форум');
    4.     m=m.toLowerCase();
    5.     var n=false;
    6.     if (m=='нет') { n=true; }
    7.     return n;
    8. }
    9. <form name="register" method="post" action="" onSubmit="return reg_alert();">
    10.     <input type="hidden" name="test" value="test" />
    11.     <input type="submit" value="send it" />
    12. </form>
    работает.
    Ищи косяк где-то ещё.
    Может пользователи пишут что-то другое? :) Например: "Нет, я не спам-бот". Или "Я? Нее..."
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Сделай капчу.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Не внимательно прочитал вопрос, что не работает именно когда нажимаешь "Отмена".
    Там не работает из-за того, что если нажать на отмену, то значение переменной m будет равно null (это не строка). Когда ты пытаешься сделать m=m.toLowerCase(); это приводит к ошибке сценария (null - это не строка и у него нет метода toLowerCase()). Выполнение сценария завершается ошибкой, форма не получает никакого ответа от функции-обработчика и отправляется. Попробуй закомментировать эту строку (m=m.toLowerCase();) и увидешь.
     
  6. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Ну так, я ведь прописал это дело на 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]
     
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Запросто. Спам-бот не браузер, это программа, которая может быть написана на том же PHP. Эта программа и события никакие не обрабатывает. Ну, т.е. может обрабатывать, может нет - это от автора зависит. А может, например сперва попробовать обработать, а потом попробовать не обработать.
    Я знаю две основных разновидности спам-ботов.
    1) Те, которые ползают по интернету и ищут всякие регистрации и добавление комментов. Он находит страничку с формой, просматривает форму, выискивая все инпуты в ней (в том числе и hidden-ы) и далее делает запрос к той страничке, которая должна обработать данные из формы (то, что прописано в action). Он не заполняет форму на твоей страничке. Он просто делает запрос к скрипту-обработчику формы, передавая ему данные, названия которых нашёл в форме (input name="...") и подставляя свои значения (собственно, придуманное имя и спамный текст).
    2) Те, которые постят что-то по базе. Т.е. у них есть отдельно часть, которая ползает по интернетам и ищет где что-то можно запостить (опять-таки, получает названия полей в формах, адреса обработчиков форм) и сохраняет в базе данных. Другая часть (которая, собственно, постит) может спать по несколько недель или месяцев, пока хозяин не разбудит и не скажет что-нибудь запостить, рекламку какую-нибудь навязчивую. И тогда он по всей накопленной б.д. запостит что-то. Но, опять таки, он не будет обрабатывать всякие onsubmit-ы. Т.е. он, конечно может посмотреть на них, но они ему не помеха. Он просто делает запрос к скрипту, который должен обработать запрос и передаёт в него те данные, которые скрипт-обработчик ожидает.

    Есть роботы по умнее, есть по глупее, некоторые запоминают полученные от сервера куки и в дальнейшем отправляют их с каждым запросом, некоторые - нет.
    Но суть в том, что от них невозможно защититься средствами HTML/JavaScript. Они не заполняют форму у тебя на сайте. Они получают нужную им информацию из html-кода (что и куда нужно отправить, что бы добавить комментарий) и просто отправляют нужные данные по нужному адресу. А реферер поставят такой, что как будто действительно с твоей странички пришли (подделать его как нефиг делать, 1 строчка кода).
    Я в своё время (когда мне на форум ломанулись автоматические спамеры) просто переименовал поля в форме в ничего не значащие сочетания символов. Например, вместо
    <input type="text" name="username" />
    написал
    <input type="text" name="hfyjenb6d53dfj5dskd6" />
    Этого было достаточно.
    Робот просто не знает, что эта строка означает и какие данные ему нужно туда подставить.
     
  8. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Зачот. Если попрут опять, попробую так сделать.