PHP болон MySQL дээр аюулгүй сессийн удирдлагын системийг бий болгох 3 арга

Агуулгын хүснэгт:

PHP болон MySQL дээр аюулгүй сессийн удирдлагын системийг бий болгох 3 арга
PHP болон MySQL дээр аюулгүй сессийн удирдлагын системийг бий болгох 3 арга

Видео: PHP болон MySQL дээр аюулгүй сессийн удирдлагын системийг бий болгох 3 арга

Видео: PHP болон MySQL дээр аюулгүй сессийн удирдлагын системийг бий болгох 3 арга
Видео: ЛЮБОВЬ С ДОСТАВКОЙ НА ДОМ (2020). Романтическая комедия. Хит 2024, Дөрөвдүгээр сар
Anonim

Энэхүү гарын авлага нь mySQL мэдээллийн санд өөрийн сессийг хэрхэн аюулгүй хадгалахыг танд үзүүлэх болно. Бид мөн мэдээллийн санд орсон бүх сессийн өгөгдлийг шифрлэх болно, хэрэв хэн нэгэн мэдээллийн санд нэвтэрч орвол бүх сессийн өгөгдлийг 256 битийн AES шифрлэлтээр шифрлэнэ гэсэн үг юм.

Алхам

3 -ийн 1 -р арга: mySQL мэдээллийн баазыг тохируулах

2238751 1
2238751 1

Алхам 1. MySQL мэдээллийн сан үүсгэх

Энэхүү гарын авлагад бид "secure_sessions" нэртэй мэдээллийн сан үүсгэх болно.

PhpMyAdmin-д хэрхэн мэдээллийн бааз үүсгэх талаар үзнэ үү.

Эсвэл та доорх SQL кодыг ашиглаж болно.

Өгөгдлийн сангийн код үүсгэх:

DATABASE CREATE `secure_sessions`;

Тэмдэглэл: Зарим хостингийн үйлчилгээ нь phpMyAdmin -ээр дамжуулан мэдээллийн бааз үүсгэхийг зөвшөөрдөггүй, үүнийг хэрхэн хийх талаар cPanel дээрээс сурна уу.

2238751 2
2238751 2

Алхам 2. Зөвхөн SELECT, INSERT, DELETE давуу эрхтэй хэрэглэгч үүсгэ

Энэ нь хэрэв манай скриптэд аюулгүй байдлын зөрчил гарсан бол хакер манай мэдээллийн сангаас хүснэгтийг хаяж чадахгүй гэсэн үг юм. Хэрэв та үнэхээр гаж донтой бол функц бүрийн хувьд өөр хэрэглэгч үүсгээрэй.

  • Хэрэглэгч:

    "sec_user"

  • Нууц үг:

    "eKcGZr59zAa2BEWU"

Хэрэглэгчийн код үүсгэх:

Хэрэглэгчийг бий болгох 'sec_user'@'localhost' IDENTIFIED 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `secure_sessions`.* TO 'sec_user'@'localhost';

Тэмдэглэл: Өөрийн сервер дээр ажиллаж байхдаа дээрх кодын нууц үгийг өөрчлөх нь зүйтэй. (Та мөн PHP кодоо өөрчилсөн эсэхээ шалгаарай.) Нууц үг байх шаардлагагүй гэдгийг санаарай, ингэснээр үүнийг хийх нь аль болох төвөгтэй болно. Энд санамсаргүй нууц үг үүсгэгч байна.

2238751 3
2238751 3

Алхам 3. "session" нэртэй MySQL хүснэгт үүсгэнэ үү

Доорх код нь 4 талбар бүхий хүснэгтийг үүсгэдэг (id, set_time, data, session_key).

"Сеанс" хүснэгтийг үүсгэнэ үү.

ҮСЭГ үүсгэх) Мотор = InnoDB DEFAULT CHARSET = латин1;

Бид CHAR өгөгдлийн төрлийг уртыг нь мэддэг талбаруудад ашигладаг, учир нь "id" ба "session_key" талбарууд нь үргэлж 128 тэмдэгт байх болно. CHAR -ийг энд ашиглах нь боловсруулах хүчийг хэмнэдэг.

3 -ийн 2 -р арга: session.class.php файл үүсгэх

2238751 4
2238751 4

Алхам 1. Анги үүсгэх

Шинэ анги эхлүүлэхийн тулд та доорх кодыг оруулах шаардлагатай болно.

Шинэ анги:

ангийн хуралдаан {

2238751 5
2238751 5

Алхам 2. _ байгуулах функцийг үүсгэнэ

Энэ функцийг бид 'session' класс ашиглан объектын шинэ жишээ үүсгэх бүрд дуудагдах болно. Та PHP _construct функцийг эндээс унших боломжтой.

Энэ функц нь манай захиалгат сесс зохицуулагчийг тохируулдаг тул анги үүсмэгц (өөрөөр хэлбэл хийсэн/барьсан/барьсан) ашиглах боломжтой болно.

_ функцийг бүтээх:

function _construct () {// манай тусгай сессийн функцуудыг тохируулна уу. session_set_save_handler (массив ($ энэ, 'нээлттэй'), массив ($ энэ, 'хаах'), массив ($ энэ, 'унших'), массив ($ энэ, 'бичих'), массив ($ энэ, 'устгах'), массив ($ this, 'gc')); // Энэ мөр нь объектуудыг хадгалагч болгон ашиглах үед гэнэтийн эффектээс урьдчилан сэргийлдэг. register_shutdown_function ('session_write_close'); }

2238751 6
2238751 6

Алхам 3. start_session функцийг үүсгэнэ үү

Энэ функцийг та шинэ сесс эхлүүлэх болгондоо дуудах болно, үүнийг session_start (); оронд нь ашиглаарай. Мөр бүр юу хийж байгааг харахын тулд кодын тайлбарыг үзнэ үү.

start_session функц:

start_session функц ($ session_name, $ secure) {// Сеанс күүкийг javascript -ээр ашиглах боломжгүй байгаа эсэхийг шалгаарай. $ httponly = үнэн; // Хуралд ашиглах хэш алгоритм. (hash_algos () ашиглан боломжтой хэшүүдийн жагсаалтыг аваарай.) $ session_hash = 'sha512'; // Хэш байгаа эсэхийг шалгана уу (in_array ($ session_hash, hash_algos ())) {// Хас функцийг тохируулна уу. 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) болгон өөрчлөх; // Одоо бид мессежийг эхлүүлж эхлэв session_start (); // Энэ мөр нь сессийг сэргээж, хуучин хэсгийг устгадаг. // Энэ нь мэдээллийн санд шинэ шифрлэлтийн түлхүүр үүсгэдэг. session_regenerate_id (үнэн); }

2238751 7
2238751 7

Алхам 4. Нээлттэй функцийг бий болгох

Энэ функцийг бид шинэ сесс эхлүүлэх үед PHP сессүүд дуудах бөгөөд бид үүнийг мэдээллийн сангийн шинэ холболтыг эхлүүлэхэд ашигладаг.

нээлттэй функц:

open function () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'secure_sessions'; $ mysqli = шинэ mysqli ($ хост, $ хэрэглэгч, $ дамжуулалт, $ нэр); $ this-> db = $ mysqli; үнэн рүү буцах; }

2238751 8
2238751 8

Алхам 5. Хаах функцийг бий болгох

Сеанс хаагдахыг хүссэн үед энэ функцийг дуудах болно.

хаах функц:

функц close () {$ this-> db-> close (); үнэн рүү буцах; }

2238751 9
2238751 9

Алхам 6. Унших функцийг бий болгох

Энэ функцийг бид жишээ нь echo $ _SESSION ['ямар нэг зүйл]; Нэг хуудсан дээр энэ функц руу олон дуудлага ирж магадгүй тул бид зөвхөн аюулгүй байдлын үүднээс төдийгүй гүйцэтгэлийн хувьд бэлтгэсэн мэдэгдлийн давуу талыг ашигладаг. Бид мэдэгдлийг зөвхөн нэг л удаа бэлтгэдэг бөгөөд үүнийг олон удаа гүйцэтгэх боломжтой.

Бид мөн мэдээллийн санд шифрлэгдсэн сессийн өгөгдлийг тайлдаг. Бид хичээлдээ 256 битийн AES шифрлэлтийг ашиглаж байна.

унших функц:

функц унших ($ id) {if (! isset ($ this-> read_stmt))) {$ this-> read_stmt = $ this-> db-> бэлтгэх ("SELECT data from session from 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 (); $ түлхүүр = $ энэ-> getkey ($ id); $ data = $ this-> шифрийг тайлах ($ data, $ key); $ өгөгдлийг буцаах; }

2238751 10
2238751 10

Алхам 7. Бичих функцийг бий болгох

Энэ функцийг бид сессид утга өгөхөд ашигладаг, жишээлбэл $ _SESSION ['ямар нэг зүйл'] = 'өөр зүйл';. Функц нь мэдээллийн санд оруулсан бүх өгөгдлийг шифрлэдэг.

бичих функц:

бичих функц ($ id, $ data) {// Өвөрмөц түлхүүр авах $ key = $ this-> getkey ($ id); // Өгөгдлийг шифрлэх $ data = $ this-> шифрлэх ($ data, $ key); $ цаг = цаг (); if (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> бэлдэх ("СЕЛООНЫГ ОРЛОХ (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. Устгах функцийг бий болгох

Энэ функц нь мэдээллийн санд байгаа сессийг устгадаг бөгөөд үүнийг session_destroy (); гэх мэт функцуудыг дуудахад php ашигладаг.

функцийг устгах:

функцийг устгах ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> бэлтгэх ("DELETE FROM session from 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-> бэлтгэх ("set_time ХААНААС ХЭРЭГСЭЛДЭЭС УСТГАХ <?"); } $ хуучин = цаг () - $ хамгийн их; $ this-> gc_stmt-> bind_param ('s'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-> бэлтгэх ("SELECT 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 (); $ түлхүүрийг буцаах; } өөр {$ random_key = хэш ('sha512', нэгдмэл (mt_rand (1, mt_getrandmax ()), үнэн))); $ random_key буцаах; }}

2238751 14
2238751 14

Алхам 11. Шифрлэх, шифрлэх функцийг бий болгох

Эдгээр функцууд нь сессүүдийн өгөгдлийг шифрлэдэг бөгөөд сесс бүрийн хувьд өөр өөр мэдээллийн сангаас шифрлэх түлхүүр ашигладаг. Бид тэр түлхүүрийг шифрлэлтэд шууд ашигладаггүй боловч түлхүүрийн хэшийг улам санамсаргүй болгоход ашигладаг.

encrypt () ба decrypt () функцууд:

хувийн функцийг шифрлэх ($ 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); $ encrypted = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ түлхүүр, $ өгөгдөл, MCRYPT_MODE_ECB, $ iv)); $ шифрлэгдсэн буцаах; } хувийн функцийн шифрийг тайлах ($ 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 ($ шифрийг тайлсан, "\ 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 ['ямар нэгэн зүйл];

Зөвлөмж болгож буй: