ეს wikiHow გასწავლით თუ როგორ უნდა აიცილოთ თავიდან SQL ინექცია PHP– ში მომზადებული განცხადებების გამოყენებით. SQL ინექცია დღეს ერთ - ერთი ყველაზე გავრცელებული დაუცველობაა ვებ პროგრამებში. მომზადებული განცხადებები იყენებს შეკრული პარამეტრებს და არ აერთიანებს ცვლადებს SQL სტრიქონებთან, რის გამოც თავდამსხმელისთვის შეუძლებელია SQL განცხადების შეცვლა.
მომზადებული განცხადებები აერთიანებს ცვლადს შედგენილ SQL განცხადებასთან, ისე რომ SQL და ცვლადები იგზავნება ცალკე. ცვლადები შემდეგ განიმარტება როგორც უბრალო სტრიქონები და არა SQL განცხადების ნაწილი. ქვემოთ მოყვანილი ნაბიჯების მეთოდების გამოყენებით, თქვენ არ დაგჭირდებათ SQL ინექციის გაფილტვრის სხვა ტექნიკის გამოყენება, როგორიცაა mysql_real_escape_string ().
ნაბიჯები
მე –2 ნაწილი 1: SQL ინექციის გაგება
ნაბიჯი 1. SQL ინექცია არის დაუცველობის ტიპი იმ პროგრამებში, რომლებიც იყენებენ SQL მონაცემთა ბაზას
დაუცველობა წარმოიქმნება, როდესაც მომხმარებლის შეყვანა გამოიყენება SQL განცხადებაში:
$ name = $ _GET ['მომხმარებლის სახელი']; $ query = "აირჩიეთ პაროლი tbl_user WHERE name = '$ name'";
ნაბიჯი 2. მომხმარებლის მიერ მომხმარებლის ცვლადი მომხმარებლის სახელის მნიშვნელობა გადაეცემა ცვლადის $ სახელს
შემდეგ ის მოთავსებულია უშუალოდ SQL განცხადებაში, რაც მომხმარებელს შესაძლებელს ხდის შეცვალოს SQL განცხადება.
$ name = "ადმინისტრატორი ან 1 = 1 -"; $ query = "აირჩიეთ პაროლი tbl_user WHERE name = '$ name'";
ნაბიჯი 3. SQL მონაცემთა ბაზა მიიღებს SQL განცხადებას შემდეგნაირად:
აირჩიეთ პაროლი tbl_users WHERE name = 'admin' OR 1 = 1 - '
-
ეს არის მოქმედი SQL, მაგრამ მომხმარებლისთვის ერთი პაროლის დაბრუნების ნაცვლად, განცხადება დააბრუნებს tbl_user ცხრილში არსებულ ყველა პაროლს. ეს არ არის ის, რაც გსურთ თქვენს ვებ პროგრამებში.
ნაწილი 2 2: mySQLi გამოყენება მომზადებული განცხადებების შესაქმნელად
ნაბიჯი 1. შექმენით mySQLi SELECT მოთხოვნა
გამოიყენეთ ქვემოთ მოყვანილი კოდი, რათა შეარჩიოთ მონაცემები ცხრილიდან mySQLi მომზადებული განცხადებების გამოყენებით.
$ name = $ _GET ['მომხმარებლის სახელი']; if ($ stmt = $ mysqli-> მომზადება ("პაროლის არჩევა tbl_users WHERE name =?")) {// შეაერთეთ ცვლადი პარამეტრზე, როგორც სტრიქონი. $ stmt-> bind_param ("s", $ name); // განაცხადის შესრულება. $ stmt-> შესრულება (); // მიიღეთ ცვლადები მოთხოვნიდან. $ stmt-> bind_result ($ pass); // მონაცემების ამოღება. $ stmt-> მოტანა (); // მონაცემების ჩვენება. printf ("მომხმარებლის %s პაროლი არის %s / n", $ name, $ pass); // დახურეთ მომზადებული განცხადება. $ stmt-> დახურვა (); }
შენიშვნა: ცვლადი $ mysqli არის mySQLi კავშირის ობიექტი
ნაბიჯი 2. შექმენით mySQLi INSERT მოთხოვნა
გამოიყენეთ ქვემოთ მოცემული კოდი მონაცემების ცხრილში ჩასასმელად mySQLi მომზადებული განცხადებების გამოყენებით.
$ name = $ _GET ['მომხმარებლის სახელი']; $ პაროლი = $ _GET ['პაროლი']; if ($ stmt = $ mysqli-> მომზადება ("ჩაწერე tbl_users (სახელი, პაროლი) VALUES (?,?)")) {// ცვლადების დაკავშირება პარამეტრზე, როგორც სტრიქონი. $ stmt-> bind_param ("ss", $ name, $ პაროლი); // განაცხადის შესრულება. $ stmt-> შესრულება (); // დახურეთ მომზადებული განცხადება. $ stmt-> დახურვა (); }
შენიშვნა: ცვლადი $ mysqli არის mySQLi კავშირის ობიექტი
ნაბიჯი 3. შექმენით mySQLi UPDATE მოთხოვნა
გამოიყენეთ ქვემოთ მოცემული კოდი ცხრილში მონაცემების განახლებისთვის mySQLi მომზადებული განცხადებების გამოყენებით.
$ name = $ _GET ['მომხმარებლის სახელი']; $ პაროლი = $ _GET ['პაროლი']; if ($ stmt = $ mysqli-> მომზადება ("Ubdate tbl_users SET password =? WHERE name =?")) {// შეაერთეთ ცვლადები პარამეტრზე, როგორც სტრიქონი. $ stmt-> bind_param ("ss", $ პაროლი, $ name); // განაცხადის შესრულება. $ stmt-> შესრულება (); // დახურეთ მომზადებული განცხადება. $ stmt-> დახურვა (); }
შენიშვნა: ცვლადი $ mysqli არის mySQLi კავშირის ობიექტი
ნაბიჯი 4. შექმენით mySQLi DELETE მოთხოვნა
ქვემოთ მოყვანილი სკრიპტი არის თუ როგორ უნდა წაშალოთ მონაცემები ცხრილიდან mySQLi მომზადებული განცხადებების გამოყენებით.
$ name = $ _GET ['მომხმარებლის სახელი']; $ პაროლი = $ _GET ['პაროლი']; if ($ stmt = $ mysqli-> მომზადება ("წაშლა tbl_users WHERE name =?")) {// ცვლადის დაკავშირება პარამეტრზე, როგორც სტრიქონი. $ stmt-> bind_param ("s", $ name); // განაცხადის შესრულება. $ stmt-> შესრულება (); // დახურეთ მომზადებული განცხადება. $ stmt-> დახურვა (); }