id เซสชัน php มีเอกลักษณ์เพียงใด ฉันได้รับความประทับใจจากสิ่งต่างๆที่ฉันได้อ่านว่าฉันไม่ควรพึ่งพาผู้ใช้สองคนที่ไม่เคยได้รับ sessionid เดียวกัน มันไม่ใช่ GUID เหรอ?
id เซสชัน php มีเอกลักษณ์เพียงใด ฉันได้รับความประทับใจจากสิ่งต่างๆที่ฉันได้อ่านว่าฉันไม่ควรพึ่งพาผู้ใช้สองคนที่ไม่เคยได้รับ sessionid เดียวกัน มันไม่ใช่ GUID เหรอ?
คำตอบ:
Session_id สามารถทำซ้ำได้แน่นอน แต่ความน่าจะเป็นต่ำมาก หากคุณมีเว็บไซต์ที่มีการเข้าชมที่เหมาะสมอาจเกิดขึ้นครั้งเดียวในชีวิตเว็บไซต์ของคุณและจะรบกวนผู้ใช้เพียงคนเดียวในหนึ่งเซสชัน
สิ่งนี้ไม่คุ้มค่าที่จะดูแลเว้นแต่คุณจะคาดหวังว่าจะสร้างเว็บไซต์ที่มีการเข้าชมสูงมากหรือบริการสำหรับอุตสาหกรรมธนาคาร
มันไม่ซ้ำกันมากเมื่อจัดส่ง ในการกำหนดค่าเริ่มต้นเป็นผลมาจากแฮชของสิ่งต่างๆรวมถึงผลของ gettimeofday (ซึ่งไม่ซ้ำกันมากนัก) แต่ถ้าคุณกังวลคุณควรกำหนดค่าให้ดึงเอนโทรปีจาก / dev / urandom เช่นนั้น
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
ค้นหา "php_session_create_id" ในโค้ดสำหรับอัลกอริทึมจริงที่ใช้
แก้ไขเพื่อเพิ่ม: มีตัวสร้างตัวเลขสุ่ม DFA ที่เพาะโดย pid ผสมกับเวลาใน usecs มันไม่ได้เป็นเงื่อนไขที่เป็นเอกลักษณ์ของ บริษัทโดยเฉพาะอย่างยิ่งจากมุมมองของการรักษาความปลอดภัย ใช้การกำหนดค่าเอนโทรปีด้านบน
อัปเดต:
ตั้งแต่ PHP 5.4.0 session.entropy_file ค่าเริ่มต้นเป็น / dev / urandom หรือ / dev / arandom หากมี ใน PHP 5.3.0 คำสั่งนี้ถูกปล่อยให้ว่างเปล่าโดยค่าเริ่มต้น คู่มือ PHP
หากคุณต้องการที่จะทราบวิธี PHP สร้างรหัสเซสชั่นเริ่มต้นด้วยเช็คออกรหัสที่มาบนGithub มันไม่ใช่แบบสุ่มอย่างแน่นอนและขึ้นอยู่กับแฮช (ค่าเริ่มต้น: md5) ของส่วนผสมเหล่านี้ (ดูบรรทัด 310 ของข้อมูลโค้ด):
หากระบบปฏิบัติการมีแหล่งที่มาแบบสุ่มความแข็งแกร่งของ ID ที่สร้างขึ้นเพื่อจุดประสงค์ในการเป็นรหัสเซสชันจะสูง ( / dev / urandom และแหล่งข้อมูลแบบสุ่มของระบบปฏิบัติการอื่น ๆ (โดยปกติ) PRNG ที่ปลอดภัยในการเข้ารหัส ) หากไม่เป็นเช่นนั้นก็เป็นที่น่าพอใจ
เป้าหมายของการสร้างการระบุเซสชันคือ:
สิ่งนี้ทำได้โดยแนวทางของ PHP ในการสร้างเซสชัน
คุณไม่สามารถรับประกันความเป็นเอกลักษณ์ได้อย่างแน่นอนแต่ความน่าจะเป็นนั้นต่ำมากในการกดแฮชเดียวกันสองครั้งซึ่งโดยทั่วไปแล้วไม่ควรกังวล
คุณสามารถติดตั้งฟังก์ชันการสร้างแฮชทางเลือกได้หากคุณต้องการปรับแต่งวิธีสร้าง ID (เป็นหมายเลข 128 บิตที่สร้างผ่าน MD5 ตามค่าเริ่มต้น) ดูhttp://www.php.net/manual/en/session.configuration.php#ini.session.hash-function
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเซสชัน PHP ลองอ่านบทความที่ยอดเยี่ยมนี้http://shiflett.org/articles/the-truth-about-sessionsซึ่งเชื่อมโยงไปยังบทความอื่น ๆ เกี่ยวกับการตรึงเซสชันและการจี้
ขนาดของ session_id
สมมติว่า seeion_id มีการกระจายอย่างสม่ำเสมอและมีขนาด = 128 บิต สมมติว่าทุกคนบนโลกเข้าสู่ระบบวันละครั้งพร้อมกับเซสชั่นใหม่อย่างต่อเนื่องเป็นเวลา 1,000 ปี
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
ดังนั้นความน่าจะเป็นของการชนกันหนึ่งหรือมากกว่านั้นจึงน้อยกว่าหนึ่งใน 70,000 พันล้าน ดังนั้น session_id ขนาด 128 บิตควรใหญ่พอ ดังที่กล่าวไว้ในความคิดเห็นอื่น ๆ session_manager อาจตรวจสอบด้วยว่าไม่มี session_id ใหม่อยู่แล้ว
การสุ่ม
ดังนั้นคำถามใหญ่ที่ฉันคิดคือว่า session_id: s ถูกสร้างขึ้นด้วยการสุ่มหลอกที่ดีหรือไม่ ในสิ่งนั้นคุณไม่สามารถมั่นใจได้ แต่ฉันขอแนะนำให้ใช้โซลูชันมาตรฐานที่รู้จักกันดีและใช้บ่อยเพื่อจุดประสงค์นี้ (อย่างที่คุณอาจทำอยู่แล้ว)
แม้ว่าจะหลีกเลี่ยงการชนกันได้เนื่องจากการตรวจสอบ แต่การสุ่มและขนาดของ session_id ก็มีความสำคัญดังนั้นแฮ็กเกอร์จึงไม่สามารถคาดเดาที่มีคุณสมบัติเหมาะสมและค้นหา session_id: s ที่ใช้งานอยู่ซึ่งมีความเป็นไปได้สูง
ฉันไม่พบการยืนยันในเรื่องนี้ แต่ฉันเชื่อว่า php ตรวจสอบว่ามีรหัสเซสชันอยู่แล้วหรือไม่ก่อนที่จะสร้างด้วยรหัสนั้น
ปัญหาการจี้เซสชันที่ผู้คนกังวลคือเมื่อมีคนพบรหัสเซสชันของผู้ใช้ที่ใช้งานอยู่ สิ่งนี้สามารถป้องกันได้หลายวิธีสำหรับข้อมูลเพิ่มเติมที่คุณสามารถดูหน้านี้ใน php.net และเอกสารนี้เกี่ยวกับการตรึงเซสชัน
ไม่รหัสเซสชันไม่ใช่ GUID แต่ผู้ใช้สองคนไม่ควรได้รับรหัสเซสชันเดียวกันเนื่องจากถูกเก็บไว้ที่ฝั่งเซิร์ฟเวอร์
คุณสามารถเลือกที่จะจัดเก็บเซสชันต่างๆบน DB พร้อมกับ aa DB เพื่อสร้างฟิลด์เฉพาะ รวมทั้งสองและบันทึกในตัวแปรเซสชันจากนั้นตรวจสอบว่าอันนั้นแทนรหัสเซสชัน
<?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>
หากชื่อผู้ใช้ของคุณแตกต่างหรือไม่ซ้ำกันคุณสามารถใช้รหัสนี้สำหรับเซสชัน