Avatar billede radiohead Nybegynder
27. november 2006 - 23:47 Der er 17 kommentarer og
1 løsning

Hmm.. Sikkerhed og Querystrings

Jeg har mig et nyhedssystem. Når man klikker sig ind på en specifik nyhed, kommer querystringen til at se sådan her ud:

default.asp?action=news&id=82

I SQL'en selecter den where id=Querystring("id")

Så kom jeg jo til at tænke, at det ikke var særlig sikkert..?

Eller hvad?

Skal jeg lave noget ''-replace eller er der ingen fare?
Avatar billede Slettet bruger
27. november 2006 - 23:55 #1
tjae - om det er sikkert eller ej er jo et godt spørgsmål... men du kan jo eventuelt lave det med sessions i stedet...
noget a la det her:

<%
if request.querystring("id")<>"" then
session("id")=request.querystring("id")
response.redirect request.servervariables("script_name")
end if
%>

- hvis du sætter denne kode i toppen af din side så gemmer den querystringens indhold i en session i stedet og redirecter til samme side igen og hvor vi så skal kigge i databasen...
din select skal derfor være id=session("id")
og vupti... querystringen er pist væk...

\Dan
Avatar billede radiohead Nybegynder
28. november 2006 - 00:00 #2
ahh smart - Det vil jeg huske fremover.
Problemet er, at jeg sidder med et næstent færdigt site, og vil helst ikke begive mig ud i ændringer, der tager for lang tid.

Men jeg tænkte over om man kunne skrive SQL-injections i querystringen - f.eks DROP TABLE eller noget...

Hvad gør "request.servervariables("script_name")" for øvrigt? :)
Avatar billede morhan Novice
28. november 2006 - 00:16 #3
du laver noget validering på input, før du sammensætter din sql..

id = Request.QueryString("id")

If Not IsNumeric(id) Then
  'afslut, eller sæt id=0
  id = 0
End If

sql = "... where id=" & id
Avatar billede radiohead Nybegynder
28. november 2006 - 00:53 #4
morhan

Den sikrer vel kun at det der står efter id'et, er et tal...?
Men hvad så hvis en evt. hacker bare erstatter "id" med noget andet: eks:
default.asp?action=news&TEST=(også noget sql-fis)


Ved ikke om det kan lade sig gøre..?

Håber i forstår
Jeg vender tilbage i morgen
Avatar billede Slettet bruger
28. november 2006 - 00:56 #5
- morhan>> Det fjerner jo ikke querystringen... det tjekker jo blot om sql'en er nummeric og er den så ikke det sker der ikke mere... men det forhindrer jo ikke brugeren i at kunne se at der bruges querystrings og så at kunne indtaste querystrings selv...

- radiohead>> request.servervariables("script_name") fremkalder bare den virtuelle adresse på den pågældende side... sådan at ligegyldigt hvad din asp-side hedder så redirecter den altid til det rigtige... Du kan i øvrigt indsætte min kode uden stort besvær... du skal bare indsætte den i toppen og så lave en lille smule om på din select-sætning... Men hvad mener du med DROP TABLE?

\Dan
Avatar billede morhan Novice
28. november 2006 - 07:08 #6
hvis du fjerner id fra strengen, så er der vel ikke noget problem. kun id indsættes i sqlen. TEST vil ikke sættes ind, og dermed er der ingen mulighed for injektion

dannielsen, du gemmer urlen i en sessionvar, og efterfølgende indsætter indholdet af sessionvar i sqlen. hvor er forskellen?
Avatar billede radiohead Nybegynder
28. november 2006 - 17:04 #7
dannielsen... Smider du et svar?

Med "Drop table" mente jeg bare SQL-injection eller noget... Nevermind :)
Avatar billede morhan Novice
28. november 2006 - 17:07 #8
jeg ved ikke om du er helt med, men at gemme urlvariablen i sessionen først, forhindrer ikke sql injektion
Avatar billede radiohead Nybegynder
28. november 2006 - 17:10 #9
Forresten... Ofte vil man jo gerne have mere end bare id'et med

Hvad med eventuelle actions fra querystringen osv...

Bliver det ikke hurtigt en kompliceret omgang, hvis ofte har masser af info i queryen?
Avatar billede radiohead Nybegynder
28. november 2006 - 17:14 #10
Morhan - Det tænkte jeg også over...

Lige nu replacer jeg ' med ingenting

Altså replace(request.Querystring("id"), "'", "")

Ved ikke om det overhovedet giver noget sikkerhed :D
Avatar billede morhan Novice
28. november 2006 - 17:17 #11
det hjælper kun, hvis du indsætter strengværdier, hvor ' bruges til at markere start og slut på værdien

i den sql du viser her, har det ingen effekt. f.eks. hvis id antager "1; drop table"
så hjælper det ikke meget at erstatte ' med ingenting, for der slet ingen apostroffer i inputtet
Avatar billede radiohead Nybegynder
28. november 2006 - 17:37 #12
hmm, nej det har du ret i...

Men for øvrigt burde der jo ikke være nogen fare, når databasen er låst. Ingen "skrive-adgang".

Du ved de der attributter man sætter (,2,2)
Avatar billede steen_hansen Forsker
28. november 2006 - 17:46 #13
radiohead: Jeg har fulgt lidt med, men hvad er det for nogle attributter?
Avatar billede morhan Novice
28. november 2006 - 18:11 #14
lad os antage du udtrækker overskrift og indhold fra din nyhedstabel..

select overskrift,indhold from nyheder where id = {id}

ud over nyheder har du en tabel over brugere og deres password (i klar tekst). Hackeren ændrer nu i urlen, så id får følgende værdi:

0; UNION SELECT brugernavn,password FROM users

i stedet for at du viser en nyhed for hackeren, vil du nu vise indholdet af din brugertabel. Selv om man ikke har skriverettigheder, så er der mange andre ting der der kan gå galt ved ukontrolleret brugerinput
Avatar billede radiohead Nybegynder
28. november 2006 - 18:54 #15
nårh ja... Der har du fat i en pointe :)

Smid et svar
Avatar billede Slettet bruger
28. november 2006 - 22:12 #16
- her et svar - hvis du kan bruge mit forslag til noget...

\Dan
Avatar billede radiohead Nybegynder
28. november 2006 - 22:47 #17
Det kan jeg skam... Lader lige morhan lægge et svar også, så i kan dele

Jeg kan bruge begge jeres forslag
Avatar billede radiohead Nybegynder
01. december 2006 - 14:17 #18
du må sige til, morhan, hvis du blev snydt :)
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
Kurser inden for grundlæggende programmering

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