我写了一个Wordpress插件,可以使用短代码在帖子/页面中嵌入表单。
我在这个表单中使用php会话。
其中一个用途是存储在显示表单时生成的标记,然后将其与表单隐藏字段的值进行比较,也在显示表单时进行设置。
这样,如果隐藏字段的提交值与会话中令牌的存储值相同,我知道这是我的插件生成的表单,并进行了进一步的验证。
当我创建表单时,当运行'add_shortcode'调用的函数时,会生成令牌。此时,它的值既存储在会话数组中,也存储为表单隐藏字段的值。
问题在于,在将它与隐藏字段值进行比较之前,看起来存储在会话中的令牌会被覆盖,换句话说,它看起来像表单(和令牌)的生成发生在表单逻辑之前(包含在'init')。
以下是我的代码的相关部分:
主插件-file.php:
// Sessions
function init_sessions() {
if (!session_id()) {
session_start();
}
}
add_action('init', 'init_sessions');
// Formlogic
add_action('init', 'include_formlogic');
function include_formlogic()
{
include_once 'formlogic.php'; // comparing $_SESSION['token'] and $_POST['token']
}
// Shortcode
add_shortcode('display_form', 'display_form');
function display_form()
{
return getForm();
}
formlogic.php:
// generate unique token
function generateToken()
{
$token = uniqid(rand(), true);
$_SESSION['token'] = $token;
return $token;
}
// Generate form
function getForm()
{
$token = generateToken();
// Checking the form
if (checkForm()) {
// Get variables to be included in the form
getVariables();
// Start with the output buffering
ob_start();
include 'form-template.php';
$output = ob_get_clean();
} else {
// Alternative html in case of error
$output = 'Error';
}
return $output;
}
// Comparing $_SESSION['token'] and $_POST['token'] to see if we go further:
if ($_SESSION['DRAFS_token'] === $_POST['token']) {
// Validate the form and process it
} else {
// Display the form along with the errors
}