Предотвратить посты вне формы сайта? - PullRequest
1 голос
/ 13 октября 2011

Я ищу самый безопасный способ запрета размещения моей веб-формы, использующей PHP и MySQL, с удаленного сайта. Я провел некоторый поиск и обнаружил, что большинство людей предлагают установить скрытое поле в форме и переменную сеанса со значением хеша md5 () и проверить его при отправке формы. Но это кажется не очень безопасным, потому что значение хеша md5 () можно увидеть в источнике формы в скрытом значении.

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

Пожалуйста, посмотрите на это и посмотрите, можете ли вы сделать какие-либо пробелы в этой мере безопасности, чтобы предотвратить пост-формы постов.

// First time form loads
if (!$_POST) {

    session_start();

    $code_options = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');
    for ($i=1; $i<=20; $i++) {
        $code .= array_rand(array_flip($code_options), 1);
    }

    // Insert new record
    $con = connect_to_db(); // connects to db
    $sql = "INSERT INTO security_table (form_code) values('$code')";
    $result = run_query($sql, $con); // runs the query

    $_SESSION['formcode'] = $code;
    $_SESSION['formid'] = mysql_insert_id();

}

// If form was posted to    
if ($_POST) {

    session_start();

    $con = connect_to_db();
    $form_code = mysql_real_escape_string($_SESSION['formcode']);
    $form_id = mysql_real_escape_string($_SESSION['formid']);

    $sql = "SELECT form_code FROM security_table WHERE form_code = '$form_code' AND form_id = '$form_id '";
    $result = run_query($sql, $con);

    if (mysql_num_rows($result) > 0) {

        // Process the form

        // If form processes successfully
        $_SESSION['formcode'] = "";
        $_SESSION['formid'] = "";

    }else{

        // Error

    }

}

Ответы [ 3 ]

2 голосов
/ 13 октября 2011

Вместо того, чтобы делать это в своем приложении, вы можете контролировать доступ к своему сайту через конфигурацию вашего веб-сервера.Хорошее разделение проблем, если вы можете сделать это таким образом - сервер обрабатывает запросы, а приложение работает только с логикой.

Предполагается, что вы используете Apache и имеете доступ на чтение / запись к вашему Apache http.conf или локальный .htaccess, вы можете добавить правило следующим образом:

<Limit GET POST>
  order deny,allow
  deny from all
  allow from 199.166.210.
  allow from .golden.net
  allow from proxy.aol.com
  allow from fish.wiretap.net
</Limit>

Итак, запрещайте всем, кроме нескольких IP-адресов или сетевых адресов, которые вы выбрали.

См. Подробности в документации Apache .

1 голос
/ 13 октября 2011

But that doesn't seem very secure because the md5() hash value can be seen in the source of the form in the hidden value.

Неважно.Если вы достаточно хорошо его зашифруете, токен будет понятен каждому, и поэтому его невозможно будет воссоздать, если вы не знаете ключевой механизм в скрипте php.Поскольку вы регенерируете токен после каждого поста, видеть, как он выглядит, не поможет ни одному плохому парню.

Ваш способ обезопасить свою форму в основном "если у вас есть сеанс, у вас все хорошо".Так что, если спам-машина посетила вашу страницу один раз, уровень безопасности пройден.Причина, по которой у вас есть токен на стороне клиента, заключается в том, что спаммер должен предоставить что-то, что только достижимо в вашей реальной форме.

Существует множество дискуссий о безопасных формах в stackoverflow, посмотрите на Хорошая форма безопасности - без CAPTCHA , например.

0 голосов
/ 22 октября 2013

Вот хорошая статья, объясняющая различные методы защиты формы. Я использовал эти методы с хорошими результатами. http://www.campaignmonitor.com/blog/post/3817/stopping-spambots-with-two-simple-captcha-alternatives

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...