Как сделать Spinner для повышения безопасности php-формы? - PullRequest
2 голосов
/ 13 июля 2010

Эта статья о безопасности php-формы:

http://nedbatchelder.com/text/stopbots.html

... упоминает "спиннер" как:

Спиннер - скрытое полеиспользуется для нескольких вещей: он хэширует ряд значений, которые предотвращают фальсификацию и повторы, и используется для маскировки имен полей.Спиннер представляет собой хеш MD5:

* The timestamp,
* The client's IP address,
* The entry id of the blog entry being commented on, and
* A secret.

Имена полей в форме рандомизированы.Это хеши реального имени поля, счетчика и секрета.Спиннер получает фиксированное имя поля, но все остальные поля в форме, включая кнопки отправки, используют хэшированные имена полей.

У кого-нибудь есть пример кода, как реализовать это настраница php, содержащая форму и связанный скрипт отправки формы php?

Я не хочу использовать AJAX, просто PHP.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2015

Что делать, если при загрузке страницы создавать сеансы со случайными значениями. Например $_SESSION['name_for_email'] = 'something_random';

Затем поле ввода

<input type="text" 
name="<?php echo htmlspecialchars( $_SESSION['name_for_email'], ENT_QUOTES, "UTF-8");?>"
>

Кажется, лучше использовать AJAX. Посетитель нажимает Отправить, передать все данные на внешний php, во внешний вызов php $_SESSION['name_for_email'], чтобы узнать имя поля электронной почты.

Если без ajax, то пост и страница обновляются, но вверху страницы создается новый $_SESSION['name_for_email']. Поэтому PHP-код для обработки формы ввода должен быть до определения $_SESSION['name_for_email']

Если много полей ввода, то необходимо использовать много сеансов. Может быть лучше какой-то упрощенной версии.

$_SESSION['name_for_email'] = 'something_random';

<input type="text" 
name="field1<?php echo htmlspecialchars( $_SESSION['name_for_email'], ENT_QUOTES, "UTF-8");?>"
>

Просто нужно помнить, что field1 для электронной почты, field2 для имени и т. Д.

Но ... снова думаю. Основной вопрос заключается в том, что у бота либо не будет $_SESSION['name_for_email'], либо для бота значение будет неправильным. Хорошо, бот "видит" электронную почту, "печатает" электронную почту.

Если определить какое-то скрытое поле с помощью $_SESSION['name_for_email'] и перед обработкой ввода проверить, совпадает ли $_SESSION['name_for_email'] с скрытым полем ввода, я полагаю, будет тот же эффект. Потому что, если бот знает правильное случайное значение, имена входных полей также будут правильными.

0 голосов
/ 13 июля 2010

Вы могли бы реализовать следующее:

  On Page Submit:
  <?php
    $spinnerKey = 'spin';
    $spinner = $_POST[$spinnerKey];
    $values = array();

    foreach ($_POST as $key=>$value)
    {
      if ($key !== $spinnerKey)
      {
        $values[deHash($key, $spinner)] = $value;
      }
    }
?>

A 'deHash' example:
<?php

    # You have to define deHash based on your hash but it 
    # would look something like this:
    var $_rainbowTable = array();
    var $_expectedKeys = array();

    function deHash($hashedkey, $spinner)
    {
        $rt = $this->getRainbowTable($spinner);

        return isset($rt[$hashedKey])
          ? $rt[$hashedKey])
          : NULL;
    }

    function getRainbowTable($spinner)
    { 
        if (count($this->_rainbowTable) > 0)
            return $this->_rainbowTable;

        foreach ($this->_expectedKeys as $key)
        {
            $this->_rainbowTable[hash($key, $spinner)] == $key;
        }

        return $this->_rainbowTable;
    }
  ?>

В конечном счете, хотя я не вижу, как это останавливает ботов, отправляющих вашу страницу, - это просто мешает людям "email / user / pass" запомнить плагин браузера для работы.

...