3 გზა PHP და MySQL უსაფრთხო სესიების მართვის სისტემის შესაქმნელად

Სარჩევი:

3 გზა PHP და MySQL უსაფრთხო სესიების მართვის სისტემის შესაქმნელად
3 გზა PHP და MySQL უსაფრთხო სესიების მართვის სისტემის შესაქმნელად

ვიდეო: 3 გზა PHP და MySQL უსაფრთხო სესიების მართვის სისტემის შესაქმნელად

ვიდეო: 3 გზა PHP და MySQL უსაფრთხო სესიების მართვის სისტემის შესაქმნელად
ვიდეო: რატომ არ უნდა გახდე პროგრამისტი! 2024, აპრილი
Anonim

ეს სახელმძღვანელო გაჩვენებთ თუ როგორ შეგიძლიათ შეინახოთ თქვენი სესიები უსაფრთხოდ mySQL მონაცემთა ბაზაში. ჩვენ ასევე დავაშიფრებთ სესიის ყველა მონაცემს, რომელიც შედის მონაცემთა ბაზაში, რაც იმას ნიშნავს, რომ თუ ვინმე მოახერხებს მონაცემთა ბაზაში გატეხვას, ყველა სესიის მონაცემები დაშიფრულია 256-ბიტიანი AES დაშიფვრით.

ნაბიჯები

3 მეთოდი 1: mySQL მონაცემთა ბაზის კონფიგურაცია

2238751 1
2238751 1

ნაბიჯი 1. შექმენით MySQL მონაცემთა ბაზა

ამ სახელმძღვანელოში ჩვენ შევქმნით მონაცემთა ბაზას სახელწოდებით "safe_sessions".

ნახეთ, თუ როგორ უნდა შექმნათ მონაცემთა ბაზა phpMyAdmin– ში.

ან შეგიძლიათ გამოიყენოთ SQL კოდი ქვემოთ შექმნის თქვენთვის.

შექმენით მონაცემთა ბაზის კოდი:

შექმენით მონაცემთა ბაზა `safe_sessions`;

შენიშვნა: ზოგიერთი ჰოსტინგის სერვისი არ გაძლევთ უფლებას შექმნათ მონაცემთა ბაზა phpMyAdmin– ის საშუალებით, ისწავლეთ როგორ გააკეთოთ ეს cPanel– ში.

2238751 2
2238751 2

ნაბიჯი 2. შექმენით მომხმარებელი მხოლოდ SELECT, INSERT და DELETE პრივილეგიებით

ეს ნიშნავს, რომ თუკი ოდესმე ადგილი ექნებოდა უსაფრთხოების დარღვევას ჩვენს სკრიპტში, ჰაკერს არ შეეძლო ცხრილების ამოღება ჩვენი მონაცემთა ბაზიდან. თუ მართლა პარანოიკი ხართ, შექმენით განსხვავებული მომხმარებელი თითოეული ფუნქციისთვის.

  • მომხმარებელი:

    "sec_user"

  • პაროლი:

    "eKcGZr59zAa2BEWU"

შექმენით მომხმარებლის კოდი:

შექმენით მომხმარებელი 'sec_user'@'localhost' IDENTIFIED BY 'eKcGZr59zAa2BEWU'; GRANT SELECT, INSERT, UPDATE, DELETE ON `ewle_sessions`.* TO 'sec_user'@'localhost';

შენიშვნა: კარგი იდეაა შეცვალოთ პაროლი ზემოთ მოცემულ კოდში საკუთარ სერვერზე მუშაობისას. (დარწმუნდით, რომ თქვენ ასევე შეცვლით თქვენს PHP კოდს.) გახსოვდეთ, რომ ის არ უნდა იყოს პაროლი, რომლის გახსენებაც შეგიძლიათ, რათა რაც შეიძლება რთული იყოს. აქ არის შემთხვევითი პაროლის გენერატორი.

2238751 3
2238751 3

ნაბიჯი 3. შექმენით MySQL ცხრილი სახელწოდებით "სხდომები"

ქვემოთ მოყვანილი კოდი ქმნის ცხრილს 4 ველით (id, set_time, data, session_key).

შექმენით "სესიების" ცხრილი:

შექმენით ცხრილი "სესიები" (`id` char (128) NOT NULL,` set_time` char (10) NOT NULL, `data` text NOT NULL,` session_key` char (128) NOT NULL, PRIMARY KEY (`id`)) ძრავა = InnoDB DEFAULT CHARSET = latin1;

ჩვენ ვიყენებთ CHAR მონაცემთა ტიპს იმ სფეროებისთვის, რომელთა სიგრძე ჩვენ ვიცით, რადგან ველები "id" და "session_key" ყოველთვის იქნება 128 სიმბოლო. CHAR– ის გამოყენება დაზოგავს დამუშავების ენერგიას.

მეთოდი 3 დან 3: შექმენით session.class.php ფაილი

2238751 4
2238751 4

ნაბიჯი 1. კლასის შექმნა

ახალი კლასის დასაწყებად, თქვენ უნდა შეიყვანოთ კოდი ქვემოთ:

ახალი კლასი:

კლასის სესია {

2238751 5
2238751 5

ნაბიჯი 2. შექმენით _კონსტრუქციის ფუნქცია

ეს ფუნქცია გამოიძახება ყოველ ჯერზე, როდესაც ჩვენ შევქმნით ობიექტის ახალ მაგალითს "სხდომის" კლასის გამოყენებით. თქვენ შეგიძლიათ წაიკითხოთ PHP _construct ფუნქცია აქ.

ეს ფუნქცია ადგენს ჩვენს სესიის დამუშავებას ისე, რომ ის ხელმისაწვდომი იყოს გამოსაყენებლად, როგორც კი კლასი შეიქმნება (ანუ, დამზადებული/აგებული/აგებული).

_კონსტრუქციის ფუნქცია:

ფუნქცია _construct () {// დააყენეთ ჩვენი პერსონალური სესიის ფუნქციები. session_set_save_handler (მასივი ($ ეს, "გახსნა"), მასივი ($ this, "დახურვა"), მასივი ($ this, "წაკითხვა"), მასივი ($ this, "ჩაწერა"), მასივი ($ this, "განადგურება"), მასივი ($ this, 'gc')); // ეს ხაზი ხელს უშლის მოულოდნელ ეფექტებს, როდესაც იყენებთ ობიექტებს, როგორც შემნახველ დამხმარეებს. Register_shutdown_ ფუნქცია ('session_write_close'); }

2238751 6
2238751 6

ნაბიჯი 3. შექმენით start_session ფუნქცია

ეს ფუნქცია დარეკილია ყოველ ჯერზე, როდესაც გსურთ ახალი სესიის დაწყება, გამოიყენეთ ის session_start () - ის ნაცვლად; იხილეთ კომენტარებში კოდი, რომ ნახოთ რას აკეთებს თითოეული ხაზი.

start_session ფუნქცია:

ფუნქცია start_session ($ session_name, $ safe) {// დარწმუნდით, რომ სესიის ქუქი არ არის ხელმისაწვდომი 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 ["სიცოცხლის განმავლობაში"], $ cookieParams ["გზა"], $ cookieParams ["დომენი"], $ უსაფრთხო, $ httponly); // შეცვალეთ სესიის სახელი session_name ($ session_name); // ახლა ჩვენ კატას ვიწყებთ სესიის session_start (); // ეს ხაზი აღადგენს სესიას და წაშლის ძველს. // ის ასევე წარმოქმნის დაშიფვრის ახალ გასაღებს მონაცემთა ბაზაში. session_regenerate_id (ჭეშმარიტი); }

2238751 7
2238751 7

ნაბიჯი 4. შექმენით ღია ფუნქცია

ამ ფუნქციას დაარქმევს PHP სესიები, როდესაც ჩვენ ვიწყებთ ახალ სესიას, ჩვენ ვიყენებთ მას მონაცემთა ბაზის ახალი კავშირის დასაწყებად.

გახსნის ფუნქცია:

ფუნქცია ღია () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'უსაფრთხო_სესიები'; $ mysqli = ახალი mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; ჭეშმარიტი დაბრუნება; }

2238751 8
2238751 8

ნაბიჯი 5. შექმენით ფუნქციის დახურვა

ეს ფუნქცია გამოიძახება მაშინ, როდესაც სესიების დახურვა სურს.

დახურვის ფუნქცია:

ფუნქცია close () {$ this-> db-> close (); ჭეშმარიტი დაბრუნება; }

2238751 9
2238751 9

ნაბიჯი 6. შექმენით წაკითხვის ფუნქცია

ამ ფუნქციას PHP დაარქმევს, როდესაც ჩვენ ვცდილობთ მივიღოთ სესია, მაგალითად, როდესაც ვიყენებთ ექოს $ _SESSION ['რაღაც'];. იმის გამო, რომ ამ ფუნქციის ერთ გვერდზე შეიძლება იყოს ბევრი ზარი, ჩვენ ვიყენებთ მომზადებულ განცხადებებს, არა მხოლოდ უსაფრთხოების, არამედ შესრულებისათვის. ჩვენ ვამზადებთ განცხადებას მხოლოდ ერთხელ, შემდეგ შეგვიძლია მისი მრავალჯერ შესრულება.

ჩვენ ასევე ვაშიფრებთ სესიის მონაცემებს, რომლებიც დაშიფრულია მონაცემთა ბაზაში. ჩვენ ვიყენებთ 256 ბიტიან AES დაშიფვრას ჩვენს სესიებში.

წაკითხვის ფუნქცია:

ფუნქცია read ($ id) {if (! isset ($ this-> read_stmt)) {$ this-> read_stmt = $ this-> db-> მომზადება ("მონაცემების არჩევა სესიებიდან WHERE id =? LIMIT 1"); } $ this-> read_stmt-> bind_param ('s', $ id); $ this-> read_stmt-> შესრულება (); $ this-> read_stmt-> store_result (); $ this-> read_stmt-> bind_result ($ მონაცემები); $ this-> read_stmt-> მოტანა (); $ key = $ this-> getkey ($ id); $ data = $ this-> გაშიფვრა ($ data, $ key); $ მონაცემების დაბრუნება; }

2238751 10
2238751 10

ნაბიჯი 7. შექმენით ჩაწერის ფუნქცია

ეს ფუნქცია გამოიყენება სესიისთვის მნიშვნელობის მინიჭებისას, მაგალითად $ _SESSION ['რაღაც'] = 'სხვა რაღაც';. ფუნქცია დაშიფვრავს ყველა მონაცემს, რომელიც შეიტანება მონაცემთა ბაზაში.

ჩაწერის ფუნქცია:

ფუნქცია ჩაწერა ($ id, $ data) {// მიიღეთ უნიკალური გასაღები $ key = $ this-> getkey ($ id); // მონაცემების დაშიფვრა $ data = $ this-> დაშიფვრა ($ data, $ გასაღები); $ დრო = დრო (); თუ (! isset ($ this-> w_stmt)) {$ this-> w_stmt = $ this-> db-> მომზადება ("ჩაანაცვლეთ სესიები (id, set_time, მონაცემები, session_key) ღირებულებები (?,?,?,?) "); } $ this-> w_stmt-> bind_param ('siss', $ id, $ time, $ data, $ key); $ this-> w_stmt-> შესრულება (); ჭეშმარიტი დაბრუნება; }

2238751 11
2238751 11

ნაბიჯი 8. შექმენით განადგურების ფუნქცია

ეს ფუნქცია წაშლის სესიას მონაცემთა ბაზიდან, ის გამოიყენება php– ის მიერ, როდესაც ჩვენ ვიძახებთ ისეთ ფუნქციებს, როგორიცაა session_destroy ();.

ფუნქციის განადგურება:

ფუნქციის განადგურება ($ id) {if (! isset ($ this-> delete_stmt)) {$ this-> delete_stmt = $ this-> db-> მომზადება ("წაშალეთ სესიებიდან სად id =?"); } $ this-> delete_stmt-> bind_param ('s', $ id); $ this-> delete_stmt-> შესრულება (); ჭეშმარიტი დაბრუნება; }

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-> მომზადება ("წაშლა სესიებიდან WHERE set_time <?"); } $ old = დრო () - $ max; $ this-> gc_stmt-> bind_param ('s', $ old); $ this-> gc_stmt-> შესრულება (); ჭეშმარიტი დაბრუნება; }

2238751 13
2238751 13

ნაბიჯი 10. შექმენით getKey ფუნქცია

ეს ფუნქცია გამოიყენება სესიების ცხრილიდან დაშიფვრის უნიკალური გასაღების მისაღებად. თუ სხდომა არ არის, ის უბრუნებს დაშიფვრის ახალ შემთხვევით გასაღებს.

getkey () ფუნქცია:

პირადი ფუნქცია getkey ($ id) {if (! isset ($ this-> key_stmt)) {$ this-> key_stmt = $ this-> db-> მომზადება ("სხდომის გასაღების არჩევა სესიებიდან WHERE id =? LIMIT 1"); } $ this-> key_stmt-> bind_param ('s', $ id); $ this-> key_stmt-> შესრულება (); $ this-> key_stmt-> store_result (); if ($ this-> key_stmt-> num_rows == 1) {$ this-> key_stmt-> bind_result ($ გასაღები); $ this-> key_stmt-> მოტანა (); $ გასაღების დაბრუნება; } else {$ random_key = hash ('sha512', uniqid (mt_rand (1, mt_getrandmax ()), true)); დაბრუნება $ random_key; }}

2238751 14
2238751 14

ნაბიჯი 11. შექმენით დაშიფვრის და გაშიფვრის ფუნქციები

ეს ფუნქციები დაშიფვრავს სესიების მონაცემებს, ისინი იყენებენ მონაცემთა ბაზის დაშიფვრის გასაღებს, რომელიც განსხვავებულია თითოეული სესიისთვის. ჩვენ პირდაპირ არ ვიყენებთ ამ გასაღებს დაშიფვრისას, მაგრამ ვიყენებთ მას, რათა გასაღების ჰეში კიდევ უფრო შემთხვევითი გახდეს.

დაშიფვრა () და გაშიფვრა () ფუნქციები:

პირადი ფუნქციის დაშიფვრა ($ მონაცემები, $ გასაღები) {$ salt = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (ჰაში ('sha256', $ მარილი. $ გასაღები. $ მარილი), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ დაშიფრული = base64_encode (mcrypt_encrypt (MCRYPT_RIJNDAEL_256, $ გასაღები, $ მონაცემები, MCRYPT_MODE_ECB, $ iv)); დაშიფრული $ დაბრუნება; } პირადი ფუნქციის გაშიფვრა ($ მონაცემები, $ გასაღები) {$ მარილი = 'cH! swe! retReGu7W6bEDRup7usuDUh9THeD2CHeGE*ewr4n39 = E@rAsp7c-Ph@pH'; $ key = substr (ჰაში ('sha256', $ მარილი. $ გასაღები. $ მარილი), 0, 32); $ iv_size = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $ iv = mcrypt_create_iv ($ iv_size, MCRYPT_RAND); $ გაშიფრული = mcrypt_decrypt (MCRYPT_RIJNDAEL_256, $ გასაღები, base64_decode ($ მონაცემები), MCRYPT_MODE_ECB, $ iv); $ გაშიფრული = rtrim ($ გაშიფრული, "\ 0"); დაშიფრული $ დაბრუნება; }

2238751 15
2238751 15

ნაბიჯი 12. დასასრულის კლასი

აქ ჩვენ უბრალოდ ვამთავრებთ კლასების ხვეულ ფრჩხილებს:

დასასრულის კლასი:

}

მეთოდი 3 -დან 3: გვერდების შექმნა სესიებით

2238751 16
2238751 16

ნაბიჯი 1. სესიების გამოყენება მორგებული სესიის მენეჯერთან

ქვემოთ მოცემულია თუ როგორ დაიწყებდით ახალ სესიას; თქვენ უნდა შეიტანოთ ეს ყველა გვერდზე, სადაც გსურთ მიიღოთ სესიები, გამოიყენეთ session_start () ნაცვლად;

სესიის დაწყება:

მოითხოვოს ('session.class.php'); $ session = ახალი სესია (); // დააყენეთ true, თუ იყენებთ https $ session-> start_session ('_ s', false); $ _SESSION ['რაღაც'] = 'მნიშვნელობა.'; ექო $ _SESSION ['რაღაც'];

გირჩევთ: