webForumDet fria alternativet

Databassäkerhet.

9 svar · 521 visningar · startad av ConnyFox

ConnyFoxMedlem sedan aug. 20011 087 inlägg
#1

Hur kan man skydda sig 100%igt mot SQL-injections?

Jag byter ut alla ' mot ''
Kollar om alla strängar som skall innehålla ett tal verkligen bara innehåller med cLng ett tal och kör HTML.Encode på mina andra strängar där det är möjligt.

Känner dock att jag antagligen inte är särskillt säker trots detta. vad kan man mer göra för att vara helt 100 på att slippa att folk bråkar med ens databaser.

Läste denna artikeln
http://www.aspsidan.nu/default.asp?page=readArticle&menu=2&aId=334

Men om jag har förstått det hela rätt så hjälper det bara när det är tal coh inte alls när det är annan information som skall in i databasen. Eller är jag helt ute och simmar i fel sjö?

fredrikMedlem sedan dec. 19991 072 inlägg
#2

Att skydda sig helt till 100% mot en attack är alltid svårt, då det räcker med att ett litet misstag gjort någonstans längs vägen. Det är därför mycket viktigt att ha med säkerheten i ett tidigt stadium vid projektering och utveckling.
Just mot SQL-injection så finns det ett par saker att tänka på.

1. Använd parameteriserade frågor. Då all data då skickas som enskilda parametrar så kan inte ' användas för att "skriva om" och konkatenera ihop nya värden till SQL-strängen.

2. Specificera längden på strängar. Om du vet att en sträng alltid ska vara 3 tecken lång så finns det ingen anledning att tillåta den att vara längre.

3. Datatyp. Validera alltid att alla inparametrar har rätt datatyp. Dvs. ett numeriskt värde ska inte kunna innehålla annat än siffror.

4. ServerVariables. Tänk på att om du tex. använder HTTP_REFERER eller HTTP_USER_AGENT till något så går den lätt att ändra, vilket kan utnyttjas till SQL-injection. Validera alltså inte bara post och querystrings.

5. Betrakta all indata som felaktig och ond, tills motsatsen har bekräftats! Detta är kanske den allra viktigaste "reglen".

6. Använd inte dynamiskt skapad SQL i SP. Även om du då använder parameteriserade frågor från tex. ASP, kan dessa utnyttjas i den skapade strängen.

Mot "Cross Site Scripting" skyddar man sig bäst med att använda HTMLEncode på all data som ska visas upp.

Swesecure.com har flera artiklar inom webbsäkerhet, bla. en om SQL-injection som du hittar här:
http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=29a58b01-ca79-4877-b924-4f5da18d4a2a

ConnyFoxMedlem sedan aug. 20011 087 inlägg
#3

Ok..

1. paramativadå?! Det där får du gärna förkalra närmare ;)
2. Hur specificerar man längden på en sträng?
6. Vad är dynamiskt skapad sql och vad är SP? :D

Som du märker e jag inget proffs på detta utan behöver lite förklaringar..

daniiMedlem sedan sep. 2004215 inlägg
#4

När jag gör en inloggning (php) så kollar jag först om lösenordet och användarnamnet innehåller $ " ' { } \ Om den gör det så kör jag inte databasuppkopplingen.

fredrikMedlem sedan dec. 19991 072 inlägg
#5

Ok! Inga problem! Ledsen om mitt svar inte var så förtydligat!

Parmeteriserad fråga. Istället för att man bygger ihop en SQL-sträng med konkatenering används istället "parametrar", där varje indata-värde alltså blir en egen parameter.

Detta används ofta när man använder SP (Stored Procedures / Lagrade Procedures), vilket är ett sätt att skapa kompilerade SQL-strängar i SQL-server (kan jämföras lite med "Frågor" i Access).

Hur som helst så kan man även använda parametrar mot tex. Access (som jag utgår från att du använder). För att exekvera din fråga använder du nu Command-objektet. Exempel:

Dim cmd
Set cmd = server.createobject("adodb.command")
cmd.activeConnection = "DIN_CONNECTION"

Dim SQL
SQL = "SELECT ID, Name, SurName, State FROM tblEmp WHERE (ID=? AND State=?)"

cmd.CommandText = SQL

Dim rs
Dim lngID
Dim strState

lngID = CLng(Request.QueryString("ID")) 'Tex 5
StrState = Request.querystring("State") 'Tex "CA"

SET rs = cmd.Execute (, array(lngID, strState))

"rs" innehåller nu ett "vanligt" Recordset objekt, och du har samtidigt skyddat dig mot SQL-injections mha en parameteriserad fråga.

Att skydda sig mot längd kan vara så enkelt som att tex. göra:

StrState = LEFT(Request.querystring("State"), 2) 'Tex "CA"

om du tex. vet att State alltid är just 2 tecken långt. Det innebär ju att på 2 tecken kan man inte skriva speciellt mycket farlig kod, om nånting ändå skulle gå fel med parametrar.

ConnyFoxMedlem sedan aug. 20011 087 inlägg
#6

ok tack så mycket skall i fortsättningen göra på det viset du anvisat här övanför!

ConnyFoxMedlem sedan aug. 20011 087 inlägg
#7

hur skulle ovanstående sätt att skydda sig mot sql-injections se ut när man t.ex använder en insert istället?

såhär?
SQL = "insert into tid (kund, datum, tid, notering) Values(?,?,?,?) "

fredrikMedlem sedan dec. 19991 072 inlägg
#8

Japp! Precis så. Sen anger du dina värden för respektive parameter vid "Execute" (se tidigare exempel).

Då värderna nu behandlas som enskilda parametrar och inte som en del av strängen så behöver du inte ens byta ut '-tecken längre, du har alltså skydd mot det.

Beroende på hur det använder din data kan du även behöva skydda dig mot såkallad "Cross Site Scripting" (eller "Script Injection"). Detta är en teknik som kan användas för att tex. kapa sessions. Mer om detta kan du läsa om under webbsäkerhet på swesecure:
http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&CP=

ConnyFoxMedlem sedan aug. 20011 087 inlägg
#9

Föresten kom på en sak, där det står "DIN_CONNECTION", vad är det för något man skall skriva där?

@ndersMedlem sedan juni 200032 969 inlägg
#10

Namnet på ditt connectionobjekt (inga citationstecken runt dock).

256 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
132 ms — hämta forumlista (db)
121 ms — hämta statistik (db)
132 ms — hämta tråd, inlägg och bilagor (db)