Just nu i M3-nätverket
Jump to content

Cookie


Mel

Recommended Posts

Hej!

 

Jag använder ett script där personer kan ladda upp egna bilder som mina besökare sedan kan rösta på. För att besökarna endast ska kunna rösta en gång per dag på varje bild används en cookie, men problemet är att de som inaktiverar cookies i webbläsaren kan rösta hur många gånger som helst.

Är det någon som har en lösning på detta problem? Går det ändra i scriptet så att man måste acceptera cookies för att kunna rösta?

 

Tacksam för hjälp!

Melker

 

Link to comment
Share on other sites

På den sidan som registrerar rösten kan du precis innan den skall sparas göra en cookiecheck.

Dvs du skapar en cookie och ger den ett värde, sedan hämtar du cookien direkt efter, har den det värde du gav den är det ok att fortsätta med röstregistreringen, annars kan du helt enkelt bara skicka användaren vidare till resultatet av omröstningen eller visa ett felmeddelande osv.

 

Detta det enklaste sättet att kontrolla att besökarnas cookiestöd är påslaget och aktiverat.

 

 

Link to comment
Share on other sites

dAEk^ beskrev ju just checken. Genom att först (försöka) sätta en cookie och sen (försöka) läsa den så innebär detta att om det gick att läsa den så accepteras cookies annars inte.

 

Link to comment
Share on other sites

Jag fattade det när jag läste lite noggrannare :-)

Problemet är att jag inte vet hur man sätter en sådan cookie. Om någon har lust att visa ett exempel här vore jag tacksam, annars får jag sätta mig och studera hur man skapar en cookie.

 

Link to comment
Share on other sites

Jag har tänkt på det, men de flesta av mina besökare fixar nog inte det :-) Däremot kan flera av dom ha inaktiverat cookies så det är det som jag i första hand vill motverka.

Kan man använda något annat sätt för att logga röstningar?

 

Link to comment
Share on other sites

I javascript gör du så här för att sätta en cookie som gäller i 4 (nWeeks) veckor:

 

var exp=new Date();

var nWeeks=4;

var Period=exp.getTime()+(86400000*nWeeks);

exp.SetTime(Period);

document.cookie="svarat=JA;expires="+exp.toGMTString;

 

För att kontrollera om cookies accepteras (tillika kontrollera om användaren redan röstat):

var strCookie=document.cookie;

if (strCookie!='') {

//Cookies funkar. Cookies är satt

} else {

// Cookies ej påslagna/Cookies ej satt

}

 

- Chris

 

ÄNDRING: RÄTTADE ETT PAR FEL ANGÅENDE DATUMET.

[inlägget ändrat 2004-01-13 14:56:21 av Anjuna Moon]

Link to comment
Share on other sites

Nope, det finns tyvärr inget sätt att garantera endast en post per person. Man kan dock få ner antalet 'fuskposter' genom att försvåra det men det verkar inte som om det behövs här.

 

Link to comment
Share on other sites

Jag har med hjälp lyckats skapa en cookie som jag sätter på när besökarna kommer til index.asp. Denna cookie ser ut så här:

 

<%

Response.Cookies("kaka") = "Klarar"

Response.Cookies("kaka").Expires = DateAdd("d", 1, Date())

Response.Redirect("cookietest.asp")

%>

 

På cookietest.asp ser det ut så här:

 

<%

If Request.Cookies("kaka") <> "" Then

Response.Redirect ("index2.asp")

Else

Response.Redirect("ej_cookiestod.asp")

End If

%>

 

..vilket innebär att de som aktiverat cookies kan komma in på sidan, men de som inte aktiverat hamnar på en sida som talar om att dom måste aktivera cookies för att få rösta.

 

Problemet är dock fortfarande att de som är riktigt slipade kan kringå även detta eftersom dom kan inaktivera cookies när dom väl kommit förbi cookietest.asp.

 

Nu undrar jag om det finns någon kod som talar om att "webbläsaren accepterar cookies, sidan kan visas" istället för att redirecta till index2.asp skulle jag alltså vilja stanna kvar på sidan där kontrollen sker.

 

<%

If Request.Cookies("kaka") <> "" Then

"visa sidan"

Else

Response.Redirect("ej_cookiestod.asp")

End If

%>

 

Det blev kanske lite krångligt detta, men någon kanske fattar :-)

 

Link to comment
Share on other sites

Ssessioner i ASP egentligen är egentligen en cookie (som inte lagras permanent, utan försvinner när webbläsaren stängs eller efter inaktivitet i X min). Därför kan man testa om besökarens webbläsare hanterar sessions. Tex:

<% IF Request("action") = "Testa Cookies" THEN
Dim theSessionID 
theSessionID = Request.Form("theSessionID") 
If theSessionID = Session.SessionID Then
	Response.Write("<strong>Din webbl&auml;sare accepterar cookies!</strong>") 'För testning, tas bort sen
	nextPage="index_cookies.asp" 'Sidan man ska till om man har cookies aktiverat
Else
	Response.Write("<span style=""font-weight:bold; color:#CC0000;"">Din webbl&auml;sare accepterar INTE cookies!</span>") 'För testning, tas bort sen
	nextPage="index_nocookies.asp" 'Sidan man ska till om man INTE har cookies aktiverat
End If 
Response.Write("<br><input type=""button"" onClick=""location.href='"&nextPage&"'"" value="" OK ""><br>") 'För testning, tas bort sen
ELSE 
Response.Write("<form method=""post"">")
Response.Write("<input type=""hidden"" name=""theSessionID"" value="""&Session.SessionID&""">")
Response.Write("<input name=""action"" type=""submit"" value=""Testa Cookies"">")
Response.Write("</form>")
END IF %>

Detta gör det "enkelt" att kolla huruvida cookies är aktiverade eller inte. Skicka med Session.SessionID i röstningsformuläret och gör kollen en. ovan. Om cookies hanteras (första fallet) så kollar du om man röstat tidigare. Om man inte röstat tidigare så sätter du din röstnings-cookie sen genomför du själva röstningen. Om man inte har cookies aktiverat så informerar du besökaren om detta och att detta krävs.

 

Att sätta din cookie bör du alltså göra mha ASP. Detta av två skäl. Ett; enklare att integrera i resten av koden. Två; slipper låsa ute besökare som av någon (säkerhet?) anledning har deaktiverat JavaScript.

 

Hoppas du hängde med, annars får du hojta till!

 

Link to comment
Share on other sites

Sessions skall man inte använda om man verkligen inte måste, de snor nämligen prestanda på servern. Det lärde jag mig när jag lärde mig asp, vet inte om det stämmer fortfarande men jag undviker iaf sessions så gott det går.

 

I det här fallet är det inte nödvänligt att använda sig av sessions, i IE tex kan man välja att acceptera sessions men inte vanliga cookies. Det skulle innebära att en användare med de inställningarna teoretiskt sett inte skulle få rösta fast han borde få det.[har inte testat detta, det är bara en teori]

 

Nu är det nog inte alls många som har dessa inställningar dessutom är det inte säkert att det fungerar enligt min teori. Någon med lite tid över kanske kan testa ?

 

Link to comment
Share on other sites

Jag citerar mig själv:

På den sidan som registrerar rösten kan du precis innan den skall sparas göra en cookiecheck.

 

I och med att du skapat en cookiecheck.asp som du gjort ovan är det möjligt att komma förbi den och rösta i alla fall [inte för den vanliga användaren, men det är fortfarande möjligt]

 

Om du istället lägger in cookiechecken på sidan som registrer rösten och använder dig av Response.Buffer = true blir det genast bra svårare att ta sig förbi kontrollen.

 

Lite kod: [vote.asp eller motsvarande sida]

<%@LANGUAGE="VBScript" EnableSessionState = False %>
<%
Option Explicit
Response.Buffer  = true
Response.Expires = -1000 '// förhindra att sidan cachas 
Response.CacheControl = "no-cache" '// förhindra att sidan cachas 


Call setCtrlCookie() '// skapa en kontroll-cookie med kort expire-tid tex 1 min alternativt att du tar bort den efter kontrollen är klar
Call checkCtrlCookie() '// kontrollera att den sparades, returnera true om den finns, annars false.

if (checkCtrlCookie) then '// cookies stöds
Call Vote() '// registrera rösten
Response.redirect("results.asp")
else '// cookies stöds inte
response.redirect("nocookiesforyou.asp")
end if
%>

 

Hoppas det vart lite klarare nu.

 

Link to comment
Share on other sites

Nja, sessions startas automatiskt när en besökare kommer in på en av dina sidor, IIS:en håller reda på beökarna på detta sätt. Att sedan lägga värden i sessions-variabler är något av en annan sak. Om man som i ditt exempel stänger av Sessions-hanteringen (EnableSessionState = False) säger Microsoft att man kanske kan minska responstiden något. Mer om vad MS har att säga om sessioner och cookies: http://www.microsoft.com/windows2000/en/server/iis/htm/asp/iiapsess.htm

 

Men för att komma tbax on-topic; Jag håller helt med dig, dAEk^, cookie-kontrollen bör/ska vara integrerad i röstnings/cookie-skapnings processen.

 

 

 

Link to comment
Share on other sites

Det funkade inte så bra när jag testade.

 

Jag lade in koden på den sida som registrerar rösten, rosta.asp, men det verkar som om den kod som är efter koden som du skrev inte lästes. Om jag fattat rätt så görs cookiechecken, men problemet sitter kanske här:

 

if (checkCtrlCookie) then '// cookies stöds

Call Vote() '// registrera rösten

Response.redirect("results.asp")

else '// cookies stöds inte

response.redirect("nocookiesforyou.asp")

end if

%>

 

..där man redirectar till results.asp och då registreras inte rösten eftersom resterande del rosta.asp inte läses. Hur löser man detta?

 

Link to comment
Share on other sites

Så här ser koden ut på sidan som registrerar rösten:

 

<% Session.lcid = 1053

 

Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../access-db/galleri.mdb")

 

If Request.Cookies(Request.Querystring("id")) = "true" Then

Response.Redirect "visa.asp?id=" & Request.Querystring("namn") & "&show=fusk"

Else

 

Set RecSet=Conn.Execute("SELECT * From Bilder Where id=" & Request.Querystring("id"))

 

vote = Request.QueryString("vote")

 

Conn.Execute("Update Bilder Set Summa=Summa+" &vote &" Where id=" & Request.Querystring("id"))

Conn.Execute("Update Bilder Set Totalt=Totalt+1 Where id= " & Request.Querystring("id"))

Conn.Execute("Update Bilder Set V"&vote&"=V"&vote&"+1 Where id=" & Request.Querystring("id"))

 

RecSet.Close

Conn.Close

 

Response.Cookies(Request.Querystring("id")) = "true"

Response.Cookies(Request.Querystring("id")).Expires = DateAdd("h", 24, now)

 

Response.Redirect "visa.asp?id=" & Request.Querystring("namn")

End If%>

 

Link to comment
Share on other sites

Funktionerna jag anropar finns inte om du inte skapat dem själv, jag använde dem mest för att visa hur jag tänkte.

 

Såg precis att jag gjort ett onödigt funktionsanrop, detta är redigerat nu:

Call setCtrlCookie() '// skapa en kontroll-cookie med kort expire-tid tex 1 min alternativt att du tar bort den efter kontrollen är klar

'// -- redigerat --
'function checkCtrlCookie() 
'// kod för att kontrollera att kontroll-cookien sparades. Om den finns, returnera true, annars false
'end function
'// -- slut --

if (checkCtrlCookie()) then '// cookies stöds
Call Vote() '// registrera rösten
Response.redirect("results.asp")
else '// cookies stöds inte
response.redirect("nocookiesforyou.asp")
end if
%>

 

Du måste inte använda funktioner som jag gjort ovan, men det underlättar, det blir lättare att se tanken bakom. Tycker jag iaf :)

 

Link to comment
Share on other sites

Jag är tacksam för all hjälp, men tyvärr har jag inte kunskapen att fixa detta. Jag får helt enkelt nöja mig med den cookiecheck som jag har nu.

 

Link to comment
Share on other sites

Jag pysslar på ett exempel som utgår ifrån din kod och som borde fungera, men jag kan inte lova ngt eftersom jag inte kan testa.

 

Normalt sett brukar det ta emot för mig att skicka färdig kod men idag är det ju fredag[äntligen :)] och du har försökt på egen hand.

 

Vänta i några minuter bara...

 

Link to comment
Share on other sites

<%@LANGUAGE="VBScript" EnableSessionState = False %>
<%
Option Explicit
Response.Buffer = true
Response.Expires = -1000 '// förhindra att sidan cachas
Response.CacheControl = "no-cache" '// förhindra att sidan cachas

Dim Conn, qsID, qsVote, qsNamn
qsID   = Request.Querystring("id")
qsVote = Request.QueryString("vote")
qsNamn = Request.QueryString("namn")


function registerVote()
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../access-db/galleri.mdb")

Conn.Execute("Update Bilder Set Summa=Summa+" & qsVote &" Where id="& qsID)
Conn.Execute("Update Bilder Set Totalt=Totalt+1 Where id="& qsID)
Conn.Execute("Update Bilder Set V"& qsVote &"=V"& qsVote &"+1 Where id="& qsID)
'// dessa 3 rader kan och bör slås ihop till ett enda sql-kommando, men det är kanske enklare att ha det på detta vis om asp känns lite främmande fortfarande

'// nedan stänger vi och städar upp efter oss [detta skall man ALLTID göra när man pysslat med objekt.
'// När man skrivit 'set variabel = bla' då har man använt ett objekt & då måste man städa efter sig, annars kan det bli problem på servern!
Conn.Close
Set Conn   = nothing 
end function

function setCtrlCookie()
Response.Cookies("kaka") = "Klarar"
Response.Cookies("kaka").Expires = DateAdd("d", 1, Date())
Response.Flush()
end function

function checkCtrlCookie()
if (Request.Cookies("kaka")="Klarar") then
	checkCtrlCookie = true
else
	checkCtrlCookie = false
end if
end function


Call setCtrlCookie()

if (checkCtrlCookie()) then '// cookies stöds
Call registerVote() '// registrera rösten
Response.Cookies(qsID) = "true"
Response.Cookies(qsID).Expires = DateAdd("h", 24, now())
Response.Redirect("visa.asp?id="& qsNamn)

else '// cookies stöds inte
Response.Redirect("nocookiesforyou.asp")
end if
%>

 

Detta är som sagt inte testat så det är möjligt att några småfel hängt med. Det finns heller inga kontroller av datatyper osv men det är lite överkurs än så länge tror jag. Om du vill veta mer om det kan du söka på forumet.

 

[inlägget ändrat 2004-01-16 14:22:51 av dAEk^]

Link to comment
Share on other sites

Fick detta felmeddelande:

 

Microsoft VBScript compilation error '800a0401'

 

Expected end of statement

 

/omrostning/rosta.asp, line 1

 

LANGUAGE="VBScript" EnableSessionState = False

 

 

 

Link to comment
Share on other sites

Se till att @ hänger med, eftersom eforum byter ut det tecknet mot en bild fungerar det inte att klippa och klistra.

 

Eventuellt kan det behövas ett komma [,] efter

LANGUAGE="VBScript" men innan EnableSessionState = False

 

 

[inlägget ändrat 2004-01-16 16:01:52 av dAEk^]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...