Я создаю форму в 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;
}
}
но, вероятно, это не сработает.
Есть мысли?