Forum » Izdelava spletišč » SQL injection
SQL injection
adrian007 ::
Torej.. prišel sem do odgovorov da je za sql varnost potrebno uporabljati addslashes() in mysql_escape_string().
Katere so še druge stvari s katerimi lahko zaščitiš napade na sql?
Katere so še druge stvari s katerimi lahko zaščitiš napade na sql?
Zzzzzzz ::
ena izmed (dobrih) stvari je tudi predvidevanje vnosa.
primer: če npr. veš, da bo poslan parameter številka (npr. id zapisa v bazo), preveri, če je tudi res številka ali pa če pričakuješ točno določen string, uporabi regular expressions, da preveriš, če je pravi
primer: če npr. veš, da bo poslan parameter številka (npr. id zapisa v bazo), preveri, če je tudi res številka ali pa če pričakuješ točno določen string, uporabi regular expressions, da preveriš, če je pravi
Sergio ::
A PHP ne pozna Prepared statementov?
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.
če usoda ustavi mu korak,
on se ji zoperstavi.
Ziga Dolhar ::
"PHP" jih pozna. Je pa to bolj stvar podatkovnega gonilnika oz. vmesnika za komuniciranje z njim.
https://dolhar.si/
Zgodovina sprememb…
- spremenil: Ziga Dolhar ()
Reso ::
Napadi so lahko tudi brez sql injectiona. Drugače pa ti ni treba uporabljati mysql_escape_string() ampak lahko typecastas vhodno spremenljivko v int, če veš da more biti vnos tipa int (tako kot je Zvonko rekel).
Primer napada brez sql injectiona je naprimer spreminjanje posta v forumu. Pri slabi kodi se ti lahko pojavi prijavljen uporabnik, ki sporoči id posta od drugega uporabnika in spremeni drugemu uporabniku post. Rešitev je čisto enostavno in je "UPDATE ..... WHERE id=$POST['id'] AND Owner=$UserId". Napačna koda pri update sql stavku nima "AND Owner=$UserId".
Malo se poglobi v logične stvari programa in preveri če imaš znotraj sql stavkov v pogoju vse kar je tebi na prvi pogled logično in mora vedno biti.
Primer napada brez sql injectiona je naprimer spreminjanje posta v forumu. Pri slabi kodi se ti lahko pojavi prijavljen uporabnik, ki sporoči id posta od drugega uporabnika in spremeni drugemu uporabniku post. Rešitev je čisto enostavno in je "UPDATE ..... WHERE id=$POST['id'] AND Owner=$UserId". Napačna koda pri update sql stavku nima "AND Owner=$UserId".
Malo se poglobi v logične stvari programa in preveri če imaš znotraj sql stavkov v pogoju vse kar je tebi na prvi pogled logično in mora vedno biti.
Brilko ::
Najbolj se lahka ušteješ v primeru, da ti nekdo noter vrine OR 1=1
Sej če maš magic quets vklopljene, nerabiš več filtrirat za slashi pri pridobivanju pdoatkov preko REQUESTO-ov...
Sej če maš magic quets vklopljene, nerabiš več filtrirat za slashi pri pridobivanju pdoatkov preko REQUESTO-ov...
CCfly ::
ADOdb in pear::db lepo poskrbita da so sql stavki ustrezno urejeni ("prepared").
"My goodness, we forgot generics!" -- Danny Kalev
AndrejS ::
MS SQL server pozna storedProcedures, za mySQL pa ne vem... tam pa ne more prit do SQL injection!
CCfly ::
Ne mislit, da so stored procedure univerzalna rešitev in da tam ne more priti do SQL injection napada. Pri stored proceduraš lahko dinamično generiraš SQL poizvedbe, kar pomeni da si v takem primeru sledil ljudskemu pregovoru, kjer greš iz dežja pod škaf. Boljša je politika: "All input is evil" pa če uporabljaš samo osnovne operacije, stored procedure, parametrizirane poizvedbe, ....
"My goodness, we forgot generics!" -- Danny Kalev
AndrejS ::
CCFly z MS orodji gre nekako takole :
With sqlCommand
.Connection = sqlConnection
.CommandType = CommandType.StoredProcedure
.CommandText = "spNekaj"
End With
With sqlCommand.Parameters
.Add("@RowGuid", SqlDbType.UniqueIdentifier).Value = newMessage.Guid
.Add("@ParentGuid", SqlDbType.UniqueIdentifier).Value = newMessage.ParentGuid
.Add("@ComposerGuid", SqlDbType.UniqueIdentifier).Value = newMessage.Composer.Guid
.Add("@Requests", SqlDbType.TinyInt).Value = newMessage.Requests
End With
Zdaj pa mi povej kje lahko tu pride do SQL injection !!!
With sqlCommand
.Connection = sqlConnection
.CommandType = CommandType.StoredProcedure
.CommandText = "spNekaj"
End With
With sqlCommand.Parameters
.Add("@RowGuid", SqlDbType.UniqueIdentifier).Value = newMessage.Guid
.Add("@ParentGuid", SqlDbType.UniqueIdentifier).Value = newMessage.ParentGuid
.Add("@ComposerGuid", SqlDbType.UniqueIdentifier).Value = newMessage.Composer.Guid
.Add("@Requests", SqlDbType.TinyInt).Value = newMessage.Requests
End With
Zdaj pa mi povej kje lahko tu pride do SQL injection !!!
CCfly ::
Seveda, takoj ko mi ti najdeš napako v mojem umotvoru:
echo "AndrejS bo še enkrat prebral sporočilo enega od kolegov v debati, kjer sodeluje, in ne bo dodajal nepotrebnih klicajev v svoja sporočila."
SQL injection je pri uporabi stored procedur možen že ko v tej npr. stakneš skupaj dva niza (recimo kakšna implementacija iskanja). Nisem rekel, da se je zato potrebno izogibati stored procedur ali da so te slaba izbira, trdim pa da možnost zlorabe obstaja. Zaradi tega ne vidim razloga, da ne bi ustezno preverili podatkov, še preden izvršiš poizvedbo, že na aplikacijskem nivoju.
echo "AndrejS bo še enkrat prebral sporočilo enega od kolegov v debati, kjer sodeluje, in ne bo dodajal nepotrebnih klicajev v svoja sporočila."
SQL injection je pri uporabi stored procedur možen že ko v tej npr. stakneš skupaj dva niza (recimo kakšna implementacija iskanja). Nisem rekel, da se je zato potrebno izogibati stored procedur ali da so te slaba izbira, trdim pa da možnost zlorabe obstaja. Zaradi tega ne vidim razloga, da ne bi ustezno preverili podatkov, še preden izvršiš poizvedbo, že na aplikacijskem nivoju.
"My goodness, we forgot generics!" -- Danny Kalev
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | PHP in objektno programiranje (strani: 1 2 )Oddelek: Programiranje | 12149 (10616) | kivi113 |
» | Statistika dijakov, pomocOddelek: Programiranje | 1794 (1278) | Mitja Bonča |
» | Sql (.NET) problemOddelek: Programiranje | 1135 (1006) | CWIZO |
» | PHP KodiranjeOddelek: Izdelava spletišč | 1487 (1364) | sverde21 |
» | Izvorna koda mojega par dnevnega dela; ce jo malo pokomentirate :) (strani: 1 2 )Oddelek: Programiranje | 6469 (4814) | Microsoft |