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

Captcha funkar inte som det ska

Rekommendera Poster

Admini

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

Redigerad av Admini

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Cluster

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Cluster

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"

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Cluster

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/

Redigerad av Cluster
Lagt till länkar

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

 

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

Redigerad av Admini

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Cluster

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.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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?

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Jonas__B

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

 

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Jonas__B

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.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Jonas__B

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

 

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>

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

 

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Jonas__B

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

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Cluster

Det är ju just den här problematiken (med "lösningar" i iframe mm) som ajax är som bäst på att kommarunt och lösa  ^_^

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini
<% 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!

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Jonas__B

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.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Admini

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:

Redigerad av Admini

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Jonas__B

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.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...