За последние 24 часа нас посетили 25483 программиста и 1732 робота. Сейчас ищут 777 программистов ...

Рандомное имя поля

Тема в разделе "PHP для новичков", создана пользователем q0b3rMAN, 29 июн 2013.

  1. q0b3rMAN

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

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Здрасте ! Такой вопрос, хочу реализовать такую фишку:
    Скрипт генерирует текстовое поле с уникальным именем,
    например, при просмотре HTML кода, поле для ввода капчи имеет уникальное имя - capcha_E232sa,
    а после обновления страницы, поле будет уже иметь другое имя, например - capcha_ewe123a

    Так вот, проблема такая, вот собственно код:
    Код (Text):
    1.     $rand = rand(1000,100500);
    2.    
    3.     echo "
    4.     <form method='post'>
    5.         <input type='text' name='capcha_$rand'>
    6.         <input type='submit' name='check' value='Отправить'>
    7.     </form>
    8.     ";
    9.    
    10.     if ($_POST['check'])
    11.     {
    12.         $value = $_POST["capcha_$rand"];
    13.         echo $value;
    14.     }
    Из переменной $value ничего не приходит, в чем проблема?
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Код (PHP):
    1. echo "
    2. <form action='#' method='post'>
    3. <input type='text' name='capcha_$rand' value=''>
    4. <input type='submit' name='check' value='Отправить'>
    5. </form>
    6. ";
    7.  
    и вывод ошибок включи....
    if ($_POST['check']) тут будет первый нотис
     
  3. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Дело даже не в нотисах, а в том, что после отправки запроса страница обновляется, а так как рандом обрабатывается раньше пост, то значение меняется...
    Зашли на форму $rand сработал и значение у поля input name к примеру такое: "captcha_4fcmv5"
    Мы ввели туда текст и отправляем форму. И в этот момент у нас обновляется страница и рандом срабатывает еще раз и уже значение "captcha_67fse65" к примеру. И мы тут же хотим его вывести в пост, но форма то отправила изначально "captcha_4fcmv5".
    По этому у вас не получится сделать так...
    Это бы выглядело примерно так:
    Код (PHP):
    1. <?php
    2. $rand=rand(1000,100500);
    3. if(isset($_POST['check'])) {
    4.     if(isset($_POST['rand']) && isset($_POST['capcha_'.$_POST['rand']])) {
    5.         $value=$_POST['capcha_'.$_POST['rand']];
    6.         echo $value;
    7.     }
    8. }
    9. echo'<form method="post">
    10.         <input type="hidden" name="rand" value="'.$rand.'">
    11.         <input type="text" name="capcha_'.$rand.'">
    12.         <input type="submit" name="check" value="Отправить">
    13.     </form>';
    14. ?>
     
  4. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Зачем такие сложности?)

    Как вы смотрите на это?) В принципе почти тоже самое, но меньше кода)
    Код (PHP):
    1. $_SESSION['rand']= isset($_POST['check']) ? $_SESSION['rand'] :rand(1000,100500);
    2. echo '<input type="text" name="capcha_'.$_SESSION['rand'].'">';
     
  5. q0b3rMAN

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

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Спасибо большое за ответы!
    Your отдельное спасибо за пояснения.

    Dmitriy A. Arteshuk, нотиса нету, возможно у меня такая конфигурация PHP.
    А вообще, я почти всегда пишу if ($_POST['value']) без isset..(если вы про это).
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    r3l0c, причет тут сесии, я детально объяснил задачу, чтобы было понятно почему так происходит...
    У вас же сессия сохранится и все постоянно будет висеть...
    А тут нужна уникальность... А у вас ее нет...

    Не, не, не...
    Код (PHP):
    1. error_reporting(E_ALL); 
    Напишите выше всего скрипта.
     
  7. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Не, я имел ввиду -- зачем столько лишнего кода для столь простой задачи?)
    Поторопился с кодом я еще--
    Код (PHP):
    1. if (!isset($_POST['capcha'.$_SESSION['rand']]))
    2. {
    3. $_SESSION['rand']=rand(1000,100500);
    4. echo'<form method="post">
    5.         <input type="text" name="capcha_'.$_SESSION['rand'].'">
    6.         <input type="submit" name="check" value="Отправить">
    7.     </form>';
    8. }
    9. else {echo 'Form is submited';}
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Вообще я бы так не делал.
    Смысла нет, от этого.
    Что так, что так.
    Ибо поле все равно известно, лишняя обработка.
    В таком случае эту лишнюю обработку "соль" делать после отправки значения пост.
     
  9. r3l0c

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

    С нами с:
    10 янв 2013
    Сообщения:
    453
    Симпатии:
    4
    Поле в любом случае известно =), я бы никак из предложенных способов не делал, в том числе и мною предложенным тоже не стал делать xD. Капча рулит%)
     
  10. q0b3rMAN

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

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Почему известно? Разве это не защитит от ботов?
    Может опытные посоветуют, как можно на 99% защитить от ботов без капчи, и прочих систем которые отвлекают пользователей?

    А что если генерировать слово type="text" (слово - text) рандомно, и забивать его в css?
    Обьясните нубу, как бот распознает поле?
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Каптча=Помойка.
     
  12. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вариант.
    добавьте к форме любое поле, с осмысленным именем. присвойте ему особый класс. а в CSS сделайте элементы этого класса невидимыми.

    профит!

    нормальный юзер - никогда не будет его заполнять, ибо просто неувидит.
    бот - тупо заполняет все поля формы(обычно), и раз оно заполнено, значит форму отправил бот.
    большинтсво тупых ботов отсеит точно. ну а от индивидуальной настройки бота на вас сайт это конечно не спасет.
     
  13. q0b3rMAN

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

    С нами с:
    11 июн 2011
    Сообщения:
    142
    Симпатии:
    0
    Можете пример привести? (код)
    Буду очень благодарен!

    Хотя спасибо, сам разобрался.
    Продолжу идею, если наше невидимое заполнено, то блокировать, ибо это бот, я верно думаю?