2010-09-18 93 views
5

我有我這樣設置會話變量:PHP會話變量的變化

<?php 
$token = md5(uniqid(rand(), true)); 
session_start(); 
$_SESSION['token'] = $token; 
print $_SESSION['token']; 
?> 

然後在另一頁上我有這樣的:

<?php 
session_start(); 
print $_SESSION['token']; 
?> 

的問題是,他們沒有比賽。我得到兩個完全不同的字符串。 register_globals已關閉。我注意到,當我設置md5(....)爲一個常量字符串,例如:md5('example'),它按預期工作並且兩個字符串匹配。但那不應該。關於這裏發生了什麼的任何想法?

編輯:Apache的艾策斯日誌:

127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /index.php HTTP/1.1" 200 3182 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3" 
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /style/style.css HTTP/1.1" 304 - "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3" 
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /js/signup.js HTTP/1.1" 304 - "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3" 
127.0.0.1 - - [18/Sep/2010:17:46:09 -0500] "GET /index.php HTTP/1.1" 200 3182 "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3" 
127.0.0.1 - - [18/Sep/2010:17:46:10 -0500] "GET /index.php HTTP/1.1" 200 3182 "http://cmb.local:8888/index.php" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.59 Safari/534.3" 

我不太知道如何閱讀,但在我看來,我的文件(的index.php我以爲是「/」)正在叫三次。我讀的是對的嗎?那裏發生了什麼?

+0

我無法重現此行爲。檢查您的訪問日誌,並提供有關您正在使用的環境的更多詳細信息。很明顯,提供的代碼不是整個系統,您可能在其他地方重置了該令牌。 – 2010-09-18 21:59:00

+0

某些瀏覽器插件已知會導致發送多個請求而不是一個請求的行爲。 – James 2010-09-18 22:28:48

+0

@Josh K我不是......兩個頁面現在都是靜態的。唯一被設置或更改的是令牌,並且只發生在一個地方,如上所示。 – williamg 2010-09-18 22:31:09

回答

3

我完全愚蠢的錯誤。我在那裏有一些空的<img>標籤,導致額外的請求。 facepalm對不起大家,問題解決了。謝謝你的幫助!!

1

看起來很奇怪。重置令牌的第一部分代碼必須以某種方式再次運行。

2

我能想到的唯一解決方案是您在不知道它的情況下向第一頁發出第二個請求。你或許應該檢查你的Apache訪問日誌本次訪問...

製作一個簡單的請求計數器將是另一個解決方案進行檢查:

$_SESSION['counter'] = isset($_SESSION['counter'])? $_SESSION['counter'] +1 : 0; 
+0

是的......這就是問題所在。當我把這個代碼放在那裏,我得到2.我不明白爲什麼,但...這是一個靜態頁面,除了令牌部分。沒有循環,更新內容等... – williamg 2010-09-18 22:08:37

+0

我上面發佈了我的Apache Access日誌。 – williamg 2010-09-18 22:20:35

+0

你的意思是每次刷新頁面時,都會添加2而不是1?你看到2,4,6等?你的瀏覽器中有沒有特別的擴展名?就像Firefox的HTML驗證器一樣? – greg0ire 2010-09-18 22:25:58

2

你會發現,每次重溫第一頁,你的會話變量將會改變。由於它適用於常量字符串'example',因此我會假設您重新訪問第1頁以查看存儲在那裏的內容。

修復程序可能正在檢查以確保在再次設置該會話變量之前未設置該變量。 即

<?php 
session_start(); 
if(!empty($_SESSION['token'])){ 
    $token = md5(uniqid(rand(), true)); 
    $_SESSION['token'] = $token; 
} 
print $_SESSION['token']; 
?> 

這段代碼應該按預期工作。

+0

不,同樣的問題,但謝謝你的嘗試! – williamg 2010-09-18 22:08:56

+0

非常有用的答案。兩個豎起大拇指! – 2014-01-15 10:35:56