Itinuturo sa iyo ng wikiHow na ito kung paano maiiwasan ang SQL injection gamit ang mga Inihanda na Pahayag sa PHP. Ang SQL injection ay isa sa mga pinaka-karaniwang kahinaan sa mga aplikasyon sa Web ngayon. Ang mga Inihanda na Pahayag ay gumagamit ng mga nakatali na parameter at hindi pagsamahin ang mga variable sa mga string ng SQL, na ginagawang imposible para sa isang umaatake na baguhin ang pahayag ng SQL.
Ang mga Inihanda na Pahayag ay pinagsasama ang variable sa naipon na pahayag ng SQL, upang ang SQL at ang mga variable ay maipapadala nang magkahiwalay. Ang mga variable ay pagkatapos ay binibigyang kahulugan bilang mga string lamang at hindi bahagi ng pahayag ng SQL. Gamit ang mga pamamaraan sa mga hakbang sa ibaba, hindi mo kakailanganing gumamit ng iba pang mga diskarte sa pag-filter ng iniksiyon na SQL tulad ng mysql_real_escape_string ().
Mga hakbang
Bahagi 1 ng 2: Pag-unawa sa SQL Injection
Hakbang 1. Ang SQL injection ay isang uri ng kahinaan sa mga application na gumagamit ng isang SQL database
Lumilitaw ang kahinaan kapag ginamit ang isang input ng gumagamit sa isang SQL Statement:
$ name = $ _GET ['username']; $ query = "SELECT password MULA sa tbl_user WHERE name = '$ name'";
Hakbang 2. Ang halagang ipinasok ng isang gumagamit sa variable ng username ng URL ay itatalaga sa variable na $ pangalan
Pagkatapos ay inilalagay ito nang direkta sa pahayag ng SQL, na ginagawang posible para sa gumagamit na mai-edit ang pahayag ng SQL.
$ name = "admin 'O 1 = 1 -"; $ query = "SELECT password MULA sa tbl_user WHERE name = '$ name'";
Hakbang 3. Matatanggap ng database ng SQL ang pahayag ng SQL tulad ng sumusunod:
PUMILI ng password MULA sa tbl_users WHERE name = 'admin' O 1 = 1 - '
-
Ito ay wastong SQL, ngunit sa halip na ibalik ang isang password para sa gumagamit, ibabalik ng pahayag ang lahat ng mga password sa tbl_user ng talahanayan. Hindi ito isang bagay na nais mo sa iyong mga web application.
Bahagi 2 ng 2: Paggamit ng mySQLi upang Lumikha ng Inihanda na Mga Pahayag
Hakbang 1. Lumikha ng mySQLi SELECT Query
Gamitin ang code sa ibaba upang PUMILI ng data mula sa isang talahanayan gamit ang mySQLi Inihanda na Mga Pahayag.
$ name = $ _GET ['username']; kung ($ stmt = $ mysqli-> ihanda ("SELECT password MULA sa tbl_users WHERE name =?")) {// Bind a variable to the parameter as a string. $ stmt-> bind_param ("s", $ name); // Isagawa ang pahayag. $ stmt-> magpatupad (); // Kunin ang mga variable mula sa query. $ stmt-> bind_result ($ pass); // Fetch the data. $ stmt-> kunin (); // Ipakita ang data. printf ("Ang password para sa gumagamit% s ay% s / n", $ name, $ pass); // Isara ang nakahandang pahayag. $ stmt-> malapit (); }
Tandaan: Ang variable na $ MySQL ay ang mySQLi Connection Object
Hakbang 2. Lumikha ng mySQLi INSERT Query
Gamitin ang code sa ibaba upang MAG-INSERT ng data sa isang talahanayan gamit ang mySQLi Inihanda na Mga Pahayag.
$ name = $ _GET ['username']; $ password = $ _GET ['password']; kung ($ stmt = $ mysqli-> ihanda ("INSERT INTO tbl_users (pangalan, password) VALUES (?,?)")) {// Bind ang mga variable sa parameter bilang mga string. $ stmt-> bind_param ("ss", $ name, $ password); // Isagawa ang pahayag. $ stmt-> magpatupad (); // Isara ang nakahandang pahayag. $ stmt-> malapit (); }
Tandaan: Ang variable na $ mysqli ay ang mySQLi Connection Object
Hakbang 3. Lumikha ng mySQLi UPDATE Query
Gamitin ang code sa ibaba upang I-UPDATE ang data sa isang talahanayan gamit ang mySQLi Inihanda na Mga Pahayag.
$ name = $ _GET ['username']; $ password = $ _GET ['password']; kung ($ stmt = $ mysqli-> ihanda ("I-UPDATE tbl_users SET password =? SAAN pangalan =?")) {// Bind ang mga variable sa parameter bilang mga string. $ stmt-> bind_param ("ss", $ password, $ name); // Isagawa ang pahayag. $ stmt-> magpatupad (); // Isara ang nakahandang pahayag. $ stmt-> malapit (); }
Tandaan: Ang variable na $ MySQL ay ang mySQLi Connection Object
Hakbang 4. Lumikha ng mySQLi DELETE Query
Ang script sa ibaba ay kung paano Tanggalin ang data mula sa isang talahanayan gamit ang mySQLi Inihanda na Mga Pahayag.
$ name = $ _GET ['username']; $ password = $ _GET ['password']; kung ($ stmt = $ mysqli-> ihanda ("TANGGALIN SA tbl_users WHERE name =?")) {// Bind ang variable sa parameter bilang isang string. $ stmt-> bind_param ("s", $ name); // Isagawa ang pahayag. $ stmt-> magpatupad (); // Isara ang nakahandang pahayag. $ stmt-> malapit (); }