3 cách tạo hệ thống quản lý phiên an toàn trong PHP và MySQL

Mục lục:

3 cách tạo hệ thống quản lý phiên an toàn trong PHP và MySQL
3 cách tạo hệ thống quản lý phiên an toàn trong PHP và MySQL

Video: 3 cách tạo hệ thống quản lý phiên an toàn trong PHP và MySQL

Video: 3 cách tạo hệ thống quản lý phiên an toàn trong PHP và MySQL
Video: Trở thành Lập Trình Viên Chuyên Nghiệp chỉ sau 4 bước 2024, Tháng tư
Anonim

Hướng dẫn này sẽ chỉ cho bạn cách bạn có thể lưu trữ các phiên của mình một cách an toàn trong cơ sở dữ liệu mySQL. Chúng tôi cũng sẽ mã hóa tất cả dữ liệu phiên đi vào cơ sở dữ liệu, có nghĩa là nếu ai đó xâm nhập vào cơ sở dữ liệu, tất cả dữ liệu phiên sẽ được mã hóa bằng mã hóa AES 256-bit.

Các bước

Phương pháp 1/3: Định cấu hình cơ sở dữ liệu mySQL

2238751 1
2238751 1

Bước 1. Tạo cơ sở dữ liệu MySQL

Trong hướng dẫn này, chúng tôi sẽ tạo một cơ sở dữ liệu được gọi là "secure_sessions".

Xem cách Tạo-a-Cơ sở dữ liệu-trong-phpMyAdmin.

Hoặc bạn có thể sử dụng mã SQL dưới đây sẽ tạo một mã cho bạn.

Tạo mã cơ sở dữ liệu:

TẠO CƠ SỞ DỮ LIỆU `secure_sessions`;

Lưu ý: Một số dịch vụ lưu trữ không cho phép bạn tạo cơ sở dữ liệu thông qua phpMyAdmin, Tìm hiểu cách thực hiện trong cPanel.

2238751 2
2238751 2

Bước 2. Tạo người dùng chỉ có các đặc quyền CHỌN, CHÈN và XÓA

Điều này có nghĩa là nếu có một lần vi phạm bảo mật trong tập lệnh của chúng tôi, thì tin tặc không thể xóa các bảng khỏi cơ sở dữ liệu của chúng tôi. Nếu bạn thực sự hoang tưởng, hãy tạo một người dùng khác nhau cho mỗi chức năng.

  • Người sử dụng:

    "sec_user"

  • Mật khẩu:

    "eKcGZr59zAa2BEWU"

Tạo mã người dùng:

TẠO NGƯỜI DÙNG 'sec_user' @ 'localhost' ĐƯỢC XÁC NHẬN BỞI 'eKcGZr59zAa2BEWU'; CẤP CHỌN, CHÈN, CẬP NHẬT, XÓA TRÊN `secure_sessions`. * TO 'sec_user' @ 'localhost';

Lưu ý: Bạn nên thay đổi mật khẩu trong đoạn mã trên khi chạy trên máy chủ của riêng bạn. (Hãy chắc chắn rằng bạn cũng thay đổi mã PHP của mình.) Hãy nhớ rằng nó không cần phải là một mật khẩu mà bạn có thể nhớ được vì vậy hãy tạo càng phức tạp càng tốt. Đây là một trình tạo mật khẩu ngẫu nhiên.

2238751 3
2238751 3

Bước 3. Tạo một bảng MySQL có tên là "phiên"

Đoạn mã dưới đây tạo một bảng với 4 trường (id, set_time, data, session_key).

Tạo bảng "phiên":

TẠO BẢNG `session` (` id` char (128) NOT NULL, `set_time` char (10) NOT NULL,` data` text NOT NULL, `session_key` char (128) NOT NULL, PRIMARY KEY (` id`)) ENGINE = InnoDB DEFAULT CHARSET = latin1;

Chúng tôi sử dụng kiểu dữ liệu CHAR cho các trường mà chúng tôi biết độ dài, vì các trường "id" và "session_key" sẽ luôn dài 128 ký tự. Sử dụng CHAR ở đây giúp tiết kiệm năng lượng xử lý.

Phương pháp 2/3: Tạo tệp session.class.php

2238751 4
2238751 4

Bước 1. Tạo lớp

Để bắt đầu một lớp học mới, bạn sẽ cần nhập mã dưới đây:

Lớp mới:

buổi học {

2238751 5
2238751 5

Bước 2. Tạo hàm _construct

Hàm này sẽ được gọi mỗi khi chúng ta tạo một phiên bản mới của một đối tượng bằng cách sử dụng lớp 'session'. Bạn có thể đọc thêm về hàm _construct của PHP tại đây.

Hàm này thiết lập trình xử lý phiên tùy chỉnh của chúng tôi để nó có sẵn để sử dụng ngay sau khi lớp được khởi tạo (tức là được tạo / xây dựng / xây dựng).

_construct function:

function _construct () {// thiết lập các chức năng phiên tùy chỉnh của chúng tôi. session_set_save_handler (array ($ this, 'open'), array ($ this, 'close'), array ($ this, 'read'), array ($ this, 'write'), array ($ this, 'kill'), array ($ this, 'gc')); // Dòng này ngăn các hiệu ứng không mong muốn khi sử dụng các đối tượng làm trình xử lý lưu. register_shutdown_ function ('session_write_close'); }

2238751 6
2238751 6

Bước 3. Tạo hàm start_session

Hàm này sẽ được gọi mỗi khi bạn muốn bắt đầu một phiên mới, hãy sử dụng nó thay cho session_start ();. Xem các nhận xét trong mã để xem mỗi dòng làm gì.

start_session hàm:

function start_session ($ session_name, $ secure) {// Đảm bảo không thể truy cập cookie phiên qua javascript. $ httponly = true; // Thuật toán băm để sử dụng cho phiên. (sử dụng hash_algos () để lấy danh sách các hàm băm có sẵn.) $ session_hash = 'sha512'; // Kiểm tra xem hash có khả dụng không if (in_array ($ session_hash, hash_algos ())) {// Đặt hàm has. ini_set ('session.hash_ Chức năng', $ session_hash); } // Có bao nhiêu bit trên mỗi ký tự của hàm băm. // Các giá trị có thể có là '4' (0-9, a-f), '5' (0-9, a-v) và '6' (0-9, a-z, A-Z, "-", ","). ini_set ('session.hash_bits_per_character', 5); // Buộc phiên chỉ sử dụng cookie, không sử dụng các biến URL. ini_set ('session.use_only_cookies', 1); // Lấy tham số cookie phiên $ cookieParams = session_get_cookie_params (); // Đặt các tham số session_set_cookie_params ($ cookieParams ["life"], $ cookieParams ["path"], $ cookieParams ["domain"], $ secure, $ httponly); // Thay đổi tên phiên session_name ($ session_name); // Bây giờ chúng ta bắt đầu phiên làm việc session_start (); // Dòng này tạo lại phiên và xóa phiên cũ. // Nó cũng tạo một khóa mã hóa mới trong cơ sở dữ liệu. session_regenerate_id (true); }

2238751 7
2238751 7

Bước 4. Tạo chức năng mở

Hàm này sẽ được gọi bởi các phiên PHP khi chúng ta bắt đầu một phiên mới, chúng ta sử dụng nó để bắt đầu một kết nối cơ sở dữ liệu mới.

mở chức năng:

hàm open () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = new mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; trả về true; }

2238751 8
2238751 8

Bước 5. Tạo chức năng đóng

Hàm này sẽ được gọi khi muốn đóng phiên.

đóng chức năng:

hàm close () {$ this-> db-> close (); trả về true; }

2238751 9
2238751 9

Bước 6. Tạo chức năng đọc

Hàm này sẽ được PHP gọi khi chúng ta cố gắng truy cập vào một phiên, chẳng hạn như khi chúng ta sử dụng echo $ _SESSION ['something'];. Bởi vì có thể có nhiều lệnh gọi đến hàm này trên một trang, chúng tôi tận dụng các câu lệnh đã chuẩn bị, không chỉ để bảo mật mà còn cho hiệu suất. Chúng ta chỉ chuẩn bị câu lệnh một lần sau đó chúng ta có thể thực thi nó nhiều lần.

Chúng tôi cũng giải mã dữ liệu phiên được mã hóa trong cơ sở dữ liệu. Chúng tôi đang sử dụng mã hóa AES 256-bit trong các phiên của chúng tôi.

đọc chức năng:

function read ($ id) {if (! Isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> standard ("CHỌN dữ liệu TỪ phiên WHERE id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> execute (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ data); $ this-> read_stmt-> fetch (); $ key = $ this-> getkey ($ id); $ data = $ this-> decrypt ($ data, $ key); trả về dữ liệu $; }

2238751 10
2238751 10

Bước 7. Tạo chức năng ghi

Hàm này được sử dụng khi chúng ta gán giá trị cho một phiên, ví dụ: $ _SESSION ['something'] = 'something else';. Hàm mã hóa tất cả dữ liệu được chèn vào cơ sở dữ liệu.

viết hàm:

function write ($ id, $ data) {// Lấy khóa duy nhất $ key = $ this-> getkey ($ id); // Mã hóa dữ liệu $ data = $ this-> encode ($ data, $ key); $ time = time (); if (! Isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> standard ("THAY THẾ VÀO phiên (id, set_time, data, session_key) GIÁ TRỊ (?,?,?,?") "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> execute (); trả về true; }

2238751 11
2238751 11

Bước 8. Tạo chức năng tiêu diệt

Hàm này xóa phiên khỏi cơ sở dữ liệu, nó được php sử dụng khi chúng ta gọi các hàm như session_destroy ();.

phá hủy chức năng:

function hủy ($ id) {if (! Isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> standard ("XÓA khỏi phiên WHERE id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> execute (); trả về true; }

2238751 12
2238751 12

Bước 9. Tạo hàm gc (bộ thu gom rác)

Chức năng này là chức năng thu gom rác, nó được gọi để xóa các phiên cũ. Tần suất mà hàm này được gọi được xác định bởi hai chỉ thị cấu hình, session.gc_probability và session.gc_divisor.

hàm gc ():

function gc ($ max) {if (! Isset ($ this-> gc_stmt)) {$ this-> gc_stmt = $ this-> db-> standard ("XÓA khỏi phiên WHERE set_time <?"); } $ cũ = time () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> execute (); trả về true; }

2238751 13
2238751 13

Bước 10. Tạo hàm getKey

Hàm này được sử dụng để lấy khóa duy nhất để mã hóa từ bảng phiên. Nếu không có phiên, nó chỉ trả về một khóa ngẫu nhiên mới để mã hóa.

hàm getkey ():

hàm private getkey ($ id) {if (! Isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> standard ("CHỌN session_key FROM session 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-> fetch (); trả lại $ key; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); trả về $ random_key; }}

2238751 14
2238751 14

Bước 11. Tạo các hàm mã hóa và giải mã

Các hàm này mã hóa dữ liệu của các phiên, chúng sử dụng một khóa mã hóa từ cơ sở dữ liệu, khóa này khác nhau cho mỗi phiên. Chúng tôi không trực tiếp sử dụng khóa đó trong mã hóa nhưng chúng tôi sử dụng nó để làm cho mã băm của khóa trở nên ngẫu nhiên hơn.

Các hàm mã hóa () và giải mã ():

mã hóa hàm riêng tư ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH'; $ 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); $ mã hóa = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ key, $ data, MCRYPT_MODE_ECB, $ iv)); trả về $ đã mã hóa; } giải mã hàm private ($ data, $ key) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE * ewr4n39 = E @ rAsp7c-Ph @ pH'; $ 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 ($ đã được giải mã, "\ 0"); trả về $ đã giải mã; }

2238751 15
2238751 15

Bước 12. Kết thúc lớp học

Ở đây chúng ta chỉ kết thúc các lớp trong ngoặc nhọn:

Lớp kết thúc:

}

Phương pháp 3/3: Tạo trang có phiên

2238751 16
2238751 16

Bước 1. Sử dụng phiên với trình quản lý phiên tùy chỉnh

Dưới đây là cách bạn bắt đầu một phiên mới; bạn sẽ cần phải bao gồm điều này trên mọi trang mà bạn muốn truy cập các phiên, sử dụng nó thay vì session_start ();

Bắt đầu một phiên:

request ('session.class.php'); $ session = phiên mới (); // Đặt thành true nếu sử dụng https $ session-> start_session ('_ s', false); $ _SESSION ['something'] = 'Một giá trị.'; echo $ _SESSION ['something'];

Đề xuất: