Just nu i M3-nätverket
Jump to content

Captcha funkar inte som det ska


Admini

Recommended Posts

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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"

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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

Link to comment
Share on other sites

 

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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
Link to comment
Share on other sites

 

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
%>
Link to comment
Share on other sites

 

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>
Link to comment
Share on other sites

 

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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:

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Archived

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



×
×
  • Create New...