Антиспам форма с приманкой и сессионным токеном - PullRequest
0 голосов
/ 05 марта 2019

Я создаю форму в Wordpress и хочу добавить слой безопасности для предотвращения спама.

Обычно я делаю так:

header.php

<?php
session_start();
if (!isset($_SESSION['_token'])) {
    $_SESSION['_token'] = md5(time());
}

if ($_POST) {
    if (!isset($_POST['url']) || !empty($_POST['url'])) {
        header('Location: https://website.com/');
        exit;
    }
    if ($_SESSION['_token'] != $_POST['_token']) {
        header('Location: https://website.com/');
        exit;
    }
    $_SESSION['end'] = time();
    $diff = ($_SESSION['end'] - $_SESSION['start']);
    if ($diff < 1) {
        header('Location: https://website.com/');
        exit;
    }

} else {
    $_SESSION['start'] = time();
}

if (false === strpos($_SERVER['REQUEST_URI'], 'thank-you.php')) {
    $bThankYou = false;
} else {
    $bThankYou = true;
}
?>

form.php

<form method="post" action="#">
    <input type="hidden" name="_token" value="<?= $_SESSION['_token']?>">
    <input type="text" name="url" id="url" value="">
</form>

и это обычно работает.

Но сейчас я нахожусь в среде WordPress и по какой-то причине не могу изменить header.php.

Так что я должен структурировать свой код по-другому.

По сути, я создаю эту форму в функции как короткий код:

function.php

add_shortcode('req_form_landing' , 'render_req_form_landing' );
function render_req_form_landing($atts , $content){
    $atts = shortcode_atts( array(
        'btnsubmit_label' => 'SUBMIT',
        ) , $atts);

    $content =  (empty($content))? " " : $content;
    extract($atts);

    $html='

    <form method="post" action="">  
        <input type="hidden" name="_token" value="'.$_SESSION["_token"].'">
        <input style="display:none;" type="text" name="url" id="url" value="">

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

process.php

<?php
session_start();
if (!isset($_SESSION['_token'])) {
    $_SESSION['_token'] = md5(time());
}
if ($_POST) {
    if (!isset($_POST['url']) || !empty($_POST['url'])) {
        header('Location: https://website.com/');
        exit;
    }
    if ($_SESSION['_token'] != $_POST['_token']) {
        header('Location: https://website.com/');
        exit;
    }
}

Я получаю ошибку:

Cannot modify header information - headers already sent by

Это имеет смысл, но я не уверен на 100% в том, как решить, я мог бы изменить буферизацию вывода:

 <?php 
 if ($_POST) {
    if (!isset($_POST['url']) || !empty($_POST['url'])) {
        ob_start();
        header('Location: https://website.com/');
        ob_end_flush();
        exit;
    }
    if ($_SESSION['_token'] != $_POST['_token']) {
        ob_start();
        header('Location: https://website.com/');
        ob_end_flush();
        exit;
    }
 }

но, вероятно, это не сработает.

Есть мысли?

...