Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

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
Posledné komentáre sú na spodnej časti poslednej stránky.
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é
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é
Odpovedať
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ť
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.

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ť
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

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ť
Nic není nemožné, proto se snažím dál.
Avatar
Odpovedať
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...

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ť
Nic není nemožné, proto se snažím dál.
Posledné komentáre sú na spodnej časti poslednej stránky.
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.

Zobrazené 10 správy z 18.