2010-09-18 29 views
5

Tôi có một biến session mà tôi thiết lập như thế này:phiên PHP thay đổi biến giữa các trang

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

Sau đó, trên một trang khác tôi có điều này:

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

Vấn đề là họ không trận đấu. Tôi nhận được hai chuỗi hoàn toàn khác nhau. register_globals bị tắt. Tôi đã nhận thấy rằng khi tôi đặt md5(....) thành chuỗi không đổi, ví dụ: md5('example'), nó hoạt động như mong đợi và hai chuỗi khớp nhau. Nhưng điều đó không quan trọng. Bất kỳ ý tưởng về những gì đang xảy ra ở đây?

EDIT: Apache login Log:

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" 

Tôi không khá chắc chắn làm thế nào để đọc mà nhưng có vẻ với tôi rằng tập tin của tôi (index.php mà tôi giả định là '/') đang được được gọi là ba lần. Tôi có đọc đúng không? Có chuyện gì vậy?

+0

Tôi không thể tạo lại hành vi này. Kiểm tra nhật ký truy cập của bạn và cung cấp thêm một số chi tiết về môi trường bạn đang sử dụng. Rõ ràng là mã được cung cấp không phải là toàn bộ hệ thống, bạn có thể đặt lại mã thông báo đó ở một nơi khác. –

+0

Một số plugin trình duyệt được biết là gây ra hành vi mà một số yêu cầu được gửi thay vì một. – James

+0

@Josh K Tôi không ... cả hai trang đều tĩnh ngay bây giờ. Điều duy nhất được thiết lập hoặc thay đổi là mã thông báo và điều đó chỉ xảy ra ở một nơi như được hiển thị ở trên. – williamg

Trả lời

3

Lỗi hoàn toàn ngu ngốc về phía tôi. Tôi đã có một số thẻ rỗng <img> trong đó đã gây ra các yêu cầu bổ sung. facepalm Xin lỗi mọi người, đã giải quyết được sự cố. Cảm ơn bạn đã giúp đỡ!!

1

Có vẻ lạ. Đoạn mã đầu tiên đặt lại mã thông báo đó phải được chạy lại bằng cách nào đó.

2

Giải pháp duy nhất tôi có thể nghĩ là bạn đang thực hiện yêu cầu thứ hai đến trang đầu tiên mà không biết. Có lẽ bạn nên kiểm tra bản ghi truy cập apache của bạn để truy cập thứ hai này ...

Đưa ra yêu cầu đơn giản truy cập sẽ là một giải pháp để kiểm tra này:

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

Yep ... đó là vấn đề. Khi tôi đặt mã này trong đó tôi nhận được 2. Tôi không thể tìm ra lý do tại sao mặc dù ... Đó là một trang tĩnh ngoại trừ phần mã thông báo. Không lặp, cập nhật nội dung, v.v ... – williamg

+0

Tôi đã đăng nhật ký Truy cập Apache của mình ở trên. – williamg

+0

bạn có nghĩa là mỗi khi bạn làm mới trang, 2 được thêm thay vì một? Bạn thấy 2, 4, 6, v.v. Bạn có bất kỳ phần mở rộng đặc biệt nào trong trình duyệt của mình không? Giống như trình xác thực HTML cho firefox? – greg0ire

2

Bạn sẽ nhận thấy rằng mỗi khi bạn truy cập lại trang đầu tiên , biến phiên của bạn sẽ thay đổi. Vì nó hoạt động cho một chuỗi liên tục, 'ví dụ', tôi sẽ giả sử rằng bạn truy cập lại trang 1 để xem những gì được lưu trữ ở đó.

Sửa lỗi có thể được kiểm tra để đảm bảo rằng biến phiên đó không được đặt trước khi bạn đặt lại. tức là

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

Đoạn mã này sẽ hoạt động như mong đợi.

+0

Không, vấn đề tương tự, nhưng cảm ơn bạn đã cố gắng! – williamg

+0

Câu trả lời rất hữu ích. Hai ngón tay cái lên bro! –

Các vấn đề liên quan