>> 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>