Id phiên php độc đáo như thế nào


90

Id phiên php độc đáo như thế nào? Tôi có ấn tượng từ nhiều điều mà tôi đã đọc rằng tôi không nên dựa vào hai người dùng không bao giờ nhận được cùng một sessionid. Nó không phải là một HƯỚNG DẪN?

Câu trả lời:


39

Session_id thực sự có thể bị trùng lặp, nhưng xác suất là rất thấp. Nếu bạn có một trang web với lưu lượng truy cập hợp lý, nó có thể xảy ra một lần trong đời trang web của bạn và sẽ chỉ làm phiền một người dùng trong một phiên.

Điều này không đáng để quan tâm trừ khi bạn mong đợi xây dựng một trang web có lượng truy cập rất cao hoặc một dịch vụ cho ngành ngân hàng.


4
Tôi đã nghe báo cáo về các trang web đã có nhiều trường hợp va chạm.
ColinM

20
Câu hỏi đã được đặt ra gần 4 năm trước. Nó sẽ là thú vị để biết nếu thuật toán phiên id đã ứng khẩu kể từ đó ...
Sliq

@ColinM: và những trang web đó có 1 triệu người truy cập / ngày.
e-thoả mãn

1
Aparantly hiện đang dựa trên (băm MD5 / SHA1) trên địa chỉ từ xa của người dùng, giờ địa phương và một số ngẫu nhiên (LCG) .
Caramiriel

2
Tôi không cần phá vỡ di động, di động liên tục tự phá vỡ. :)
hakre

67

Nó không phải là rất độc đáo như đã xuất xưởng. Trong cấu hình mặc định, nó là kết quả của một hàm băm của nhiều thứ khác nhau bao gồm cả kết quả của gettimeofday (không phải là quá độc đáo), nhưng nếu lo lắng, bạn nên định cấu hình nó để vẽ một số entropy từ / dev / urandom, như vậy

ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");

tìm kiếm "php_session_create_id" trong cho thuật toán thực mà họ đang sử dụng.

Đã chỉnh sửa để thêm: Có một trình tạo số ngẫu nhiên DFA được pid gieo vào, trộn với thời gian tính bằng usec. Nó không phải là một điều kiện duy nhất chắc chắn, đặc biệt là từ góc độ bảo mật . Sử dụng cấu hình entropy ở trên.

Cập nhật:

Kể từ PHP 5.4.0 session.entropy_file mặc định là / dev / urandom hoặc / dev / arandom nếu có sẵn. Trong PHP 5.3.0, chỉ thị này được để trống theo mặc định. Hướng dẫn sử dụng PHP


1
Đúng vậy, khi tôi ký hợp đồng cho một trang web phải cực kỳ an toàn trước các chiến binh của kẻ thù và như vậy, tôi thực sự đã tạo trình xử lý phiên của riêng mình và cung cấp dữ liệu entropy trực tiếp từ random.org. Nhưng yêu cầu của hệ thống đó vượt xa những gì mà hầu hết những người phàm trần thường đối phó w / ;-)
Theodore R. Smith

1
@ thomas-jensen, gettimeofday dấu thời gian unix, ngoại trừ nó được biểu thị bằng μsec (đôi khi). Đọc phương thức php_session_create_id được liên kết ở trên.
djsadinoff

4
Thay đổi độ dài entropy cải thiện tính ngẫu nhiên nhưng không ảnh hưởng đáng kể đến khả năng xảy ra va chạm vì hàm băm vẫn có cùng độ dài. Tuy nhiên, thay đổi session.hash_ Chức năng cho phép bạn sử dụng các hàm băm dài hơn như sha512 chẳng hạn.
ColinM

2
Tôi thấy thật kỳ lạ khi có những va chạm. Chắc chắn PHP nên được thực hiện để kiểm tra xem có phiên hợp lệ nào theo id đó và sau đó tạo một ID khác ..
Luke

1
@ theodore-r-smith, thực sự không tốt khi lấy entropy từ một nguồn công khai. Bạn nên cho rằng "Các chiến binh của kẻ thù" của bạn cũng có quyền truy cập vào random.org ...
avri 26/10/15

12

Nếu bạn muốn biết cách PHP tạo ID phiên theo mặc định, hãy xem mã nguồn trên Github . Nó chắc chắn không phải là ngẫu nhiên và dựa trên hàm băm (mặc định: md5) của các thành phần này (xem dòng 310 của đoạn mã):

  1. Địa chỉ IP của máy khách
  2. Thời điểm hiện tại
  3. PHP Linear Congruence Generator - một trình tạo số ngẫu nhiên giả (PRNG)
  4. Nguồn ngẫu nhiên dành riêng cho hệ điều hành - nếu hệ điều hành có sẵn nguồn ngẫu nhiên (ví dụ: / dev / urandom)

Nếu hệ điều hành có sẵn một nguồn ngẫu nhiên thì độ mạnh của ID được tạo cho mục đích là ID phiên sẽ cao ( / dev / urandom và các nguồn ngẫu nhiên của hệ điều hành khác là (thường) là PRNG an toàn bằng mật mã ). Tuy nhiên, nếu nó không đạt yêu cầu.

Mục tiêu của việc tạo nhận dạng phiên là:

  1. giảm thiểu xác suất tạo hai ID phiên có cùng giá trị
  2. làm cho nó rất khó về mặt tính toán để tạo ra các khóa ngẫu nhiên và nhấn một khóa đang sử dụng .

Điều này đạt được nhờ phương pháp tạo phiên của PHP.

Bạn không thể hoàn toàn đảm bảo tính duy nhất , nhưng xác suất đánh cùng một băm hai lần là rất thấp nên nói chung là không đáng lo ngại.


11

Bạn có thể cài đặt chức năng tạo băm thay thế nếu muốn tùy chỉnh cách tạo ID (theo mặc định, đó là số 128 bit được tạo qua MD5). Xem http://www.php.net/manual/en/session.configuration.php#ini.session.hash- Chức năng

Để biết thêm thông tin về các phiên PHP, hãy thử bài viết tuyệt vời này http://shiflett.org/articles/the-truth-about-sessions, bài viết này cũng liên kết đến các bài viết khác về khắc phục phiên và chiếm quyền điều khiển.


2
Nói chính xác, hãy đặt "session.hash_ Chức năng = sha512" cho PHP 5.3 trở lên để chuyển sang băm 512bit. Cái này cần phải dùng mẹo. Với giá trị mặc định, việc xảy ra va chạm là phổ biến trên các trang web có lưu lượng truy cập cao.
ColinM

5

Kích thước của session_id
Giả sử rằng seeion_id được phân phối đồng đều và có kích thước = 128 bit. Giả sử rằng mỗi người trên hành tinh đăng nhập mỗi ngày một lần với một phiên mới liên tục trong 1000 năm.

num_sesion_ids  = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36)   1 - e**-(1/2**46) 
                 1/2**46 

Vì vậy, xác suất của một hoặc nhiều vụ va chạm nhỏ hơn một trong 70 nghìn tỷ. Do đó, kích thước 128-bit của session_id phải đủ lớn. Như đã đề cập trong các nhận xét khác, session_manager cũng có thể kiểm tra xem session_id mới chưa tồn tại.

Tính ngẫu nhiên
Do đó câu hỏi lớn mà tôi nghĩ là liệu session_id: s có được tạo với độ ngẫu nhiên giả tốt hay không. Về điều đó bạn không bao giờ có thể chắc chắn, nhưng tôi khuyên bạn nên sử dụng một giải pháp tiêu chuẩn nổi tiếng và được sử dụng thường xuyên cho mục đích này (như bạn có thể đã làm).

Ngay cả khi tránh được va chạm do kiểm tra, tính ngẫu nhiên và kích thước của session_id là rất quan trọng, do đó, tin tặc không thể, bằng cách nào đó có thể đoán đủ điều kiện và tìm thấy session_id: s đang hoạt động với xác suất lớn.


3
Tôi không phải là nhà toán học, nhưng tôi nghĩ bạn đang quên bài toán Sinh nhật nên khả năng va chạm trong khi vẫn còn nhỏ sẽ lớn hơn nhiều so với bạn đề xuất. Ngoài ra, như djsadinoff đã đề xuất, PHP không nhất thiết phải sử dụng một phương pháp tốt để tạo số ngẫu nhiên theo mặc định.
ColinM

Không có ước tính thực sự giữ. Tính toán trên là một ước tính đơn giản hóa, trong đó chúng tôi ước tính rằng xác suất xảy ra xung đột cho session_id nr i, là = 1/2 82 (nó phải là 1/2 92 ở trên mặc dù = lỗi đánh máy). Trong thực tế, xác suất là (i-1) / 2 128 miễn là không có va chạm nào xảy ra trước đó. 1/2 92 chỉ giữ cho session_id cuối cùng.
MrJ

3

Tôi chưa tìm thấy xác nhận về điều này nhưng tôi tin rằng php sẽ kiểm tra xem id phiên đã tồn tại chưa trước khi tạo một id với id đó.

Vấn đề chiếm quyền điều khiển phiên mà mọi người lo lắng là khi ai đó phát hiện ra id phiên của một người dùng đang hoạt động. Điều này có thể được ngăn chặn bằng nhiều cách, để biết thêm thông tin, bạn có thể xem trang này trên php.net và bài báo này về sửa phiên


2
... nhưng nếu bạn chỉ là một máy chủ php trong một số ngân hàng, không có gì đảm bảo rằng máy chủ có đủ kiến ​​thức để biết liệu sesssionID đã được sử dụng chưa.
djsadinoff 26/09/08

Tại sao lại có vấn đề nếu tôi có cùng một id phiên trong 2 máy chủ php khác nhau? Giả sử 2 miền khác nhau, cookie phiên chỉ có thể truy cập được từ mỗi miền ...?
dámmon

3
Cách dễ nhất để ngăn chặn việc lừa đảo trên môi trường nhiều máy chủ là lưu trữ các phiên trong bộ nhớ đệm thông qua trình xử lý phiên bộ đệm ẩn. vấn đề đã được giải quyết và người dùng của bạn có thể trả lại các máy chủ khác nhau nếu không làm mất nội dung của họ.
Theodore R. Smith

@daremon, anh ấy đang nói về nhiều máy chủ cho một miền.
gtd

Điều này chỉ đơn giản là không chính xác. PHP không kiểm tra id phiên hiện có khi tạo id phiên mới. Nhìn vào bất kỳ mã xử lý phiên PHP nào và đơn giản là không có phương pháp nào được thực hiện cho mục đích này.
ColinM

2

Không, id phiên không phải là GUID, nhưng hai người dùng không được nhận cùng một id phiên vì chúng được lưu trữ ở phía máy chủ.


2
Có thể do bộ nhớ phía máy chủ không đảm bảo tính duy nhất theo bất kỳ cách nào. Tính duy nhất là một chuyện - nếu có xung đột, nó sẽ xung đột bất kể nơi lưu trữ phiên.

Không phải bởi tôi, tôi đánh giá cao phản hồi của bạn (cũng như những người khác). - Jalov
Jalov

2
ID phiên được lưu trữ ở cả phía máy chủ và máy khách. Nội dung phiên được lưu trữ ở phía máy chủ. Và thực tế là không liên quan nhiều đến tính duy nhất của id phiên.
YudhiWidyatama

-3
<?php
session_start();
$_SESSION['username']="username";
?>

<!DOCTYPE html>
<html>
<head>
    <title>Update</title>
</head>
<body>

<table border="2">
    <tr>
        <th>Username</th>
        <th>Email</th>
        <th>Edit</th>
    </tr>
<?php
     $conn=mysqli_connect("localhost","root","","telephasic");
     $q2="select * from register where username = '".$_SESSION['username']."'";
     $run=mysqli_query($conn, $q2);
     while($row=mysqli_fetch_array($run))
     {
         $name=$row[1];
         $email=$row[2];
     ?>

    <tr>
        <td><?php echo $name; ?></td>
        <td><?php echo $email; ?></td>
        <td><a href="edit.php"> Edit </a></td>
    </tr>
 <?php } ?>
 </table> 
 </body>

nếu tên người dùng của bạn khác hoặc duy nhất, bạn có thể sử dụng mã này cho phiên

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.