webForumDet fria alternativet

Jämföra formulärsfält med sessionsvärde

JavaScript

9 svar · 435 visningar · startad av hypatia

Medlem sedan feb. 20016 388 inlägg
Frågan#1

Jag håller på att testa att lägga till en verifieringsnyckel som ska upprepas i en gästbok. Vill att formuläret ska valideras mha javascript (och naturligtvis även kontrolleras på serversidan) eftersom jag tycker att det är mer användarvänligt.

if (document.getElementById("keycode").value != "<%= Session("keycode") %>")

Men när jag jämför formulärsvärdet med sessionsvärdet som skapas för att generera nyckeln, så stämmer de aldrig, inte ens när man skriver i rätt nyckel.
Om jag istället väljer att skriva några andra tecken istället för att plocka upp sessionsvärdet så funkar jämförelsen precis som den ska.

if (document.getElementById("keycode").value != "hypatia forever")

Sessionsvärdet skrivs ut helt rätt och funkar precis som det ska, utom just när jag jämför värdena mha javascript.

Vad har jag gjort för fel?

Medlem sedan dec. 20025 483 inlägg
#2

Det verkar korrekt. Hur ser den servergenererade koden ut för din översta kodsnutt?

Medlem sedan feb. 20016 388 inlägg
#3

Peter S skrev:

Det verkar korrekt. Hur ser den servergenererade koden ut för din översta kodsnutt?

<%
' // FUNKTION FÖR ATT SKAPA EN SLUMPMÄSSIG KOD:
Function getChar(ByVal iNoChars)
	Dim sChars, strStr, i
	Randomize(Timer())
	sChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	sChars = sChars & "abcdefghijklmnopqrstuvwxyz"
	sChars = sChars & "0123456789"
	For i = 1 to iNoChars
		strStr = strStr & Mid(sChars, Rnd * Len(sChars) + 1, 1)
	Next
	getChar = strStr
End Function

' // SKAPA EN KOD SOM ÄR 5 TECKEN LÅNG:
theCode = getChar(5)

' // SKAPA EN SESSION:
Session("keyCode") = theCode
Session.TimeOut = 30 %>

Hämtad från MickeA.com

Koden funkar, dvs. verifieringsnyckeln fungerar som den ska så länge jag inte lägger till valideringen mha javascript.

Här finns ett exempel på hur koden inte funkar just nu. :)

http://peterpan.kontrollpanelen.se/kompisbok.se/guestbook.asp?id=agneta

Medlem sedan juni 200032 967 inlägg
#4

I koden som genererats kan man läsa följande:

	session_keycode = "";

samt

    if (f_keycode.value != session_keycode) {

Alltså har du antingen skrivit fel namn på din sessionsvariabel, eller så har inte sidan tillgång till den sessionsvariabeln. Du råkar inte putta ut javascriptet innan dess att koden på servern för kodgenereringen har körts?

Medlem sedan feb. 20016 388 inlägg
#5

Hmm... vad skumt. Så ser det inte ut hos mig.

Jag får ett (korrekt) värde för session_keycode i den genererade koden. Men det du skriver om verkar stämma eftersom formuläret valideras korrekt (men inlägget sparas inte i databasen) om jag lämnar fältet med nyckeln tomt.

Jag får grotta lite mer i koden och se i vilken ordning grejerna görs.

edit... nu validerades inte formuläret med tomt fält heller.

Medlem sedan feb. 20016 388 inlägg
#6

Har testat lite mer nu och på något sätt måste det nog vara så att jag puttar iväg saker i fel ordning, men jag kan inte begripa var jag gör det eller hur jag ska rätta till det.

Om jag skriver in verifieringsnyckeln som genererats i sessionsvariabeln så valideras inte formuläret. Men om jag väljer att uppdatera sidan så står informationen i alla fält kvar och en ny kod har genererats och formuläret validerar helt plötsligt (men sparas inte).

Det här tycker jag tyder på att javascriptet puttas iväg innan kodgenereringen har körts. Men jag förstår inte varför.

Visst körs väl asp-koden före javascript-koden?

Verifieringsnyckeln genereras när bilden skapas i formuläret och javascriptet körs när man har submittat formuläret.

Men framför allt... hur ska jag göra för att det ska bli rätt?

Medlem sedan juni 200032 967 inlägg
#7

Visst körs väl asp-koden före javascript-koden?

Japp. Men, koden körs ju uppifrån och ner, så du kan inte i koden ovanför det att du genererar nyckeln, skriva ut sessionsvärdet. Så, om det är så du har det, flytta upp genereringen av nyckeln överst i asp-sidan, och gör bara utskrifterna till webbläsaren på rätt ställe.

mvh

Medlem sedan juni 20014 421 inlägg
#8

du kan ju prova att kasta upp en alert precis innan if-satsen för att kollavad session_key innehåller...

Medlem sedan feb. 20016 388 inlägg
#9

@nders skrev:

Men, koden körs ju uppifrån och ner, så du kan inte i koden ovanför det att du genererar nyckeln, skriva ut sessionsvärdet. Så, om det är så du har det, flytta upp genereringen av nyckeln överst i asp-sidan, och gör bara utskrifterna till webbläsaren på rätt ställe.

mvh

Eftersom nyckeln genereras samtidigt som bilden i formuläret skapas, så blir det nog svårt att flytta upp genereringen överst på sidan. Jag flyttade javascript-koden längre ner istället, till efter det att nyckeln genererats, men det blev ingen skillnad. :(

colione skrev:

du kan ju prova att kasta upp en alert precis innan if-satsen för att kollavad session_key innehåller...

Testade det och även när jag har flyttat ner javascript-koden så blir det en "gammal" session_key.

Medlem sedan feb. 20016 388 inlägg
#10

Har nu fått hjälp av underbara @nders och tänkte dela med mig av hur jag har förstått hans fina lösning. :)
Blir det fel någonstans rättar han säkert lite. ;)

Problemet var att verifieringsnyckeln, som visas som en bild i formuläret, inte skapas förrän img-taggen läses in. Javascriptet kommer då att ha fel eller ingen nyckel eftersom det körs före img-taggen lästs in.

Den eminenta lösningen går ut på att lägga in en (dold) iframe i huvuddokumentet, där källfilen läses in via onload i img-taggen. Sedan hämtar javascriptet värdet från iframen. Källfilen innehåller ett formulär med sessionsvärdet i en fält. Fiffigt värre. :)

Enda problemet är att sidan inte validerar längre, men det känns som ett mindre problem just nu. Man måste ju alltid väga fördelar mot nackdelar... ;)
När onload låg i body gick det inte att posta formuläret direkt, utan sidan skulle ju laddas färdigt först... och med gravatarer kan det ta några minuter om man har otur.

256 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)