2012-01-21 31 views
8

Tôi đã đọc một vài bài đăng có liên quan ở đây, nhưng dường như không thể làm cho tập lệnh của tôi hoạt động như dự định.phiên php & iframe

Tôi có trang đăng nhập mà người dùng đăng nhập. Nếu mật khẩu khớp, tập lệnh ghi hai giá trị vào biến số $_SESSION: ['loggedin']='yes'['loginname']="username".

Sau khi đăng nhập thành công, người dùng chuyển đến trang khác có 2 iframe trong đó.

Một khung nội tuyến sử dụng nội dung bên ngoài và không yêu cầu xác thực (loại bỏ iframe này khỏi trang không thay đổi bất kỳ thứ gì).

Khung nội tuyến khác sử dụng nội dung được tạo động từ cùng một tên miền và kiểm tra xem các biến phiên có còn ở đó hay không.

Một trong các chức năng làm mới nội dung của iframe được tạo động.

Khi việc này được thực hiện, các biến phiên bị mất. Thực tế, bản thân phiên không còn tồn tại nữa.

Tôi có session_start(); trên mọi trang được sử dụng cùng với tập lệnh này.

Mọi trợ giúp sẽ được đánh giá cao.

+0

nếu bạn có session_start() trên trang iframe, bạn sẽ không gặp vấn đề gì. – Chibuzo

+0

Tôi gặp sự cố với các phiên dựa trên cookie không hoạt động trong khung nội tuyến của mình. Đó là vì trình duyệt mà tôi đã thử nghiệm có ** cookie của bên thứ ba ** bị tắt. –

Trả lời

4

Thêm dòng sau vào từng trang của bạn vào khung:

echo "Session ID: ".session_id();

này nên sản lượng Session ID trên mỗi trang. Có thể một phiên mới có thể được tạo ra trên một trong các khung hình, bằng cách kiểm tra ở trên, bạn có thể loại trừ khả năng này.

+0

OK, tôi đã thêm vào dòng đó, và kết quả làm tôi cảm thấy khó chịu. Session_id là giống nhau, nhưng bằng cách nào đó tập lệnh sẽ thất bại nếu điều kiện if ($ _SESSION). Vì vậy, tôi có mã này: 'if (! $ _ SESSION) {echo" no session "; echo session_id(); } '. Đáng ngạc nhiên là tôi nhận được kết quả sau: "no sessionSession ID: 2c49b03084d3a5112e332e0d53008650" Trong điều kiện bình thường, mã "không có phiên" kích hoạt người dùng quay lại giai đoạn xác thực. Làm thế nào có thể là $ _SESSION var trống nhưng vẫn còn id phiên? –

+1

thử 'if (! Isset ($ _ SESSION))' –

+0

wow, điều đó thật đáng xấu hổ. isset cố định điều kiện. Nhưng tôi vẫn có vấn đề về biến biến mất, bởi vì bây giờ nó không thành điều kiện khác: 'if (($ _SESSION ['AdminLoggedIn']! =" YES ") || ($ _SESSION ['AdminName'] ==" ")) {' –

16

Tôi tin article'll này có ích: http://www.how2guru.com/archives/php-session-problem-while-using-iframe/

Câu trả lời ngắn gọn là: trong iframe, bắt đầu phiên như thế này:

header('P3P: CP="CAO PSA OUR"'); 
session_start(); 

EDIT:

tưởng Tôi nên cập nhật câu trả lời này, vì tôi tình cờ gặp một điều thú vị mà mọi người nên biết.

Tiêu đề p3p hack không hoạt động trên safari.

Dưới đây tôi mô tả luồng đăng nhập của mình và cách tôi giải quyết vấn đề này.

luồng đăng nhập của tôi trông như thế này (ứng dụng trang):

  • kiểm tra nếu người dùng hiện nay có một phiên giao dịch,
  • nếu không, chuyển hướng đến url đăng nhập (được tạo ra bởi PHP SDK),
  • hộp thoại đăng nhập chuyển hướng trở lại url, nơi tôi sử dụng 'mã' tham số GET facebook cung cấp cho tôi, để nhận mã thông báo truy cập, mà tôi có thể lưu trữ để sử dụng sau này. (Lưu vào DB cho phiên.) Nếu tôi làm xong, tôi chuyển hướng người dùng đến ứng dụng trang của tôi, nơi mọi thứ sẽ hoạt động.
  • mọi người sẽ vui vẻ vào thời điểm này.

NHƯNG tại đây có hình ảnh xác thực.

Nếu người dùng sử dụng safari, và cố gắng để mở ứng dụng này khi phiên đã bị phá hủy (. Vài ngày sau cho ex), những điều sau đây sẽ xảy ra:

  • sẽ kiểm tra mã cho một phiên : nó tìm thấy ID người dùng (phương thức getUser() của PHP SDK), vì vậy trước tiên tôi kiểm tra một mục nhập trong cơ sở dữ liệu.
  • Kể từ khi người dùng đăng nhập trước, anh ta có một mục trong cơ sở dữ liệu, vì vậy tôi chỉ lấy nó và lưu nó vào một phiên, để các cuộc gọi AJAX trong tương lai sẽ có tất cả thông tin họ cần.

Điều quan trọng cần lưu ý ở đây là mã này chạy trong tab trang trong iframe.

Vì vậy, đối với hầu hết người dùng, mã sẽ hoạt động vì mục tiêu tiêu đề p3p.

Nhưng đối với người dùng safari thì không.

Safari không quan tâm đến tiêu đề nhất định, từ chối lưu phiên, do đó người dùng đăng nhập vào ứng dụng, mọi thứ có vẻ hoạt động tốt, nhưng cuộc gọi ajax sẽ không hoạt động, vì họ đã thắng t có bất kỳ phiên làm việc với.

Cách giải quyết:

Khá đơn giản thực sự - Mặc dù không phải là quá tao nhã, nhưng hey, nó hoạt động. -: Tôi kiểm tra xem trình duyệt của khách hàng có đang safari hay không, và nếu có, tôi chuyển hướng đến url tùy chỉnh, nơi tôi bắt đầu phiên - bên ngoài khung nội tuyến facebook -, sau đó chuyển hướng quay lại ứng dụng.

Thao tác này sẽ tạo cookie mà không gặp sự cố, do đó các phiên sẽ khả dụng.

Ở đây, có một số mã:

  • Kiểm tra phiên (Credit goes to this guy)

    if (strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') && !strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome')) { 
        if (count($_COOKIE) === 0) { 
        echo '<script> 
        top.location = "http://www.domain.com/setcookie.php"; 
        </script>'; 
        } 
    } 
    
  • thiết lập phiên (setcookie.php)

    header('P3P: CP="CAO PSA OUR"'); 
    session_start(); 
    $_SESSION = array(); 
    
    echo 
    '<script> 
    top.location = "http://back-to-the-facebook-app.com"; 
    </script>'; 
    

Tôi hy vọng mẹo bổ sung này sẽ giúp người khác.

EDIT2

Tôi không thử một này ra chưa, nhưng thay vì thêm header P3P, bạn chỉ có thể thêm những dòng sau vào.htaccess:

<IfModule mod_headers.c> 
    Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" 
</IfModule> 

Với nhận xét:

# ------------------------------------------------------------------------------ 
# | Cookie setting from iframes            | 
# ------------------------------------------------------------------------------ 

# Allow cookies to be set from iframes in IE. 
# http://msdn.microsoft.com/en-us/library/ms537343.aspx 
# http://www.w3.org/TR/2000/CR-P3P-20001215/ 

<IfModule mod_headers.c> 
    Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" 
</IfModule> 

Tất cả tín dụng đi cho điều này .htacces mã cho những kẻ đằng sau dự án Yeoman.

+1

cho nginx trong khối http/server/location thêm add_header P3P 'policyref = "/ w3c/p3p.xml", CP = " IDC DSP COR ADM DEVI TAIi PSA PSD IVAi IVDi CONi CỦA CHÚNG TÔI IND CNT ", CP =" CAO PSA CHÚNG TÔI "; –

+0

Saulius - điều này cũng có tác dụng với safari không? Đối với tôi, nó không giúp đỡ hoặc tôi làm điều gì sai –