Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – Obrana proti útoku SQL injection v PHP

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
FastNode
Tvůrce
Avatar
FastNode:13.4.2014 21:34

"návštěvník nezná název naší databáze" -> k tomu existuje database() / např SELECT database() /. Ještě můžu použít information_schema, kde se dají lehce zjistit i názvy tabulek i jednotlivých sloupců myslím... / SELECT SCHEMA_NAME FROM information_schema.SCHEMATA /

Pěkný článek.

Editované 13.4.2014 21:36
 
Odpovedať
13.4.2014 21:34
Avatar
asanos
Člen
Avatar
Odpovedá na FastNode
asanos:15.4.2014 21:20

Před tím by bylo ještě vhodné použít SELECT version() Pokud se jedna o MySQL s verzí menší než 5 -> information_schem nebudeš moci použít a budeš muset pouze hádat = Blind SQL Injection ;)
_____________­________________________­_____________
Ještě je možný způsob obrany s pomocí IDS:
Při použití IDS například zablokujeme použití apostrofů, mezer, nebo různých příkazů. Ale to je hodně ošidné a většinou to jde stejně jednoduše obejít, je to spíš obrana proti laikům, než hackerovi... ;)
např.:

  • Místo mezery dám + nebo víceřádkový komentář /(hvězdička)(hvěz­dička)/. :D
  • Místo apostrofů použijeme funkci char() nebo hexa zápis.

_____________­________________________­_____________
Ještě bych dodal, že přes SQLIA jde udělat i DOS útok, nebo kombinovat s XSS. :D
Tudíž bych tento typ útoku nepodceňoval.
_____________­________________________­_____________
Naprosto nejlepší obrana je přes Prepared Statements(Při­pravené dotazy) V php nejlépe za pomocí PDO + dodat, že se mají k sobě data spojit až v databázi.
_____________­________________________­_____________
Možná s tím označením jako parametrizované dotazy máš pravdu, ale častěji se setkávám s označením jako připravené, nebo předpřipravené dotazy... Jedná se pouze o překlad.

Jinak opravdu pěkný článek, vše podstatné jsi vystihl.

Editované 15.4.2014 21:22
Odpovedať
15.4.2014 21:20
Na světě je 10 typů lidí. Ti, kteří rozumí binárce a ti co nerozumí.
Avatar
asanos
Člen
Avatar
asanos:15.4.2014 21:44

Ohledně tohohle:

'; TRUNCATE TABLE user;--

Zkoušel jsi to?
__________________
Vím, že mysql_query() nepodporuje řetězení dotazů, čili tam by to nešlo, ale jak je na tom PDO::query?

Odpovedať
15.4.2014 21:44
Na světě je 10 typů lidí. Ti, kteří rozumí binárce a ti co nerozumí.
Avatar
FastNode
Tvůrce
Avatar
FastNode:19.4.2014 12:32

Ještě jsem si rád zvykl na nastavování oprávnění pro každou webovou aplikaci, tzn. jedna databáze = jeden účet. Kromě toho také omezuji povolené příkazy na ty co reálně používám: většinou jen SELECT, INSERT a UPDATE, globální oprávnění pro jednotlivé účty nedávám.

 
Odpovedať
19.4.2014 12:32
Avatar
asanos
Člen
Avatar
Odpovedá na FastNode
asanos:19.4.2014 17:06

JJ, omezením počtu příkazů SELECT zabraňuješ útoku Brute force na přihlašovací formulář.
A ještě použít nějakou pomalou hashovací funkci například Blowfish, pomocí crypt() + salt $2y$, se sílou větší jak 10, nejen pro zesílení, ale především pro "zpomalení".

Odpovedať
19.4.2014 17:06
Na světě je 10 typů lidí. Ti, kteří rozumí binárce a ti co nerozumí.
Avatar
TrollKill
Člen
Avatar
TrollKill:15.9.2014 13:27

Dobry clanok :D

 
Odpovedať
15.9.2014 13:27
Avatar
Patrik Neumann:31.7.2016 14:10

Ahoj, zkouším to mysqli_real_es­cape_string, ale vrací to prázdný řetězec, co s tím?

Odpovedať
31.7.2016 14:10
Nic není nemožné, proto se snažím dál.
Avatar
Odpovedať
31.7.2016 14:33
Nic není nemožné, proto se snažím dál.
Avatar
mkub
Tvůrce
Avatar
Odpovedá na Patrik Neumann
mkub:31.7.2016 16:52

este lepsie by hadam bolo PDO namiesto mysqli ;)

a keby si rozisal svoj problem a napisal riesenie problemu by tiez nezaskodilo pre inych, ktorym sa vyskytne podobny pripad...

 
Odpovedať
31.7.2016 16:52
Avatar
Odpovedá na mkub
Patrik Neumann:31.7.2016 20:07

špatný kód:

mysqli_real_escape_string(string $pole)

řešení:

mysqli_real_escape_string(string $connection, string $pole)
Odpovedať
31.7.2016 20:07
Nic není nemožné, proto se snažím dál.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!