Avatar billede hf Nybegynder
03. november 2003 - 12:36 Der er 14 kommentarer og
1 løsning

Check om formdata kommer fra egen server

Hvordan kan jeg nemmest checke om de data jeg får fra en FORM via request.form - kommer fra min server og ikke fra en anden server eller en lokal kopi.

Jeg har overvejet http-referer, men det kan give problemer med brugere der sidder bag en restriktiv firewall, som bortfiltrerer referer-værdierne.
Avatar billede sbm Nybegynder
03. november 2003 - 14:57 #1
Bare et lille tanke-eksperiment...

Hvad med om du med jævne intervaller sætter en eller anden session-variabel. Den kan f.eks. blive sat hver gang den første side bliver hentet. Denne variabel bliver også inkluderet som et hidden field i din form. Hvis dette felt ikke er med, eller evt. indeholder en forkert værdi, vil formen blive afvist.

Kunne det ikke bruges til at løse dit problem?
Avatar billede hf Nybegynder
03. november 2003 - 15:42 #2
Mit eget bud er noget lignende: Jeg sætter et hidden field til at være værdien af Session-ID'en. Når FORM'en skal behandles, checker jeg om værdien er den samme som den aktuelle Session-ID. Men jeg ved ikke om det er optimalt?
Avatar billede a-torsten Nybegynder
03. november 2003 - 17:13 #3
Det tror jeg ikk du skal satse på...

Så åbner man jo bare siden før afsendelse af form, og sætter så id´et ind...
Avatar billede sbm Nybegynder
03. november 2003 - 20:53 #4
a-torsten >> Og indsætter *HVAD*? Du skal jo have et reelt session-id for at kunne blive godkendt, og det kan du kun få hvis du reelt er inde på siden. Det vil brugere fra ANDRE sider ikke have været.
Avatar billede a-torsten Nybegynder
03. november 2003 - 21:33 #5
Hvis du åbner den side med formen....  Viser kílden, og sætter det unikke sessionID ind i din  lokale form... Og vupti, så er du ovre det problem...

/Anders
Avatar billede hf Nybegynder
03. november 2003 - 21:40 #6
Session-ID'er er unikke for hver bruger-session og oprettes når man henvender sig til serveren via en browser. Én bruger kan godt have flere sessions i gang på den samme server med flere browservinduer. Hvis man sender en lokal form, har man jo ikke en brugersession i gang. Derfor kan man ikke snyde på den måde.
Avatar billede a-torsten Nybegynder
03. november 2003 - 22:12 #7
Nå okay. Så siger vi det...:o)

Har du kørt tests på det ..?? (Det har jeg)...

/Anders
Avatar billede sbm Nybegynder
03. november 2003 - 23:34 #8
Så kan man vel krydse de to metoder...? Så hvis et andet site ønsker at linke direkte til siden, vil det kræve at de

1) Henter en session-cookie og at
2) Brugeren der bliver sendt direkte over, skal sidde bag en restriktiv firewall, så man ikke kan se hvor han kommer fra på referer.

Hvis begge dele er der, godtager vi dem.
Hvis session-cookie mangler bliver de blankt afvist.
Hvis session-cookie er der, og referer mangler, godtager vi dem.

Så har vi i hvert fald rykket det til et niveau, hvor det grænser til det ubrugelige for et andet site at linke direkte.
Avatar billede sbm Nybegynder
03. november 2003 - 23:46 #9
Jeg glemte naturligvis at tilføje, at hvis referer er fra et forkert domæne, bliver de også blankt afvist.
Avatar billede hpb Nybegynder
09. november 2003 - 19:27 #10
Hejsa
Jeg er ret enig med a-torsten, at lave sikkerhed på den måde er al for nem at fuppe.
Men hvorfor er det egentligt så interessant at se hvor data kommer fra ?
Hvis folk vil poste til din side, er de nødsaget til at logge ind. Om de så poster fra en lokal-kopi eller det de har fået fra dig, er vel lige meget.

Hvis vi skal se meget firkantet på det, er det altid en lokal kopi de poster fra, da din webserver blot sender data til deres browser, der så gemmer den, og når brugeren trykker på Gem, da sendes data tilbage til dig.
Avatar billede sbm Nybegynder
10. november 2003 - 10:54 #11
Det er en klassisk problemstilling, som man især forsøger at gøre noget ved, hvis man har noget "unikt" indhold på sin server, og/eller betaler for den forbrugte båndbredde. Det kunne eksempelvis være et filmklip eller en anden form for forholdsvis stor fil.

Det er man ikke interesseret i at et andet site kan referere direkte til. Hvis de ønsker at have denne fil liggende på deres site, så skal de satme også selv betale for den forbrugte båndbredde. Så kan de downloade filen, og lægge den på deres egen server. De skal ikke have lov til at linke direkte.
Avatar billede hf Nybegynder
10. november 2003 - 13:29 #12
>> sbm: Godt at du også kan se problemet.
Andre motiver kan være:
- forhindre at klientvalidering bliver omgået
- forhindre misbrug ved auto-posts i f.eks. chat, fora, surveys, registrering.

Min konklusion er indtil videre at det ikke er muligt at lave en 100% vandtæt løsning, men inspireret af bl.a. sbm har jeg lavet et dobbeltcheck, som er afhængig af enten en referer værdi eller en session-id (som kræver cookies)
Med andre ord - løsningen fungerer kun hvis brugeren ikke bortfiltrerer refereren eller hvis brugeren har cookies enabled.
Man kan naturligvis også vælge at begge betingelser skal være opfyldt, men så er der nogle brugere der uforskyldt ikke kan være med.
Jeg har testet den tomme referer med WebWasher. Der er en indstilling til at bortfiltrere refereren - og på den måde kan man teste hvordan det vil virke for brugere der sidder bag en firewall med samme filter.

Inputform:
<input name="SessionID" type="hidden" id="SessionID" value="<%=Session.SessionID%>">

Validering:
<%
Dim strReferer, aryAllowedReferer(2), strRefElement, blnReferer
strReferer = Request.ServerVariables("HTTP_REFERER")
blnReferer = false
If strReferer <> "" Then
    aryAllowedReferer(0) = "http://domain/folder/form.asp"
    aryAllowedReferer(1) = "http://domain/folder/file1.asp"
    aryAllowedReferer(2) = "http://domain/folder/file2.asp"
    For Each strRefElement In aryAllowedReferer
        If InStr(strRefElement, strReferer) > 0 Then blnReferer = true
    Next
End If
If blnReferer = false And Session.SessionID <> Request.Form("SessionID") Then
    strStatus = "Afvist"
Else
    strStatus = "Godkendt"
End If
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Referertest</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<p><%=strStatus%></p>
<p>Variabler:</p>
<p>Session ID: <%=Session.SessionID%><br>
Formfield: <%=Request.Form("SessionID")%><br>
BlnReferer: <%=blnReferer%></p>
</body>
</html>
Avatar billede hf Nybegynder
11. november 2003 - 11:20 #13
>> smb: Point til dig, hvis du lægger et svar.
Avatar billede sbm Nybegynder
11. november 2003 - 11:57 #14
Æv. Point til smb? Og han har ikke engang lavet nogen indlæg.
Avatar billede hf Nybegynder
11. november 2003 - 12:09 #15
Nå - men så må point'ene jo gå til sbm :)
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