ეს სახელმძღვანელო გაჩვენებთ თუ როგორ შეგიძლიათ შეინახოთ თქვენი სესიები უსაფრთხოდ mySQL მონაცემთა ბაზაში. ჩვენ ასევე დავაშიფრებთ სესიის ყველა მონაცემს, რომელიც შედის მონაცემთა ბაზაში, რაც იმას ნიშნავს, რომ თუ ვინმე მოახერხებს მონაცემთა ბაზაში გატეხვას, ყველა სესიის მონაცემები დაშიფრულია 256-ბიტიანი AES დაშიფვრით.
ნაბიჯები
3 მეთოდი 1: mySQL მონაცემთა ბაზის კონფიგურაცია
ნაბიჯი 1. შექმენით MySQL მონაცემთა ბაზა
ამ სახელმძღვანელოში ჩვენ შევქმნით მონაცემთა ბაზას სახელწოდებით "safe_sessions".
ნახეთ, თუ როგორ უნდა შექმნათ მონაცემთა ბაზა phpMyAdmin– ში.
ან შეგიძლიათ გამოიყენოთ SQL კოდი ქვემოთ შექმნის თქვენთვის.
შექმენით მონაცემთა ბაზის კოდი:
შექმენით მონაცემთა ბაზა `safe_sessions`;
შენიშვნა: ზოგიერთი ჰოსტინგის სერვისი არ გაძლევთ უფლებას შექმნათ მონაცემთა ბაზა phpMyAdmin– ის საშუალებით, ისწავლეთ როგორ გააკეთოთ ეს cPanel– ში.
ნაბიჯი 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 კოდს.) გახსოვდეთ, რომ ის არ უნდა იყოს პაროლი, რომლის გახსენებაც შეგიძლიათ, რათა რაც შეიძლება რთული იყოს. აქ არის შემთხვევითი პაროლის გენერატორი.
ნაბიჯი 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 ფაილი
ნაბიჯი 1. კლასის შექმნა
ახალი კლასის დასაწყებად, თქვენ უნდა შეიყვანოთ კოდი ქვემოთ:
ახალი კლასი:
კლასის სესია {
ნაბიჯი 2. შექმენით _კონსტრუქციის ფუნქცია
ეს ფუნქცია გამოიძახება ყოველ ჯერზე, როდესაც ჩვენ შევქმნით ობიექტის ახალ მაგალითს "სხდომის" კლასის გამოყენებით. თქვენ შეგიძლიათ წაიკითხოთ PHP _construct ფუნქცია აქ.
ეს ფუნქცია ადგენს ჩვენს სესიის დამუშავებას ისე, რომ ის ხელმისაწვდომი იყოს გამოსაყენებლად, როგორც კი კლასი შეიქმნება (ანუ, დამზადებული/აგებული/აგებული).
_კონსტრუქციის ფუნქცია:
ფუნქცია _construct () {// დააყენეთ ჩვენი პერსონალური სესიის ფუნქციები. session_set_save_handler (მასივი ($ ეს, "გახსნა"), მასივი ($ this, "დახურვა"), მასივი ($ this, "წაკითხვა"), მასივი ($ this, "ჩაწერა"), მასივი ($ this, "განადგურება"), მასივი ($ this, 'gc')); // ეს ხაზი ხელს უშლის მოულოდნელ ეფექტებს, როდესაც იყენებთ ობიექტებს, როგორც შემნახველ დამხმარეებს. Register_shutdown_ ფუნქცია ('session_write_close'); }
ნაბიჯი 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 (ჭეშმარიტი); }
ნაბიჯი 4. შექმენით ღია ფუნქცია
ამ ფუნქციას დაარქმევს PHP სესიები, როდესაც ჩვენ ვიწყებთ ახალ სესიას, ჩვენ ვიყენებთ მას მონაცემთა ბაზის ახალი კავშირის დასაწყებად.
გახსნის ფუნქცია:
ფუნქცია ღია () {$ host = 'localhost'; $ user = 'sec_user'; $ pass = 'eKcGZr59zAa2BEWU'; $ name = 'უსაფრთხო_სესიები'; $ mysqli = ახალი mysqli ($ host, $ user, $ pass, $ name); $ this-> db = $ mysqli; ჭეშმარიტი დაბრუნება; }
ნაბიჯი 5. შექმენით ფუნქციის დახურვა
ეს ფუნქცია გამოიძახება მაშინ, როდესაც სესიების დახურვა სურს.
დახურვის ფუნქცია:
ფუნქცია close () {$ this-> db-> close (); ჭეშმარიტი დაბრუნება; }
ნაბიჯი 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); $ მონაცემების დაბრუნება; }
ნაბიჯი 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-> შესრულება (); ჭეშმარიტი დაბრუნება; }
ნაბიჯი 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-> შესრულება (); ჭეშმარიტი დაბრუნება; }
ნაბიჯი 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-> შესრულება (); ჭეშმარიტი დაბრუნება; }
ნაბიჯი 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; }}
ნაბიჯი 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"); დაშიფრული $ დაბრუნება; }
ნაბიჯი 12. დასასრულის კლასი
აქ ჩვენ უბრალოდ ვამთავრებთ კლასების ხვეულ ფრჩხილებს:
დასასრულის კლასი:
}
მეთოდი 3 -დან 3: გვერდების შექმნა სესიებით
ნაბიჯი 1. სესიების გამოყენება მორგებული სესიის მენეჯერთან
ქვემოთ მოცემულია თუ როგორ დაიწყებდით ახალ სესიას; თქვენ უნდა შეიტანოთ ეს ყველა გვერდზე, სადაც გსურთ მიიღოთ სესიები, გამოიყენეთ session_start () ნაცვლად;
სესიის დაწყება:
მოითხოვოს ('session.class.php'); $ session = ახალი სესია (); // დააყენეთ true, თუ იყენებთ https $ session-> start_session ('_ s', false); $ _SESSION ['რაღაც'] = 'მნიშვნელობა.'; ექო $ _SESSION ['რაღაც'];