Gå til innhold

Beskyttelse mot SQL injisering


Anbefalte innlegg

Videoannonse
Annonse

Den letteste måten å bruke SQL-injection på er jo dersom koden din setter sammen SQL-strengen dynamisk, altså noe slikt:

 

string sql = "SELECT id, name FROM users WHERE username = '" + txtUser.Text + "' AND password = '" + txtPassword.Text + "'";

 

Dette er jo skikkelig fy-fy.

Du løser dette best ved å bruke lagrede prosedyrer med parametre. Det er også mulig å bruke dynamisk SQL med parametre. Det finnes masse artikler om dette. F.eks. denne på MSDN.

 

Øyvind.

Endret av oyvind_b
Lenke til kommentar

HVa om jeg ikke skriver sql setningene selv, men lar VS gjøre det? ved at jeg f.eks drar en sql database til Design-vinduet, da settes jo det meste opp selv. Er dette Stored Procedure, eller er dette også fy-fy?

 

Noe annet jeg lurer på er om sql injection er fare om jeg bare skal hente ut data, eller om det bare er fare når sql-setningen skal legge data inn i databasen.

Lenke til kommentar

Hva mener du men hente ut av databasen?

 

I et søkefelt f.eks kan man injisere sql, man kan gjøre det over alt.

SQL Injisering er jo å bygge enge SQL setninger i tilleg til den programmet ditt utfører.

 

F.eks.

På min webside (oppgitt i første post) kan man sette dette inn i søk, det vil lage en ny brukerkonto med lol som passord :( :(

 

lol'; INSERT INTO acronym.users (Uname, Passwd) VALUES ('Hacked', '9cdfb439c7876e703e307864c9167a15'); 'x'='x

Endret av ze5400
Lenke til kommentar
HVa om jeg ikke skriver sql setningene selv, men lar VS gjøre det? ved at jeg f.eks drar en sql database til Design-vinduet, da settes jo det meste opp selv. Er dette Stored Procedure, eller er dette også fy-fy?

 

Noe annet jeg lurer på er om sql injection er fare om jeg bare skal hente ut data, eller om det bare er fare når sql-setningen skal legge data inn i databasen.

5725645[/snapback]

 

SQL-injections er en fare uansett hvilke SQL kommandoer du kjører (det være seg DDL's, DML eller DCL) hvis du ikke bruker parametre.

 

Les artikkelen det henvises til så vil du skjønne mer.

 

Jeg har alrdi latt VS ta kontroll over mine SQL statements. Jeg har sett hva slags galskap SQLCommandBuilder er i stand til å lage, så jeg anbefaler deg å skrive dine egne kommandoer.

Lenke til kommentar

Hehe, neida lars, jeg spør bergetun

 

EDIT: Gløym det, lesta artiklen nå...

 

EDIT2: Det så litt vansklig ut; kan jeg ikke bare sjekke etter "onde" ord får sql'en eksekuteres; og eventuelt blokke spørringen hvis den inneholder f.eks "INSERT", "DROP", "UPDATE", "DELETE"?

Endret av ze5400
Lenke til kommentar
Hehe, neida lars, jeg spør bergetun

 

EDIT: Gløym det, lesta artiklen nå...

 

EDIT2: Det så litt vansklig ut; kan jeg ikke bare sjekke etter "onde" ord får sql'en eksekuteres; og eventuelt blokke spørringen hvis den inneholder f.eks "INSERT", "DROP", "UPDATE", "DELETE"?

5738972[/snapback]

Det beste er absolutt å bruke lagra prosedyrer. Gjør det.

Et alternativ er, ihvertfall i teorien, å lete etter fnutter og SQL-kommentarer. (' og --) Det er mye vanskeligere å gjøre et vellykket angrep uten disse. Ikke let etter INSERT, UPDATE eller tilsvarende; det er altfor mange ord som kan skape problemer. ('; DROP TABLE users)

(hvorfor kommentar? Vel, SELECT * FROM users WHERE name='name' AND pwd='mama' AND type='admin' kan være en sql for å sjekke om påloggende bruker er admin. Gjett brukernavn, og du trenger ikke passord. (admin'--))

 

- grå -

Lenke til kommentar
Hehe, neida lars, jeg spør bergetun

 

EDIT: Gløym det, lesta artiklen nå...

 

EDIT2: Det så litt vansklig ut; kan jeg ikke bare sjekke etter "onde" ord får sql'en eksekuteres; og eventuelt blokke spørringen hvis den inneholder f.eks "INSERT", "DROP", "UPDATE", "DELETE"?

5738972[/snapback]

Det beste er absolutt å bruke lagra prosedyrer. Gjør det.

Et alternativ er, ihvertfall i teorien, å lete etter fnutter og SQL-kommentarer. (' og --) Det er mye vanskeligere å gjøre et vellykket angrep uten disse. Ikke let etter INSERT, UPDATE eller tilsvarende; det er altfor mange ord som kan skape problemer. ('; DROP TABLE users)

(hvorfor kommentar? Vel, SELECT * FROM users WHERE name='name' AND pwd='mama' AND type='admin' kan være en sql for å sjekke om påloggende bruker er admin. Gjett brukernavn, og du trenger ikke passord. (admin'--))

 

- grå -

5739956[/snapback]

 

Stored procedures er å anbefale for de fleste standardoppgaver i en database, men det er ikke noen sikring mot SQL-injisering så lenge klientkoden ikke benytter parametre. Hvis en bruker parametre så slipper en å sjekket input-strengen. Dessuten er det en komplisert oppgave å sjekke etter SQL-injiseringen selv.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...