Autor | Zpráva | ||
---|---|---|---|
Slash24 Profil * |
#1 · Zasláno: 5. 9. 2011, 21:03:38
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 |
#2 · Zasláno: 5. 9. 2011, 21:07:28 · Upravil/a: pcmanik
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 |
#3 · Zasláno: 5. 9. 2011, 21:43:22
[#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 * |
#4 · Zasláno: 5. 9. 2011, 22:40:05
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 |
#5 · Zasláno: 5. 9. 2011, 23:13:35
[#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 |
#6 · Zasláno: 6. 9. 2011, 08:31:31
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"]); 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 |
#7 · Zasláno: 6. 9. 2011, 10:03:42
"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). |
||
Časová prodleva: 13 let
|
0