3 วิธีในการสร้างระบบจัดการเซสชันที่ปลอดภัยใน PHP และ MySQL

สารบัญ:

3 วิธีในการสร้างระบบจัดการเซสชันที่ปลอดภัยใน PHP และ MySQL
3 วิธีในการสร้างระบบจัดการเซสชันที่ปลอดภัยใน PHP และ MySQL

วีดีโอ: 3 วิธีในการสร้างระบบจัดการเซสชันที่ปลอดภัยใน PHP และ MySQL

วีดีโอ: 3 วิธีในการสร้างระบบจัดการเซสชันที่ปลอดภัยใน PHP และ MySQL
วีดีโอ: อยากเริ่มต้นเรียนเขียนโปรแกรม แต่ไม่รู้จะเริ่มยังไง มาดูคลิปนี้ครับ 👨‍💻💯 2024, เมษายน
Anonim

คู่มือนี้จะแสดงวิธีจัดเก็บเซสชันของคุณอย่างปลอดภัยในฐานข้อมูล mySQL นอกจากนี้ เราจะเข้ารหัสข้อมูลเซสชันทั้งหมดที่เข้าสู่ฐานข้อมูล ซึ่งหมายความว่าหากมีใครแฮ็คเข้าสู่ฐานข้อมูล ข้อมูลเซสชันทั้งหมดจะถูกเข้ารหัสด้วยการเข้ารหัส AES 256 บิต

ขั้นตอน

วิธีที่ 1 จาก 3: กำหนดค่าฐานข้อมูล mySQL

2238751 1
2238751 1

ขั้นตอนที่ 1 สร้างฐานข้อมูล MySQL

ในคู่มือนี้ เราจะสร้างฐานข้อมูลที่เรียกว่า "secure_sessions"

ดูวิธีการ Create-a-Database-in-phpMyAdmin

หรือคุณสามารถใช้โค้ด SQL ด้านล่างเพื่อสร้างโค้ดให้คุณ

สร้างรหัสฐานข้อมูล:

สร้างฐานข้อมูล `secure_sessions`;

หมายเหตุ: บริการโฮสติ้งบางอย่างไม่อนุญาตให้คุณสร้างฐานข้อมูลผ่าน phpMyAdmin เรียนรู้วิธีดำเนินการใน cPanel

2238751 2
2238751 2

ขั้นตอนที่ 2 สร้างผู้ใช้ที่มีสิทธิ์ SELECT, INSERT และ DELETE เท่านั้น

ซึ่งหมายความว่าหากมีการละเมิดความปลอดภัยในสคริปต์ของเรา แฮ็กเกอร์จะไม่สามารถวางตารางจากฐานข้อมูลของเราได้ หากคุณเป็นคนหวาดระแวงจริงๆ ให้สร้างผู้ใช้ที่แตกต่างกันสำหรับแต่ละฟังก์ชัน

  • ผู้ใช้:

    "sec_user"

  • รหัสผ่าน:

    "eKcGZr59zAa2BEWU"

สร้างรหัสผู้ใช้:

สร้างผู้ใช้ 'sec_user'@'localhost' ระบุโดย 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* ถึง 'sec_user'@'localhost';

หมายเหตุ: เป็นความคิดที่ดีที่จะเปลี่ยนรหัสผ่านในโค้ดด้านบนเมื่อใช้งานบนเซิร์ฟเวอร์ของคุณเอง (ตรวจสอบให้แน่ใจว่าคุณได้เปลี่ยนโค้ด PHP ของคุณด้วย) จำไว้ว่าคุณไม่จำเป็นต้องเป็นรหัสผ่านที่คุณจำได้ ดังนั้นจงสร้างให้ซับซ้อนที่สุดเท่าที่จะทำได้ นี่คือตัวสร้างรหัสผ่านแบบสุ่ม

2238751 3
2238751 3

ขั้นตอนที่ 3 สร้างตาราง MySQL ชื่อ "เซสชัน"

รหัสด้านล่างสร้างตารางที่มี 4 ฟิลด์ (id, set_time, data, session_key)

สร้างตาราง "เซสชัน":

สร้างตาราง `เซสชัน' (`id` ถ่าน (128) ไม่ใช่ NULL, `set_time` ถ่าน (10) ไม่ใช่ NULL, `ข้อความ' ไม่เป็นค่าว่าง, `session_key` ถ่าน (128) ไม่ใช่ค่าว่าง, คีย์หลัก (`id`)) ENGINE=InnoDB ค่าเริ่มต้น CHARSET=latin1;

เราใช้ประเภทข้อมูล CHAR สำหรับฟิลด์ที่เราทราบความยาว เนื่องจากฟิลด์ "id" และ "session_key" จะมีความยาว 128 อักขระเสมอ การใช้ CHAR ที่นี่ช่วยประหยัดพลังงานในการประมวลผล

วิธีที่ 2 จาก 3: สร้างไฟล์ session.class.php

2238751 4
2238751 4

ขั้นตอนที่ 1 สร้างชั้นเรียน

ในการเริ่มชั้นเรียนใหม่ คุณจะต้องป้อนรหัสด้านล่าง:

คลาสใหม่:

เซสชั่นชั้นเรียน {

2238751 5
2238751 5

ขั้นตอนที่ 2 สร้างฟังก์ชัน _construct

ฟังก์ชันนี้จะถูกเรียกทุกครั้งที่เราสร้างอินสแตนซ์ใหม่ของวัตถุโดยใช้คลาส 'เซสชัน' คุณสามารถอ่านฟังก์ชัน PHP _construct ได้ที่นี่

ฟังก์ชันนี้ตั้งค่าตัวจัดการเซสชันที่กำหนดเองเพื่อให้พร้อมใช้งานทันทีที่คลาสสร้างอินสแตนซ์ (เช่น สร้าง/สร้าง/สร้าง)

_สร้างฟังก์ชัน:

ฟังก์ชั่น _construct () { // ตั้งค่าฟังก์ชันเซสชันที่กำหนดเองของเรา session_set_save_handler(array($this, 'open'), array($this, 'close'), array($this, 'read'), array($this, 'write'), array($this, 'destroy'), array($this, 'gc')); // บรรทัดนี้ป้องกันผลกระทบที่ไม่คาดคิดเมื่อใช้วัตถุเป็นตัวจัดการบันทึก register_shutdown_function('session_write_close'); }

2238751 6
2238751 6

ขั้นตอนที่ 3 สร้างฟังก์ชัน start_session

ฟังก์ชันนี้จะถูกเรียกทุกครั้งที่คุณต้องการเริ่มเซสชันใหม่ ใช้แทน session_start(); ดูความคิดเห็นในโค้ดเพื่อดูว่าแต่ละบรรทัดทำอะไร

ฟังก์ชัน start_session:

function start_session($session_name, $secure) { // ตรวจสอบให้แน่ใจว่าไม่สามารถเข้าถึงคุกกี้ของเซสชันผ่าน javascript $httponly = จริง; // อัลกอริทึมแฮชที่จะใช้สำหรับเซสชัน (ใช้ hash_algos() เพื่อดูรายการ hash ที่มีอยู่) $session_hash = 'sha512'; // ตรวจสอบว่ามีแฮชหรือไม่ (in_array($session_hash, hash_algos())) { // ตั้งค่าฟังก์ชัน has ini_set('session.hash_function', $session_hash); } // จำนวนบิตต่ออักขระของแฮช // ค่าที่เป็นไปได้คือ '4' (0-9, a-f), '5' (0-9, a-v) และ '6' (0-9, a-z, A-Z, "-", ", ") ini_set('session.hash_bits_per_character', 5); // บังคับให้เซสชันใช้เฉพาะคุกกี้ ไม่ใช่ตัวแปร URL ini_set('session.use_only_cookies', 1); // รับพารามิเตอร์คุกกี้เซสชัน $cookieParams = session_get_cookie_params(); // ตั้งค่าพารามิเตอร์ session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); // เปลี่ยนชื่อเซสชัน session_name($session_name); // ตอนนี้เรา cat เริ่มเซสชัน session_start(); // บรรทัดนี้สร้างเซสชันใหม่และลบเซสชันเก่า // มันยังสร้างคีย์เข้ารหัสใหม่ในฐานข้อมูล session_regenerate_id(จริง); }

2238751 7
2238751 7

ขั้นตอนที่ 4 สร้างฟังก์ชันเปิด

ฟังก์ชันนี้จะถูกเรียกใช้โดยเซสชัน PHP เมื่อเราเริ่มเซสชันใหม่ เราใช้เพื่อเริ่มการเชื่อมต่อฐานข้อมูลใหม่

ฟังก์ชั่นเปิด:

ฟังก์ชั่น open() { $host = 'localhost'; $user = 'sec_user'; $pass = 'eKcGZr59zAa2BEWU'; $name = 'secure_sessions'; $mysqli = mysqli ใหม่($host, $user, $pass, $name); $this->db = $mysqli; คืนค่าจริง; }

2238751 8
2238751 8

ขั้นตอนที่ 5. สร้างฟังก์ชันปิด

ฟังก์ชันนี้จะถูกเรียกเมื่อต้องการปิดเซสชัน

ฟังก์ชั่นปิด:

ฟังก์ชัน close() { $this->db->close(); คืนค่าจริง; }

2238751 9
2238751 9

ขั้นตอนที่ 6 สร้างฟังก์ชันการอ่าน

ฟังก์ชันนี้จะถูกเรียกใช้โดย PHP เมื่อเราพยายามเข้าถึงเซสชัน เช่น เมื่อเราใช้ echo $_SESSION['something']; เนื่องจากอาจมีการเรียกใช้ฟังก์ชันนี้หลายครั้งในหน้าเดียว เราจึงใช้ประโยชน์จากคำสั่งที่เตรียมไว้ ไม่เพียงแต่เพื่อความปลอดภัยแต่สำหรับประสิทธิภาพด้วย เราเตรียมคำสั่งเพียงครั้งเดียวจากนั้นเราสามารถดำเนินการได้หลายครั้ง

เรายังถอดรหัสข้อมูลเซสชันที่เข้ารหัสในฐานข้อมูล เราใช้การเข้ารหัส AES 256 บิตในเซสชันของเรา

ฟังก์ชั่นอ่าน:

ฟังก์ชั่น read($id) { if(!isset($this->read_stmt)) { $this->read_stmt = $this->db->prepare("SELECT data from sessions WHERE id = ? LIMIT 1"); } $this->read_stmt->bind_param('s', $id); $this->read_stmt->execute(); $this->read_stmt->store_result(); $นี้->read_stmt->bind_result($data); $this->read_stmt->ดึงข้อมูล(); $key = $this->getkey($id); $data = $this->ถอดรหัส($data, $key); ส่งคืนข้อมูล $; }

2238751 10
2238751 10

ขั้นตอนที่ 7 สร้างฟังก์ชันการเขียน

ฟังก์ชันนี้ใช้เมื่อเรากำหนดค่าให้กับเซสชัน เช่น $_SESSION['something'] = 'something else'; ฟังก์ชั่นเข้ารหัสข้อมูลทั้งหมดที่ได้รับการแทรกลงในฐานข้อมูล

ฟังก์ชั่นเขียน:

ฟังก์ชั่นเขียน ($id, $data) { // รับคีย์เฉพาะ $key = $this->getkey($id); // เข้ารหัสข้อมูล $data = $this->encrypt($data, $key); $time = เวลา (); if(!isset($this->w_stmt)) { $this->w_stmt = $this->db->prepare("REPLACE INTO sessions (id, set_time, data, session_key) VALUES (?, ?, ?, ?)"); } $this->w_stmt->bind_param('siss', $id, $time, $data, $key); $this->w_stmt->execute(); คืนค่าจริง; }

2238751 11
2238751 11

ขั้นตอนที่ 8 สร้างฟังก์ชันทำลาย

ฟังก์ชันนี้จะลบเซสชันออกจากฐานข้อมูล php ใช้เมื่อเราเรียกใช้ฟังก์ชันเช่น session_destroy();

ฟังก์ชั่นทำลาย:

ฟังก์ชั่น destroy($id) { if(!isset($this->delete_stmt)) { $this->delete_stmt = $this->db->prepare("DELETE FROM sessions WHERE id = ?"); } $this->delete_stmt->bind_param('s', $id); $this->delete_stmt->execute(); คืนค่าจริง; }

2238751 12
2238751 12

ขั้นตอนที่ 9 สร้างฟังก์ชัน gc (ตัวเก็บขยะ)

ฟังก์ชันนี้เป็นฟังก์ชันตัวรวบรวมขยะที่เรียกว่าเพื่อลบเซสชันเก่า ความถี่ในการเรียกใช้ฟังก์ชันนี้กำหนดโดยคำสั่งคอนฟิกูเรชันสองคำสั่ง session.gc_probability และ session.gc_divisor

gc() ฟังก์ชัน:

ฟังก์ชั่น gc($max) { if(!isset($this->gc_stmt)) { $this->gc_stmt = $this->db->prepare("DELETE FROM sessions WHERE set_time < ?"); } $old = เวลา () - $max; $this->gc_stmt->bind_param('s', $old); $this->gc_stmt->execute(); คืนค่าจริง; }

2238751 13
2238751 13

ขั้นตอนที่ 10. สร้างฟังก์ชัน getKey

ฟังก์ชันนี้ใช้เพื่อรับคีย์เฉพาะสำหรับการเข้ารหัสจากตารางเซสชัน หากไม่มีเซสชัน ระบบจะส่งกลับคีย์สุ่มใหม่สำหรับการเข้ารหัส

getkey() ฟังก์ชั่น:

ฟังก์ชั่นส่วนตัว getkey($id) { if(!isset($this->key_stmt)) { $this->key_stmt = $this->db->prepare("SELECT session_key FROM sessions WHERE id = ? LIMIT 1"); } $this->key_stmt->bind_param('s', $id); $this->key_stmt->execute(); $this->key_stmt->store_result(); if($this->key_stmt->num_rows == 1) { $this->key_stmt->bind_result($key); $this->key_stmt->ดึงข้อมูล(); ส่งคืนคีย์ $; } อื่น { $random_key = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true)); ส่งคืน $random_key; } }

2238751 14
2238751 14

ขั้นตอนที่ 11 สร้างฟังก์ชันเข้ารหัสและถอดรหัส

ฟังก์ชันเหล่านี้เข้ารหัสข้อมูลของเซสชัน โดยใช้คีย์เข้ารหัสจากฐานข้อมูลซึ่งแตกต่างกันไปในแต่ละเซสชัน เราไม่ได้ใช้คีย์นั้นโดยตรงในการเข้ารหัส แต่เราใช้มันเพื่อทำให้แฮชของคีย์สุ่มมากขึ้น

เข้ารหัส () และถอดรหัส () ฟังก์ชั่น:

ฟังก์ชั่นส่วนตัวเข้ารหัส ($data, $key) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $key = substr(hash('sha256', $salt.$key.$salt), 0, 32); $key = substr(hash('sha256', $salt.$key.$salt), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_ECB, $iv)); ส่งคืน $ เข้ารหัส; } ถอดรหัสฟังก์ชันส่วนตัว ($data, $key) { $salt = 'cH!swe!retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39=E@rAsp7c-Ph@pH'; $key = substr(hash('sha256', $salt.$key.$salt), 0, 32); $key = substr(hash('sha256', $salt.$key.$salt), 0, 32); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($data), MCRYPT_MODE_ECB, $iv); $decrypted = rtrim($ถอดรหัส, "\0"); ส่งคืน $ ถอดรหัส; }

2238751 15
2238751 15

ขั้นตอนที่ 12. จบคลาส

ที่นี่เราเพิ่งจบคลาสวงเล็บปีกกา:

จบคลาส:

}

วิธีที่ 3 จาก 3: การสร้างหน้าด้วยเซสชัน

2238751 16
2238751 16

ขั้นตอนที่ 1 การใช้เซสชันกับตัวจัดการเซสชันที่กำหนดเอง

ด้านล่างนี้คือวิธีที่คุณจะเริ่มต้นเซสชันใหม่ คุณจะต้องรวมสิ่งนี้ไว้ในทุกหน้าที่คุณต้องการเข้าถึงเซสชัน ใช้แทน session_start();

เริ่มเซสชัน:

ต้องการ ('session.class.php'); $session = เซสชันใหม่ (); // ตั้งค่าเป็นจริงหากใช้ https $session->start_session('_s', false); $_SESSION['something'] = 'ค่า.'; echo $_SESSION['บางอย่าง'];

แนะนำ: