Avatar billede mrbart Nybegynder
04. september 2007 - 11:57 Der er 14 kommentarer og
1 løsning

ASP - SQL Injtections

Jeg har et problem..

Jeg kører en hjemmeside, hvor jeg op til flere gange er blevet angrebet at SQL Injections..

Nu ska det være slut, så jeg søger en som kan hjælpe mig med at rette op på dette problem..

Jeg er villig til at betale mig fra det..

Jeg håber nogen kan/vil hjælpe mig..

-Bart
Avatar billede fennec Nybegynder
04. september 2007 - 12:02 #1
Du skal bare sørge for at alle ' tegn bliver exsaped ved at bytte dem ud med 2. Det laver man ofte en funktion til:

function DBText(fText)
  DBTExt = replace(fText&"","'","''")
end function

Så kalder du bare den i alle dine input felter, som indgår i en SQL:

sql = "select * from brugere where brugernavn='"& DBText(request.form("brugernavn")) &"' and prugerPass='"& DBText(request.form("prugerpass")) &"'"
Avatar billede fennec Nybegynder
04. september 2007 - 12:06 #2
Det samme kan du gøre med tal og datoer, så du er sikker på at de er rigtige og rigtig formateret.

function DBNum(fNum)
  DBNum = replace(cDbl(fNum&""),",",".")
end function

function DBDate(byVal fDate)
  fDate = cDate(fDate)
  DBDate = year(fDate) &"-"& right("0"&month(fDate)) &"-"& right("0"&day(fDate))
end function
Avatar billede pierrehusted Nybegynder
04. september 2007 - 13:38 #3
Som Fennec skriver, så er ' ofte hovedproblemet.

Du kan også sikre dig yderligere ved at generelt validere dataene inden de lægges i databasen - og aldrig bruge request("formfelt") direkte i SQL (eller hvordan du nu får parametre i det programmeringssprog du bruger.

Hvis de data der skal indsættes er et tal, så kontroller om de data der kommer er et tal. Hvis der skal komme en dato, så kontroller at det er. Etc.

Men faktisk er det mere et spørgsmål, som burde stilles under det programmeringssprog du anvender - da valideringen bør ske inden der sendes noget til databasen.


Bruger du ASP, så er her et par funktioner, som du kan bruge:

function safeget( field )  '  Henter data udfra request-navn
    safeget = replace(request(field), "'", "´")
end function

function safegetRAW( field )
    safegetRAW = replace(field, "'", "´")
end function

FUNCTION GetNumber_Default(ByVal req_name, ByVal default)  '  Henter data og giver en default værdi hvis der ikke kommer et tal
  If IsNumeric(request(req_name)) And Len(request(req_name)) > 0 Then
    tmp = CLng(request(req_name))
  Else
    tmp = default
  End If
  GetNumber_Default = tmp
END FUNCTION  '  GetNumber_Default

FUNCTION Rens(byval tekst)  '  Fjerner <> så man ikke kan indsætte fungerende javascript
    Rens = trim(replace(replace(replace("" & tekst, "'", "´"), "<", "&lt;"), ">", "&gt;"))
END FUNCTION  '  Rens
Avatar billede pierrehusted Nybegynder
04. september 2007 - 13:39 #4
Og så fik jeg faktisk læst overskriften...  Du bruger jo ASP  :)
Så brug de FUNCTIONS jeg har sat ind - de kan tage det meste.
Avatar billede mrbart Nybegynder
04. september 2007 - 14:07 #5
Er der evt. en som vil hjælpe mig med at sætte det ind?? eller hvordan??

på forhånd Tak
Avatar billede pierrehusted Nybegynder
04. september 2007 - 14:15 #6
Det kommer helt an på hvilke data du skal smide i databasen.

Lad os se den nuværende kode, så er der noget at gå ud fra.
Avatar billede fennec Nybegynder
04. september 2007 - 14:16 #7
Se mit eks i første post. Du skal bare have den funktion et sted på siden, også bruger du det i SQL sætningern som jeg har vist.
Avatar billede arne_v Ekspert
04. september 2007 - 15:04 #8
Paa trods af at det ikke er saa alment kendt kan man faktisk bruge parameters i ADO
(og dermed i ASP).

Det er nok den nemmeste maade at loese problemet paa.
Avatar billede fennec Nybegynder
04. september 2007 - 15:20 #9
arne >>
Kan du ikke lige smide et eks, for det eneste jeg kan huske er indsættelse/update syntaxen:

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "PROVIDER=MSDASQL;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("db.mdb") & ";UID=admin;PWD=;"
Set rs = Server.CreateObject(\"ADODB.RecordSet\")
strSQL = "Select * From tabel"
rs.Open strSQL, Conn, 1, 3
rs.AddNew
rs("tekstKol") = "hej O'Conor"
rs("talKol") = 123.45
rs("datoKol") = date
rs.Update
rs.Close
Set rs = Nothing

Har faktisk ingen andelse om hvordan man bruger det i select uden rs.filter...
Avatar billede mrbart Nybegynder
04. september 2007 - 22:20 #10
Er der evt. en som jeg kan tilføje MSN, og så hjælpe mig??

Der var nemlig en gut i sin tid som hjælp mig..

-Bart
Avatar billede arne_v Ekspert
05. september 2007 - 01:38 #11
<%
adParamInput = 1
adVarChar = 200
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;;"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
cmd.CommandText = "SELECT COUNT(*) AS n FROM myusers WHERE un = @un AND pw = @pw"
cmd.Parameters.Append(cmd.CreateParameter("@un", adVarChar, adParamInput, 32))
cmd.Parameters.Append(cmd.CreateParameter("@pw", adVarChar, adParamInput, 32))
cmd.Parameters("@un") = "arne"
cmd.Parameters("@pw") = "duerikke"
Set rs = cmd.Execute
Response.Write rs("n")
Set rs = Nothing
Set cmd = Nothing
Set con = Nothing
%>
Avatar billede arne_v Ekspert
05. september 2007 - 01:38 #12
<%
' open
adParamInput = 1
adInteger = 3
adDate = 7
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;;"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
' lige ud af landevejen
con.Execute "INSERT INTO params(id,tid) VALUES(1,'7-JUN-2005')"
' med kommando
cmd.CommandText = "INSERT INTO params(id,tid) VALUES(2,'8-JUN-2005')"
cmd.Execute
' med kommando og parametre
cmd.CommandText = "INSERT INTO params(id,tid) VALUES(@id,@tid)"
cmd.Parameters.Append(cmd.CreateParameter("@id", adInteger, adParamInput))
cmd.Parameters.Append(cmd.CreateParameter("@tid", adDate, adParamInput))
cmd.Parameters("@id") = 3
cmd.Parameters("@tid") = CDate("9-JUN-2005")
cmd.Execute
' close
Set cmd = Nothing
Set con = Nothing
%>
OK
Avatar billede fennec Nybegynder
05. september 2007 - 08:30 #13
mrbart >>
Det er altså ikke så svært, du har fået alt kode og eksempel på hvordan det skal bruges. Men er du total kode-analfabeter vil jeg anbefale at du oprette et ? i ASP kategorien med alt din kode fra en side (f.eks din login side), hvor du spørger om hvordan den gøres sikker.

Desuden:
§2.1.13: Det er ikke tilladt at tildele point for en opgave løst uden om Eksperten.dk (f.eks. opgaver løst via mail, ICQ eller telefon), eller blot et andet spørgsmål på Eksperten.dk (lovlig pointoverførsel undtaget).
Avatar billede mrbart Nybegynder
18. september 2007 - 22:37 #14
Jeg vil gerne af med nogle point.. Jeg tror nemlig muligvis jeg har fundet ud af det..;)

-Bart
Avatar billede fennec Nybegynder
23. september 2007 - 16:49 #15
.o) <-- One Eyed Jack
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB