2010-09-18 34 views
47

Có cách nào để tôi có thể bắt đầu một phiên liên tục trong PHP mà không cần sắp xếp cookie phiên không? Có cách nào khác để duy trì phiên trên các trang, chẳng hạn như giải pháp dựa trên địa chỉ IP không?Phiên PHP không có cookie

Lý do tôi hỏi là mặc dù hầu hết người dùng có cookie, tôi muốn xem liệu có cách nào để hệ thống đăng nhập hoạt động cho những người bị vô hiệu hóa không (mặc dù tôi cho rằng vô hiệu hóa cookie chỉ là hoang tưởng không cần thiết, cá nhân).

Trả lời

50

Tôi không nghĩ rằng nó quá nhiều để yêu cầu người dùng để bật cookie. Tôi thấy nó ngớ ngẩn khi mọi người tắt chúng hoàn toàn.

Nếu không, bạn có thể đặt session.use_only_cookies thành "0" để buộc phần phụ của ID phiên vào URL trong php của bạn. Cách tiếp cận này, tuy nhiên, có một số rút lại. Chủ yếu là giữ trạng thái trong URL, trái ngược với tiêu đề Cookie. Nếu người dùng đã sao chép và dán URL của trang họ đang truy cập và một người khác nhấp vào đó, cả hai đều sẽ sử dụng cùng một phiên.

<?php 
    ini_set("session.use_cookies", 0); 
    ini_set("session.use_only_cookies", 0); 
    ini_set("session.use_trans_sid", 1); 
    ini_set("session.cache_limiter", ""); 
    session_start(); 
+1

Tôi tin rằng OP muốn 'session.use_cookies' được đặt thành 1 –

+4

Và cần lưu ý rằng các cài đặt này không thay đổi các siêu liên kết JS và các tiêu đề Vị trí trong mã PHP. –

+0

Thật vậy, ai vẫn duyệt cookie trong năm 2010? Trong khi nó vẫn còn có thể, tôi nghi ngờ bất cứ ai vẫn làm điều này; và do đó câu hỏi là khá học tập. (Ngay cả những con nhện có thể có cookies bây giờ) – Piskvor

3

Bạn có thể làm việc với các ID phiên trong URL, và vô hiệu hóa các cookie với:

ini_set('session.use_cookies', 0); 
ini_set('session.use_only_cookies', 0); 
ini_set('session.use_trans_sid', 1); 
session_start(); 
// IP check 
if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){ 
    session_regenerate_id(); 
    session_destroy(); 
    session_start(); 
} 
$_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR']; 
// session stuff 

Lưu ý: nó cao discougared sử dụng session IDs trong URL. Địa chỉ IP có thể thay đổi khi di chuyển xung quanh bằng thẻ không dây và máy chủ proxy có cùng địa chỉ IP. Nó dễ dàng bị hỏng khi nhấp vào 'URL cũ' (với ID phiên cũ).

Bạn cũng có thể quan tâm đến việc tạo chức năng xử lý phiên của riêng bạn (trong kết hợp với cơ sở dữ liệu). Bạn sẽ bỏ qua ID phiên và liên kết nó với địa chỉ IP. (Xem ví dụ trong http://php.net/manual/en/function.session-set-save-handler.php)

Tài liệu tham khảo:

+5

Việc liên kết với địa chỉ IP có vẻ không tốt. Một số người dùng (doanh nghiệp?) Có thể nằm sau proxy, nơi nhiều người dùng có thể có cùng địa chỉ IP. – Leander

+3

@Leander Wooord! Điều này có thể dẫn đến các tình huống rất xấu, nơi toàn bộ công ty/gia đình/sinh viên sống phức tạp có quyền truy cập vào tài khoản của người dùng của bạn. – Sliq

+1

Tại Đức, ISP lớn nhất (Telekom) thậm chí còn có một proxy riêng mà nhiều người sử dụng. Vì vậy, trong trường hợp xấu nhất, một ISP mạng lỗ sẽ sử dụng một tài khoản. Điều này thực sự gây phiền nhiễu vì nó làm cho nó gần như không thể cấm địa chỉ IP nếu bạn không muốn dựa vào tiêu đề X-HTTP-Forwarded-For. – Gellweiler

4

Bạn có thể đặt giá trị ini là session.use_trans_sid thành true để kích hoạt thêm id phiên cho mỗi URL. Hãy xem this.

Vì mục đích bảo mật, bạn nên giới hạn phiên đó với IP đã tạo phiên. Tuy nhiên, điều này không hoàn toàn an toàn vì người nào đó có cùng IP (phía sau proxy) có thể sử dụng lại cùng một phiên.

1

Bạn có thể lưu id phiên mỗi IP trong cơ sở dữ liệu:

Tạo một bảng mysql với ba lĩnh vực: session_id, ip và chìa khóa tạm thời duy nhất (cho người dùng đăng nhập) hoặc bất kỳ điều kiện khác mà bạn thích. Sau đó tắt cookie phiên và use_trans_sid.

sau đó tạo mã để quản lý hành vi phiên dựa trên bảng mới này!

sau session_start() tiết kiệm SESSION_ID trong bảng và sau đó nhận được nó từ bảng (theo IP và bất kỳ điều kiện khác) và sau đó gọi

session_id($in_table_session_id); 

để biết thêm thông tin và đầy đủ hướng dẫn xem: https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe

+0

Một lần nữa, điều này là ràng buộc bởi IP và không hoàn toàn hiệu quả, đặc biệt là đối với phạm vi mà nhiều người dùng chia sẻ cùng một IP (ví dụ: đại học, công ty hoặc org proxys, v.v ...) –

0

Bạn có thể tạo một bản ghi cơ sở dữ liệu hoặc tệp tạm thời và kiểm tra $_SERVER vars chống lại yêu cầu trên mỗi lần tải trang. Đó là một nguy cơ bảo mật, nhưng với đủ biến (có một cái nhìn tại danh sách here), bạn có thể cảm thấy bạn đã có cơ hội chiếm quyền điều khiển xuống mức chấp nhận được; chỉ bạn mới biết mức độ an toàn của ứng dụng của bạn.

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