Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php wordpress插件页面加载时会话变量意外更改_Php_Wordpress_Plugins - Fatal编程技术网

Php wordpress插件页面加载时会话变量意外更改

Php wordpress插件页面加载时会话变量意外更改,php,wordpress,plugins,Php,Wordpress,Plugins,我对wordpress中的会话有问题。我环顾四周,但找不到任何答案。StackaoOverflow上的另一篇帖子也提出了类似的问题,但还没有答案。 我按照本教程构建了自己的表单: 问题 为了使表单更加安全,我决定生成一个会话字符串,并将该字符串存储在会话全局数组中以防止表单劫持。在发布表单时,我将此字符串作为隐藏字段发送。然后比较这两个值。但是,在我看来,提交表单时,会话与提交前存储在会话数组中的会话不同 function myfunction() { ob_start();

我对wordpress中的会话有问题。我环顾四周,但找不到任何答案。StackaoOverflow上的另一篇帖子也提出了类似的问题,但还没有答案。 我按照本教程构建了自己的表单:

问题 为了使表单更加安全,我决定生成一个会话字符串,并将该字符串存储在会话全局数组中以防止表单劫持。在发布表单时,我将此字符串作为隐藏字段发送。然后比较这两个值。但是,在我看来,提交表单时,会话与提交前存储在会话数组中的会话不同

function myfunction() {    
    ob_start();            
    $errors = array();    

    //deliver_mail();     
    if(isset( $_POST['cf-submitted'] ) ) {         

        if( $_POST['formtoken1'] !== $_SESSION['formtoken1'] ) {                       
            $errors['token'] = '<div>The form submited is not valid.</div>'; 
            //debug
            echo $_SESSION['formtoken1'];//At this point, SESSION[formtoken1] should be same as the one we generated before FORM submit, but it is not!
        }

        if(empty($errors)) {            
            //No Errors! Send Email                        
        }   
    }    

    $_SESSION['formtoken1'] = md5(uniqid(rand(), true));    
    $_SESSION['formtoken1'] = htmlspecialchars($_SESSION['formtoken1']);            

    echo '<form action="' . esc_url( $_SERVER['REQUEST_URI'] ) . '" method="post">';    
    echo '<input type="text" name="formtoken1" id="formtoken1" value="'. (isset($_SESSION['formtoken1']) ? $_SESSION['formtoken1'] : '') . '" />';           

    echo '<p><input type="submit" name="cf-submitted" value="Send"></p>';
    echo '</form>';

return ob_get_clean();
} 
add_shortcode( 'my_contact_form', 'myfunction' );//Create shortcode

提交此表单时,它始终会创建错误,因为会话变量与POST变量不同。当我在本地xampp服务器上的wordpress外部测试相同的代码时,它就工作了。如果有人能帮助我,我将不胜感激。我也尝试过在脚本顶部启动会话,但仍然存在相同的问题。

经过一些尝试后,我意识到文章标题显示在页面顶部。我在我的函数中启动ob_start。所以,标题是在会话开始之前输出的。我修改了下面的代码,现在可以用了。这个解决方案的唯一问题是wordpress在每次加载页面时都调用ob_start。如果它在myfunction中工作会更好,因为这意味着只有在post中调用短代码时才会执行ob_start。 `


我认为$\u会话在PHP中是超全局的,因此我可以在函数中使用它,而不会出现任何局部作用域问题。您应该尝试将会话字符串存储在$\u会话中的关联数组中,这样它们就不会被覆盖。为简单起见,将其称为issuedKeys。发出新密钥时,将其添加到数组中,值为true。检查密钥时,请使用isset和delete对其进行检查。添加某种日志记录,以查看您的函数是否可能执行多次。请注意,如果刚刚声明了$\u会话['formtoken1',为什么要对其运行条件?它将永远被设定。此外,htmlspecialchars仅转换安培、引号和小于或大于信号。MD5永远不会生成这些字符中的任何一个。
//Plugin Name: test form    

ob_start(); //put this outside the myfunction()          

if(!session_id() ) { 
    session_start();     
}

function myfunction() {    

    $errors = array();    

    //deliver_mail();     
    if(isset( $_POST['cf-submitted'] ) ) {         

        if( $_POST['formtoken1'] !== $_SESSION['formtoken1'] ) {                       
            $errors['token'] = '<div>The form submited is not valid.</div>'; 
            //debug
            echo $_SESSION['formtoken1'];//At this point, SESSION[formtoken1] should be same as the one we generated before FORM submit, but it is not!
        } 

        if(empty($errors)) {            
            //No Errors! Send Email             
        }   
    }    

    $_SESSION['formtoken1'] = md5(uniqid(rand(), true));    
    $_SESSION['formtoken1'] = htmlspecialchars($_SESSION['formtoken1']);            

    echo '<form action="' . esc_url( $_SERVER['REQUEST_URI'] ) . '" method="post">';    
    echo '<input type="text" name="formtoken1" id="formtoken1" value="'. (isset($_SESSION['formtoken1']) ? $_SESSION['formtoken1'] : '') . '" />';           
    echo '<p><input type="submit" name="cf-submitted" value="Send"></p>';
    echo '</form>';

    return ob_get_clean();
} 
add_shortcode( 'my_contact_form', 'myfunction' );//Create shortcode`