Các yêu cầu AJAX có giữ lại thông tin Phiên PHP không?


154

Nếu tôi có một người dùng đăng nhập vào trang web của tôi, có id của anh ta được lưu trữ $_SESSIONvà từ trình duyệt của anh ta, anh ta đã nhấp vào nút 'Lưu' để thực hiện yêu cầu AJAX đến máy chủ. Liệu anh ấy $_SESSIONvà cookie có được giữ lại trong yêu cầu này không và tôi có thể dựa vào id một cách an toàn $_SESSIONkhông?

Câu trả lời:


191

Câu trả lời là có:

Phiên được duy trì phía máy chủ. Đối với máy chủ có liên quan, không có sự khác biệt giữa yêu cầu AJAX và yêu cầu trang thông thường. Chúng đều là các yêu cầu HTTP và cả hai đều chứa thông tin cookie trong tiêu đề theo cùng một cách.

Từ phía khách hàng, các cookie tương tự sẽ luôn được gửi đến máy chủ cho dù đó là yêu cầu thông thường hay yêu cầu AJAX. Mã Javascript không cần phải làm gì đặc biệt hoặc thậm chí để ý điều này xảy ra, nó chỉ hoạt động giống như với các yêu cầu thông thường.


10
Theo dõi: máy chủ có thể đặt HttpOnlycờ khi đặt cookie, điều đó có nghĩa là Javascript của bạn sẽ không thể nhìn thấy cookie. Tuy nhiên, cookie vẫn sẽ được gửi cho cả AJAX và các yêu cầu trang thông thường và tiếp tục hoạt động giống hệt nhau. Javascript của bạn sẽ không nhìn thấy nó trong document.cookie.
thomasrutter

Nếu báo cáo lỗi PHP được bật, bạn có thể nhận được lỗi phiên trả về với phản hồi AJAX. Warning: session_write_close(): Failed to write session data (user)Gần đây tôi đã liên tục gặp lỗi trong một dự án, nhưng chỉ khi yêu cầu AJAX xảy ra trong quá trình tải phần còn lại của trang. Tôi đang sử dụng MySQL DB cho dữ liệu phiên và có thể yêu cầu trang chính đang khóa bảng đó, ngăn yêu cầu AJAX truy cập vào nó.
Butussy Butkus

@BriptButkus có vẻ như là một vấn đề trong mã phía máy chủ của bạn và tôi chắc chắn mọi người sẽ sẵn sàng giúp đỡ nếu bạn gửi câu hỏi đó như câu hỏi của riêng mình. Bạn không nên gặp lỗi đó chỉ vì bạn đang sử dụng MySQL cho các phiên vì nó không bị khóa theo cách có thể xảy ra lỗi. Nó có thể là một vấn đề với các kết nối MySQL đang bão hòa, hoặc một số vấn đề không liên quan khác.
thomasrutter

Điều đó đang xảy ra trên một máy mơ hồ nên các kết nối MySQL phải được bão hòa. Tôi chắc chắn sẽ gửi một câu hỏi nếu tôi không thể tìm ra nó sớm.
Butussy Butkus

23

Nếu tệp PHP, các yêu cầu AJAX có session_start()thông tin phiên sẽ được giữ lại. (chặn các yêu cầu trong cùng một miền)


2
thực vậy, đó là những gì tôi quên làm :-)
sivann

23

Những gì bạn thực sự nhận được là: các cookie được gửi đến với yêu cầu AJAX? Giả sử yêu cầu AJAX là vào cùng một tên miền (hoặc trong các ràng buộc miền của cookie), câu trả lời là có. Vì vậy, các yêu cầu AJAX trở lại cùng một máy chủ sẽ giữ lại thông tin phiên giống nhau (giả sử các tập lệnh được gọi phát hành session_start () theo bất kỳ tập lệnh PHP nào khác muốn truy cập vào thông tin phiên).


1
Tôi có thể sai, nhưng tôi nghĩ thậm chí không thể gửi yêu cầu ajax đến các tên miền khác (tên miền phụ bị loại trừ)?
Emil H

Bạn có thể gian lận với thủ thuật kịch bản động. Không bao giờ mệt mỏi mặc dù.
cletus

1
Có, yêu cầu ajax không thể được thực hiện cho các tên miền khác. Tuy nhiên, bạn có thể tự động chèn thẻ <script> vào trang và đặt src của nó thành một url ngoài tên miền tạo ra javascript.
Nhấp vào Upvote

1
yêu cầu ajax không thể được thực hiện cho các tên miền khác. nhưng bạn có thể tạo một proxy trong mã php của bạn. ajax yêu cầu proxy, yêu cầu proxy đến tên miền khác.
Peter Long

2
Chỉ cần một lưu ý ... yêu cầu ajax có thể được tạo thành tên miền chéo, nhưng chỉ khi loại phản hồi là jsonp. Tôi làm điều này tất cả các thời gian.
Epiphany

8

Vâng, không phải lúc nào. Sử dụng cookie, bạn là tốt. Nhưng "tôi có thể dựa vào id một cách an toàn không" thúc giục tôi mở rộng cuộc thảo luận với một điểm quan trọng (chủ yếu để tham khảo, vì số lượng khách truy cập của trang này có vẻ khá cao).

PHP có thể được cấu hình để duy trì các phiên bằng cách viết lại URL, thay vì cookie. ( Làm thế nào tốt hay xấu (<- xem ví dụ bình luận cao nhất ở đó) là một câu hỏi riêng biệt , bây giờ hãy bám sát câu hỏi hiện tại, chỉ với một lưu ý phụ: vấn đề nổi bật nhất với các phiên dựa trên URL - vấn đề trắng trợn khả năng hiển thị của ID phiên trần - không phải là vấn đề với các cuộc gọi Ajax nội bộ, nhưng sau đó, nếu nó được bật cho Ajax, thì nó cũng được bật cho phần còn lại của trang web, vì vậy ...)

Trong trường hợp các phiên viết lại URL (không nấu ăn), các lệnh gọi Ajax phải tự chăm sóc nó rằng các URL yêu cầu của chúng được tạo đúng. (Hoặc bạn có thể cuộn giải pháp tùy chỉnh của riêng bạn Bạn thậm chí có thể nghỉ mát để duy trì phiên. Về phía khách hàng , trong trường hợp ít đòi hỏi.) Vấn đề là các dịch vụ chăm sóc rõ ràng cần thiết cho phiên liên tục, nếu không sử dụng cookie:

  1. Nếu các cuộc gọi Ajax chỉ trích xuất các URL nguyên văn từ HTML (như đã nhận được từ PHP), thì điều đó sẽ ổn, vì chúng đã được nấu chín (umm, đã nấu chín).

  2. Nếu họ cần tự lắp ráp các URI yêu cầu, ID phiên cần được thêm vào URL theo cách thủ công. (Kiểm tra tại đây hoặc các nguồn trang được tạo bởi PHP ( có viết lại URL ) để xem cách thực hiện.)


Từ OWASP.org :

Thực tế, ứng dụng web có thể sử dụng cả cơ chế, cookie hoặc tham số URL hoặc thậm chí chuyển từ cái này sang cái khác (viết lại URL tự động) nếu đáp ứng một số điều kiện (ví dụ: sự tồn tại của máy khách web không hỗ trợ cookie hoặc khi không có cookie được chấp nhận do những lo ngại về quyền riêng tư của người dùng).

Từ một bài đăng trên diễn đàn Ruby :

Khi sử dụng php với cookie, ID phiên sẽ tự động được gửi trong các tiêu đề yêu cầu ngay cả đối với Ajax XMLHttpRequests. Nếu bạn sử dụng hoặc cho phép các phiên php dựa trên URL, bạn sẽ phải thêm id phiên vào mỗi url yêu cầu Ajax.


Bất kỳ số liệu thống kê đáng tin cậy về bao nhiêu người đã tắt cookie phiên ? (Tôi không thể tìm thấy bất kỳ. Chỉ trên Javascript: có vẻ như khoảng 2% ở Mỹ / Châu Âu và ~ 1,2% trên thế giới.)
Sz.

ID phiên trên URL là một thực tiễn lỗi thời, không an toàn . Trên trang web ngày nay, không ai nên cho rằng họ có thể lướt web với cookie bị vô hiệu hóa và vẫn đăng nhập vào các trang web nơi họ giữ tài khoản. Nếu một trong những khách truy cập của bạn bị vô hiệu hóa cookie, có thể an toàn khi cho rằng một) họ đặc biệt không muốn đăng nhập trên bất kỳ trang web nào vì lý do riêng tư; hoặc b) họ đã vô tình làm điều đó và bây giờ họ không thể đăng nhập vào bất kỳ trang web nào , không chỉ của bạn.
thomasrutter

3

Điều rất quan trọng là các yêu cầu AJAX giữ lại phiên. Ví dụ đơn giản nhất là khi bạn cố gắng thực hiện một yêu cầu AJAX cho bảng quản trị, giả sử. Tất nhiên, bạn sẽ bảo vệ trang mà bạn yêu cầu, không thể truy cập bởi những người khác không có phiên bạn nhận được sau khi đăng nhập của quản trị viên. Có ý nghĩa?


0

Mặc dù vậy, một điều cần chú ý, đặc biệt nếu bạn đang sử dụng khung, là kiểm tra xem ứng dụng có đang tạo lại id phiên giữa các yêu cầu hay không - mọi thứ phụ thuộc rõ ràng vào id phiên sẽ gặp sự cố, mặc dù rõ ràng phần còn lại của dữ liệu trong phiên sẽ không bị ảnh hưởng.

Nếu ứng dụng đang tạo lại id phiên như thế này thì bạn có thể gặp phải tình huống yêu cầu ajax có hiệu lực / thay thế id phiên trong trang yêu cầu.


0

Đó là những gì các khung làm, ví dụ: nếu bạn khởi tạo phiên trong Bộ điều khiển phía trước hoặc tập lệnh boostrap, bạn sẽ không phải quan tâm đến việc nó được kích hoạt cho bộ điều khiển trang hoặc bộ điều khiển ajax. Các khung công tác PHP không phải là thuốc chữa bách bệnh, nhưng chúng làm rất nhiều thứ hữu ích như thế này!


0

đặt phiên () auth của bạn trong tất cả các trang phía máy chủ chấp nhận yêu cầu ajax:

if(require_once("auth.php")) {

//run json code

}

// do nothing otherwise

đó là cách duy nhất tôi từng làm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.