Just nu i M3-nätverket
Gå till innehåll

Captcha funkar inte som det ska


Admini

Rekommendera Poster

Hej Jag använder en CAPTCHA som följande

<%@LANGUAGE="VBSCRIPT"%>
<%
Response.CacheControl = "no-cache"
Response.AddHeader "pragma","no-cache"
Response.Expires = -1
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript" language="javascript">
        function RefreshImage(valImageId) {
            var objImage = document.getElementById(valImageId)
            if (objImage == undefined) {
                return;
            }
            var now = new Date();
            objImage.src = objImage.src.split('?')[0] + '?x=' + now.toUTCString();
        }
    </script>
</head>
<body>
    <form name="form1" id="form1" method="post">
    <div style="text-align: center; margin-top: 20px;">
        <%
        if Request.ServerVariables("REQUEST_METHOD") = "POST" and IsEmpty(Request.Form("btnRetry")) then
            Dim lblResult, lblColor
            if IsEmpty(Session("ASPCAPTCHA")) or Trim(Session("ASPCAPTCHA")) = "" then
                lblResult = "This test has expired."
                lblColor = "red"
            else
                Dim TestValue : TestValue = Trim(Request.Form("txtCaptcha"))
                '//Uppercase fix for turkish charset//
                TestValue = Replace(TestValue, "i", "I", 1, -1, 1)
                TestValue = Replace(TestValue, "Ä°", "I", 1, -1, 1)
                TestValue = Replace(TestValue, "ı", "I", 1, -1, 1)
                '////////////////////
                TestValue = UCase(TestValue)
                
                if StrComp(TestValue, Trim(Session("ASPCAPTCHA")), 1) = 0 then
                    lblResult = "CAPTCHA PASSED"
                    lblColor = "green"
                else
                    lblResult = "CAPTCHA FAILED"
                    lblColor = "red"
                end if
                '//IMPORTANT: You must remove session value for security after the CAPTCHA test//
                Session("ASPCAPTCHA") = vbNullString
                Session.Contents.Remove("ASPCAPTCHA")
                '////////////////////
            end if
        %>
        <p><span style="color: <%=lblColor%>; font-weight: bold;"><%=lblResult%></span></p>
        <input type="submit" name="btnRetry" id="btnRetry" value="Take another test" />
        <%else%>
        <img src="captcha.asp" id="imgCaptcha" /> <a href="javascript:void(0);" onclick="RefreshImage('imgCaptcha');">Get a new challenge</a><br />
        Write the characters in the image above<br />
        <input type="text" name="txtCaptcha" id="txtCaptcha" value="" /><br />
        <input type="submit" name="btnSubmit" id="btnSubmit" value="Submit" />
        <%end if%>
    </div>
    </form>
</body>
</html>


Men jag hittar inte VAR den skickar användaren. Det borde stå som "Action='' " inom form-taggarna men icke!

Hur funkar den egentligen?

Tack för info

Länk till kommentar
Dela på andra webbplatser

Utan angiven action så postar formuläret till samma sida.

 

Det stämmer, men om jag lägger in action="mintest.asp" så går den dit utan att förhindra användaren som skrev fel kod eller skrev koden alls.

Länk till kommentar
Dela på andra webbplatser

Ja du måste ju på den sida som tar emot postningen kolla om koden var angiven korrekt.

I detta fall när du postar till samma sida så får du väl efter kontrollen göra en response.redirect (alternativt server.transfer) till "nästa sida"

Länk till kommentar
Dela på andra webbplatser

Ja du måste ju på den sida som tar emot postningen kolla om koden var angiven korrekt.

I detta fall när du postar till samma sida så får du väl efter kontrollen göra en response.redirect (alternativt server.transfer) till "nästa sida"

Ok nu funkar den, och om man skriver fel så återkommer den sida 1, MEN då har den tappat/raderat det man skrivit.

Länk till kommentar
Dela på andra webbplatser

Ja, om du inte tar emot alla form-värden och populerar fälten med dessa så blir det ju så.

 

Alternativt så kollar du på någon ajax-variant, kolla t.ex. på:

http://www.codegain.com/articles/asp/miscellaneous/create-captcha-in-classic-asp-captcha-with-jquery.aspx

 

(fler alternativa lösningar http://www.jquery4u.com/security/10-jquery-captcha-plugins/ eller http://tympanus.net/codrops/2009/09/22/21-free-captcha-sources/

Länk till kommentar
Dela på andra webbplatser

Ja, om du inte tar emot alla form-värden och populerar fälten med dessa så blir det ju så.

 

Alternativt så kollar du på någon ajax-variant, kolla t.ex. på:

http://www.codegain.com/articles/asp/miscellaneous/create-captcha-in-classic-asp-captcha-with-jquery.aspx

 

(fler alternativa lösningar http://www.jquery4u.com/security/10-jquery-captcha-plugins/ eller http://tympanus.net/codrops/2009/09/22/21-free-captcha-sources/

 

Synd att den är anpassad för PHP. Jag kan bara ASP classic

Länk till kommentar
Dela på andra webbplatser

 

Jag vill helst fortsätta med det jag redan har (upplärningstid)

 

Jag kan skicka användaren till spara-sida när hen skriver rätt men form-fälten är tomma när man kommer fram, eftersom sida 1 har laddats en gång (en gång för mycket)

Kan jag spara fält-innehållen i sessioner och ta med mig till spara-sidan, när jag gör en Response.Redirect?

 

Inte som querystring utan som just form-fält

Länk till kommentar
Dela på andra webbplatser

Ja antingen så sätter du sessions-variabler i Sida1.asp (den med formuläret och CAPTCHA) och kan då sedan på Sida2.asp använda dessa. Eller så gör du som jag nämnde i tidigare inlägg och använder dig av server.transfer (med de för- och nackdelar det har) istället för response.redirect.

Länk till kommentar
Dela på andra webbplatser

Ja antingen så sätter du sessions-variabler i Sida1.asp (den med formuläret och CAPTCHA) och kan då sedan på Sida2.asp använda dessa. Eller så gör du som jag nämnde i tidigare inlägg och använder dig av server.transfer (med de för- och nackdelar det har) istället för response.redirect.

 

Vilka för- och nackdelar har Server.Transfer?

Länk till kommentar
Dela på andra webbplatser

Response.Transfer tar som sagt med sig postad data till nästa sida. Annars kan du ju göra det du behöver på samma sida som formulärsidan och sedan göra en response.redirect.

if StrComp(TestValue, Trim(Session("ASPCAPTCHA")), 1) = 0 then
    lblResult = "CAPTCHA PASSED"
    lblColor = "green"
    ' Do some more magic here and Response.redirect to
    Response.Redirect "minsida.asp"
else
    lblResult = "CAPTCHA FAILED"
    lblColor = "red"
end if
Länk till kommentar
Dela på andra webbplatser

 

Response.Transfer tar som sagt med sig postad data till nästa sida. Annars kan du ju göra det du behöver på samma sida som formulärsidan och sedan göra en response.redirect.

if StrComp(TestValue, Trim(Session("ASPCAPTCHA")), 1) = 0 then
    lblResult = "CAPTCHA PASSED"
    lblColor = "green"
    ' Do some more magic here and Response.redirect to
    Response.Redirect "minsida.asp"
else
    lblResult = "CAPTCHA FAILED"
    lblColor = "red"
end if

Ok , nu funkar det som det ska , med nöd o näppe ... :)

Enda "felet" är enligt följande:

Vid onSubmit kör jag en kontroll av inmatningsdata, t.ex om email är riktig osv, mha javascript. Användaren får en alert när något är fel.

Men när CAPTCHA-text blir fel så får jag inte något alert, utan hela sidan laddas om.

Kan jag få det att ge användaren en Alert istället?

Tack på förhand

Länk till kommentar
Dela på andra webbplatser

Det är inte jättebra, för då måste du ju skriva ut captcha-koden i din fil, och då är ju syftet med den borta. Så ja, det går, men nej, jag avråder från det.

Länk till kommentar
Dela på andra webbplatser

Det är inte jättebra, för då måste du ju skriva ut captcha-koden i din fil, och då är ju syftet med den borta. Så ja, det går, men nej, jag avråder från det.

 

Nej förstås, inte så.

Utan min tanke är att användaren får alerten istället för "CAPTCHA FAILED" eller varför inte både och?

Alltså när och efter att sidan körde koderna och kollade om rätt siffra matades in så får man en alert också.

Länk till kommentar
Dela på andra webbplatser

Som jag skrev, innan formuläret postas kan man inte ge användaren ett meddelande då det kräver att man skriver ut catchakoden i html-sidan.

 

Efteråt sidan postats kan du absolut det genom nedanstående nedanför </form> exempelvis

<%
If lblResult ="CAPTCHA FAILED" Then
%>
<script>alert("Nej du, det var fel")</script>
%>
End If
%>
Länk till kommentar
Dela på andra webbplatser

 

Som jag skrev, innan formuläret postas kan man inte ge användaren ett meddelande då det kräver att man skriver ut catchakoden i html-sidan.

 

Efteråt sidan postats kan du absolut det genom nedanstående nedanför </form> exempelvis

<%
If lblResult ="CAPTCHA FAILED" Then
%>
<script>alert("Nej du, det var fel")</script>
%>
End If
%>

 

Tack, Det funkar

Men nu laddar den hela sidan och förflyttar sig och ... nej det är inte särskilt pedagogiskt. Mitt fel!

Jag skulle helst vilja kunna ladda endast om captcha-koden, t.ex om jag lägger koden i en iFrame, typ så här:

<form....>
<input type="text" name="namn">
<input type="text" name="email">
<textarea name="text1"></textarea>
<iframe src="captcha.asp"></iframe>
<input type="submit">
</form>
Länk till kommentar
Dela på andra webbplatser

 

Tack, Det funkar

Men nu laddar den hela sidan och förflyttar sig och ... nej det är inte särskilt pedagogiskt. Mitt fel!

Jag skulle helst vilja kunna ladda endast om captcha-koden, t.ex om jag lägger koden i en iFrame, typ så här:

<form....>
<input type="text" name="namn">
<input type="text" name="email">
<textarea name="text1"></textarea>
<iframe src="captcha.asp"></iframe>
<input type="submit">
</form>

Ok nu funkar det som jag vill, nästan :)

Jag la in hela kommentar-sidan inklusive form-fälten och submit, allihopa i IFRAME

 

Enda felet är nu att efter att man svarar rätt och inmatningen sparas korrekt, sedan när man ska komma tillbaka till föregående sida så laddas hela sidan INUTI sidan, som ju är rimligt.

 

min ResponseRedirect måste på nåt sätt gå upp en nivå till parent. Hur gör jag detta?

Så ser min ResponseRedirect ut:

Response.Redirect "index.asp?id="& strId &""

Tackar på förhand :)

Länk till kommentar
Dela på andra webbplatser


<% If form=true Then ' Kontrollera att uppgifterna är korrekta, ändra statement %>
<script>
window.top.location.href = "index.asp?id=<%=strId%>";
</script>
<% End If %>
Länk till kommentar
Dela på andra webbplatser

<% If form=true Then ' Kontrollera att uppgifterna är korrekta, ändra statement %>
<script>
window.top.location.href = "index.asp?id=<%=strId%>"; 
</script>
<% End If %>

Tack det funkar!

Men den visar "spara-sidan" för ett kort ögonblick inuti IFRAME först och sedan tar mig till huvudsidan. Man hinner läsa allt som det sår där (mina response.write)

Kan man komma runt det?

Tacksam!

Länk till kommentar
Dela på andra webbplatser

Helst ska du bygga om hur flödet fungerar. Du märker ju själv att det blir det ena problemet efter det andra.

 

Kan kan ju göra att den inte skriver ut något innehåll på sidan om captchan matchar.

Länk till kommentar
Dela på andra webbplatser

Helst ska du bygga om hur flödet fungerar. Du märker ju själv att det blir det ena problemet efter det andra.

 

Kan kan ju göra att den inte skriver ut något innehåll på sidan om captchan matchar.

 

Ja, nu har jag inaktiverat alla Response.Write och det känns ok.

Jag är nöjd.

Men när du säger bygga om hur flödet fungerar, hur menar du exakt?

Kanske jag kan använda det för att bättra på den.

Tack för din hjälp :)

:thumbsup:

Länk till kommentar
Dela på andra webbplatser

Jag menar på ett sätt som inte känns rörigt varje gång som du ska vidareutveckla.
 

Det är väl en kunskapsfråga egentligen - svårt att förmedla allt man ska tänka på.
Men ställ dig själv frågan - "Hur skulle jag kunna göra detta bättre?".

Däri har du lösningen.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...