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:
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.
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 mã 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
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ã):
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à:
Đ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.
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.
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.
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
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ủ.
<?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