Autor Zpráva
Slash24
Profil *
Chcem sa spýtať ako zabezpečujete svoje aplikácie proti SQL injection.

Postačuje ak vstupné dáta preženiem funkiou mysql_real_escape_string alebo je táto ochrana nepostačujúca ?

V diskusii na inom fóre niekto napísal že aj pri použití tejto funkcie sa dá vykonať SAQ injection. Diskusia tu.
pcmanik
Profil
Slash24:
Nie sql injection sa neda potom vykonat. A ano ochrana je dostatocna, na cisla ti potom staci intval()

Alebo mozes pouzit prepare statement, potom nemusis riesit tieto ochrany, nakolko sa s dotazom a datami pracuje oddelene.
Alphard
Profil
[#1] Slash24
Na té diskusi autor rozepsal i důvod svého tvrzení. Zdá se mi to ale jako dost extrémní případ, protože běžně by porovnání neuvozeného řetězce selhalo, takže by to tak snad nikdo nenechal.
Když to shrnu, řetězce ošetřit mysql_real_escape_string() a obalit apostrofy, čísla explicitně přetypovat na čísla (ne nutně integer) a raději nedávat do apostrofů.
Slash24
Profil *
Akogard:
Když to shrnu, řetězce ošetřit mysql_real_escape_string() a obalit apostrofy, čísla explicitně přetypovat na čísla (ne nutně integer) a raději nedávat do apostrofů.

Nevšimol som si že tam uviedol ak by $username a $password boli bez apostrofov.

Takže ak mám nasledujúci kód
function query($table) {
  $table = mysql_real_escape_string($table);
  $sql = "SELECT * FROM ".$table;  
}

kód stále nieje zabezpečený dostatočne.

Ale ak ho upravím
function query($table) {
  $table = mysql_real_escape_string($table);
  $sql = "SELECT * FROM '".$table."'";  
}

tak by zabezpečenie malo byť dostatočné.

Ešte by som sa ale chcel spýtať prečo čísla radšej nedávať do apostrofov ?
Alphard
Profil
[#4] Slash24
Jméno tabulky v apostrofech nebude fungovat (když už, tak zpětné). Dosazovat ale jméno tabulky na základě uživatelského vstupu je dost netypické. Když se mluví o ošetření sql injection, obvykle se myslí ošetření parametrů pro porovnání ve where, ošetření vkládaných dat apod. Na tento případ jsem odpovídal.
Při výběru tabulky by měla přijít nějaká chytřejší funkce, zřejmě kontrola proti white listu. Asi nechcete, aby se podvržením dat daly vypsat všechny sloupce tabulky users...

Ešte by som sa ale chcel spýtať prečo čísla radšej nedávať do apostrofov ?
Čísla do apostrofů nepatří, všeobecně v programování. To, že v nich fungují, je jen benevolence PHP a MySQL, v hodně jiných jazycích by to nešlo.
Joker
Profil
Slash24:
Ještě dodám, že mysql_real_escape_string se používá pro řetězce, jak už napovídá „string“ v názvu.
Pokud jde o číslo, použije se třeba intval:
$sql = "SELECT sloupec FROM tabulka WHERE cislo > ".intval($_GET["cislo"]);
Jestliže vstup může být hodnota z nějaké dané množiny, což je tento případ, je nejlepší kontrolovat, zda se vstup skutečně v té množině nachází (to je ten whitelist jak píše Alphard).

Ale stejně jako Alphardovi mi přijde zvláštní, že by se do dotazu na základě uživatelského vstupu doplňovala tabulka.
peta
Profil
"hodnota z nějaké dané množiny" in_array
Proste je dobre kazdou hodnotu od uzivatele proverit, co je to zac a pripadne mu z tama odmazat nezadouci znaky (casto lide kopiruji neco z mailu a oznaci i s mezerou na konci a pak se divi, ze jim heslo nefunguje).

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0