簡體   English   中英

會話變量在提交表單時更改值。

[英]Session variable changes value when form is submitted.

我正在嘗試將CS​​RF令牌添加到我的表單中。 問題是當我在文件中添加它時,我回顯出會話令牌,它匹配名為'token'的輸入中的令牌。 但是,當我提交頁面並使用Token :: check時,它返回false,如果我再次從輸入和會話中回顯令牌值,我會看到會話值已更改但輸入值保持不變。

<?php
class Token{
public static function generate(){
    return $_SESSION['token'] =    base64_encode(openssl_random_pseudo_bytes(32)); 
}

public static function check($token){
    if(isset($_SESSION['token']) && $token == $_SESSION['token']){
        unset($_SESSION['token']);
        return true;
    }else{
        return false;
    }
}
}
?>

這是用來控制表單的php。

$token = $_POST['token'];
if(Token::check($token)){ //Continue with more code }

以下是處理令牌的表單部分:

<input type="hidden" name="user_id_update" value="<?php echo $user_info[0][0]->id; ?>"/>
                            <input type="hidden" name="time_update" value="<?php echo $time; ?>"/>
                            <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"
                            <hr />

                            <div class="form-group">
                                <input type="submit" id="submit_update" value="Update" class="btn btn-success"/>
                            </div>

如果有人能對此有所了解,我會非常感激,因為我已經在網上搜索了幾個小時,但找不到答案。 謝謝。

經過一些挖掘代碼。 我發現這些文件被添加到網站的順序意味着生成令牌的代碼位於表單的控制器之上。 因此,當表單發布時,它每次都創建一個新的會話變量,因此發布的數據與存儲在會話變量中的數據不同。 改變包含這些文件的順序解決了這個問題。 希望這可以在將來幫助某人。

同樣的問題也與我同在。 花了很多時間和調試后,我找到了一個奇怪的解決方案。 問題出在meta標簽上。 讓我告訴你我是如何解決我的問題的。

文件名:Token.php

<?php
    class Token
    {
        public static function generate()
        {
            return $_SESSION['token'] = md5(time() . uniqid());
        }

        public static function check($token)
        {
            if (isset($_SESSION['token']) && $token == $_SESSION['token']) {
                unset($_SESSION['token']);
                return true;
            } else {
                return false;
            }
        }
    }
?>

文件名:myscript.php

<?php require_once 'header.php'; ?>

<?php
     if ($_SERVER['REQUEST_METHOD'] == 'POST') {

         if(Token::check($_POST['token'])) {
              echo 'valid token';

              // code...
         } else {
              echo 'invalid token';
         }

     }
?>

<form action="" method="post">
    <!-- other fields -->
    <input type="hidden" name="token" value="<?php echo Token::generate();?>">
    <input type="submit" value="Submit">
</form>

<?php require_once 'footer.php'; ?>

文件名:header.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="author" content="Ishtiyaq Husain">
    <link rel="shortcut icon" href="#" />

    <!-- other css files -->
</head>

這些是我得到的價值觀:

首頁加載:

// print old token value from session
echo $_SESSION['token']; //no value
// generate new token
echo Token::generate();  // e72a2f53a25f364e8a2e62e556f7e417
// print new token value from session
echo $_SESSION['token']; // e72a2f53a25f364e8a2e62e556f7e417

頁面刷新后:

// print old token value from session
echo $_SESSION['token']; // a63e674d55e9248c25a48856649bf590 //expected value -> e72a2f53a25f364e8a2e62e556f7e417
// generate new token
echo Token::generate();  // 237063c2f7892242c79bfabcd48bcdc8
// print new token value from session
echo $_SESSION['token']; // 237063c2f7892242c79bfabcd48bcdc8

在令牌檢查時,它在$ _SESSION ['token']中獲得一個新的令牌值。 這就是為什么它與隱藏輸入框的值不匹配。 調試后我發現如果我們從header.php中刪除這一行,它就可以了。 對此有任何有效的解釋嗎?

<link rel="shortcut icon" href="#" />

或使用有效的URL圖標,如:

<link rel="shortcut icon" href="http://ishtiyaq.com/images/iLogo.png" />

結果是:

首頁加載:

// print old token value from session
echo $_SESSION['token']; //no value
// generate new token
echo Token::generate();  // 36e48f2307da7054c67822147878e0c6
// print new token value from session
echo $_SESSION['token']; // 36e48f2307da7054c67822147878e0c6

頁面刷新后:

// print old token value from session
echo $_SESSION['token']; // 36e48f2307da7054c67822147878e0c6 //as expected
// generate new token
echo Token::generate(); // 734eaeeb862d4d0d52eea1a292f007ec
// print new token value from session
echo $_SESSION['token']; // 734eaeeb862d4d0d52eea1a292f007ec

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM