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

时间:2014-11-21 22:30:39

标签: php wordpress plugins

我在wordpress中遇到了SESSIONs的问题。我环顾四周但找不到任何答案。有关stackaoverflow的另一篇文章中也提出了类似的问题,但还没有答案。 我已按照本教程构建自己的FORM:build your own wordpress contact form in 5 minutes.

问题

为了使我的表单更安全,我决定生成会话字符串,并将此字符串存储在SESSION全局数组中(以防止表单劫持)。发布表单时,我将相同的字符串作为隐藏字段发送。而且我比较了这2个值。但是,在我看来,提交表单时,SESSION与我在提交之前存储在SESSION数组中的SESSION不同。

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

提交此表单时,它总是会产生错误,因为SESSION变量与POST变量不同。当我在本地xampp服务器上的wordpress外面测试相同的代码时,它可以工作。如果有人能帮助我,我会很高兴。我也在脚本的顶部尝试了session_start(),但仍然存在同样的问题。

1 个答案:

答案 0 :(得分:0)

经过一些试验,我意识到帖子标题显示在页面顶部。我在myfunction()中启动了ob_start()。因此,标题在SESSION开始之前输出。我更改了下面的代码,现在可以使用了。这个解决方案的唯一问题是wordpress在每个页面加载时调用ob_start()。如果它在myfunction()中工作会更好,因为这意味着只有在帖子中调用短代码时才会执行ob_start()。 `

//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`