Captcha-Abfrage (Rechnung)

  • Hi,

    ich habe mal eine Captcha-Funktion geschrieben. In dieser
    wird eine leichte Rechenaufgabe erstellt, die durch eine
    Eingabe überprüft wird. Dieses ist z.B. nützlich für irgendeine
    Registration o.Ä.

    Funktionen:
    _NewCaptcha($iControl)

    Erstellt eine Captcha-Funktion und gibt die Abfrage in ein Control ein.

    _CheckCaptcha($iControl)
    Prüft eine zuvor erstellte Captcha-Funktion auf die Richtigkeit

    Skript
    [autoit]


    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.2.0
    Author: qixx (http://www.autoit.de)
    Credits:

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### Includes
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #EndRegion ### Includes

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### GUI
    $MainGUI = GUICreate("Captcha", 145, 57)
    $Label = GUICtrlCreateLabel("", 8, 8, 95, 17)
    $NewButton = GUICtrlCreateButton("Neu", 96, 7, 41, 17)
    $CaptchaInput = GUICtrlCreateInput("", 56, 28, 25, 21, $ES_NUMBER)
    GUICtrlSetLimit(-1, 2)
    GUICtrlCreateLabel("Ergebnis:", 8, 32, 48, 17)
    $OkButton = GUICtrlCreateButton("Ok", 96, 30, 41, 17)
    _NewCaptcha($Label)
    GUISetState(@SW_SHOW)
    #EndRegion ### GUI

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $NewButton
    _NewCaptcha($Label)
    Case $OkButton
    _CheckCaptcha($CaptchaInput)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================
    ;
    ; Function Name: _NewCaptcha
    ; Language: German
    ; Description: Erstellt eine Captcha-Funktion und gibt die Abfrage in ein
    ; Control ein.
    ; Parameter(s): $iControl : Ausgabe-Control der Abfrage
    ; Requirement(s): -
    ; Return Value(s): -
    ; Author(s): qixx (http://www.autoit.de)
    ;
    ;=================================================================================
    Func _NewCaptcha($iControl)
    Global $Zahl1 = Random(10,20,1)
    Global $Zahl2 = Random(1,10,1)
    Global $Operator = Random(1,2,1)
    If $Operator = 1 Then
    $Operator = " + "
    Else
    $Operator = " - "
    EndIf
    GUICtrlSetData($iControl, "Berechne: " & $Zahl1 & $Operator & $Zahl2 & ":")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================
    ;
    ; Function Name: _CheckCaptcha
    ; Language: German
    ; Description:: Prüft eine zuvor erstellte Captcha-Funktion auf die Richtigkeit
    ; Parameter(s): $iControl : Abfrage-Control der Eingabe des Captchas
    ; Requirement(s): -
    ; Return Value(s): -
    ; Author(s): qixx (http://www.autoit.de)
    ;
    ;=================================================================================
    Func _CheckCaptcha($iControl)
    If $Operator = " + " Then
    If $Zahl1 + $Zahl2 = GUICtrlRead($iControl) Then
    MsgBox(0,"Richtig","Das eingegebene Captcha ist korrekt")
    Else
    MsgBox(16,"Falsch","Das eingegebene Captcha ist nicht korrekt")
    EndIf
    ElseIf $Operator = " - " Then
    If $Zahl1 - $Zahl2 = GUICtrlRead($iControl) Then
    MsgBox(0,"Richtig","Das eingegebene Captcha ist korrekt")
    Else
    MsgBox(16,"Falsch","Das eingegebene Captcha ist nicht korrekt")
    EndIf
    Else
    ConsoleWriteError("Scriptfehler! Falscher Operator! (-,+)" & @CRLF)
    EndIf
    EndFunc

    [/autoit]


    MfG
    qixx

  • Warum deklarierst du $Zahl1, $Zahl2 und $Operator Global?
    Wäre es nicht besser in beiden Funktionen Local zu nehmen, damit es kein Fehler gibt, wenn man dieselben Variablen in einem Script verwenden möchte?

    Damit die belegten Variablen auch in der
    2. Funktion _CheckCaptcha auslesbar sind. ;)

    @GtaSpider: Werde ich mal ausprobieren. :)


    MfG
    qixx

  • Ich glaube er hat das hier ins Forum gestellt, gerade um Anregungen zu bekommen, wie man das in ein richtiges Captcha umzuwandeln, anstatt hier angemeckert zu werden, dass es unsicher ist.
    Wenigstens ist er auf die Idee gekommen und hat sich die Mühe gemacht.
    @ PrideRage: Mach dus halt besser und bau ein sicheres Script, und stell es hier vor ;)

  • 1. du stellst hier so ein noob Script rein
    2. und nennst das Captcha ?

    1. Danke.

    2. Ich kannte keinen richtigen Begriff dafür, Deshalb habe
    ich in den Titel aich "(Rechnung)" reingeschrieben.

    Echt nett, dass man hier angeschnauzt wird. Vielleicht
    hätten andere Leute das nicht hinbekommen und freuen
    sich dann, dass das schon mal jemand gemacht hat!
    Mein Güte ey.. Sowas kann ich ja gar nicht ab!


    @Topic: Ich versuche das gerade mit GDIPlus. Aber wie
    kann ich das GDI wieder löschen? Warum auch immer,
    aber _GDIPlus_GraphicsDispose funktioniert nicht. :/
    Angeblich ist die Variable mit dem Element nicht
    deklariert. oO


    MfG
    qixx

  • gratuliere PrideRage, damit wärste der wohl langsamste profi hier im forum

    ne mal im ernst. was soll der käse?

    gib ihm doch anreize es zu verbessern.
    weiß ihn auf problematiken hin oder tu sonst was.

    aber doch nich so n kindergartenaufstand hier :thumbdown:

    • Offizieller Beitrag

    Damit die belegten Variablen auch in der
    2. Funktion _CheckCaptcha auslesbar sind. ;)

    Das umgeht man, indem man die Variable Lokal deklariert und dann ByRef an die Funktionen übergibt. Muß ich mir auch gerade angewöhnen, da Globale Variablen eine gewaltige Fehlerquelle darstellen.
    Hier mal als Muster:

    [autoit]

    Local $iVal = 20

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite(_test1(2, $iVal) & @CRLF)
    ConsoleWrite(_test2(2, $iVal) & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Func _test1($iSummand1, ByRef $iSummand2)
    Return $iSummand1 + $iSummand2
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _test2($iFaktor1, ByRef $iFaktor2)
    Return $iFaktor1 * $iFaktor2
    EndFunc

    [/autoit]
  • Ich habe es jetzt mal mit GDIPlus versucht.
    Es klappt auch, bis auf das, dass ich bei
    dem Ersetzen des Captchas eine Fehlermeldung
    bekomme, dass $CaptchaLabel nicht deklariert
    ist. Warum das?

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.2.0
    Author: qixx (http://www.autoit.de)
    Credits:

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### Includes
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>
    #EndRegion ### Includes

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### GUI
    $MainGUI = GUICreate("Captcha", 165, 57)
    $NewButton = GUICtrlCreateButton("Neu", 115, 7, 41, 17)
    $CaptchaInput = GUICtrlCreateInput("", 56, 28, 25, 21, $ES_NUMBER)
    GUICtrlSetLimit(-1, 2)
    GUICtrlCreateLabel("Ergebnis:", 8, 32, 48, 17)
    $OkButton = GUICtrlCreateButton("Ok", 115, 30, 41, 17)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    _CreateCaptcha($MainGUI, 8, 8)
    #EndRegion ### GUI

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsClear($CaptchaLabel)
    _GDIPlus_Shutdown()
    Exit
    Case $NewButton
    _NewCaptcha($MainGUI, 8, 8)
    Case $OkButton
    _CheckCaptcha($CaptchaInput)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================
    ;
    ; Function Name: _CreateCaptcha
    ; Language: German
    ; Description: Erstellt eine Captcha-Funktion und erstellt ein Feld mit der
    ; Rechnung.
    ; Parameter(s): $hGUI : Handle
    ; $x : X-Position (von links)
    ; $y : y-Position (von oben)
    ; Requirement(s): GDIPlus
    ; Return Value(s): -
    ; Author(s): qixx (http://www.autoit.de)
    ;
    ;=================================================================================
    Func _CreateCaptcha($hGUI, $x, $y)
    Global $Zahl1 = Random(10,20,1)
    Global $Zahl2 = Random(1,10,1)
    Global $Operator = Random(1,2,1)
    If $Operator = 1 Then
    $Operator = " + "
    Else
    $Operator = " - "
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup ()
    $CaptchaLabel = _GDIPlus_GraphicsDrawString (_GDIPlus_GraphicsCreateFromHWND ($hGUI), "Berechne: " & $Zahl1 & $Operator & $Zahl2 & ":", $x, $y, "Arial", 8)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================
    ;
    ; Function Name: _NewCaptcha
    ; Language: German
    ; Description: Erstellt ein neues Captcha
    ; Parameter(s): $hGUI : Handle
    ; $x : X-Position (von links)
    ; $y : y-Position (von oben)
    ; Requirement(s): GDIPlus
    ; Return Value(s): -
    ; Author(s): qixx (http://www.autoit.de)
    ;
    ;=================================================================================
    Func _NewCaptcha($hGUI, $x, $y)
    _GDIPlus_GraphicsClear($CaptchaLabel)
    _CreateCaptcha($hGUI, $x, $y)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;=================================================================================
    ;
    ; Function Name: _CheckCaptcha
    ; Language: German
    ; Description:: Prüft eine zuvor erstellte Captcha-Funktion auf die Richtigkeit
    ; Parameter(s): $iControl : Abfrage-Control der Eingabe des Captchas
    ; Requirement(s): GDIPlus
    ; Return Value(s): -
    ; Author(s): qixx (http://www.autoit.de)
    ;
    ;=================================================================================
    Func _CheckCaptcha($iControl)
    If $Operator = " + " Then
    If $Zahl1 + $Zahl2 = GUICtrlRead($iControl) Then
    MsgBox(0,"Richtig","Das eingegebene Captcha ist korrekt")
    Else
    MsgBox(16,"Falsch","Das eingegebene Captcha ist nicht korrekt")
    EndIf
    ElseIf $Operator = " - " Then
    If $Zahl1 - $Zahl2 = GUICtrlRead($iControl) Then
    MsgBox(0,"Richtig","Das eingegebene Captcha ist korrekt")
    Else
    MsgBox(16,"Falsch","Das eingegebene Captcha ist nicht korrekt")
    EndIf
    Else
    ConsoleWriteError("Scriptfehler! Falscher Operator! (-,+)" & @CRLF)
    EndIf
    EndFunc

    [/autoit]

    @BugFix: Dein Beispiel verstehe ich nicht. :D


    MfG
    qixx

  • Ich hatte sowas auch schonmal gemacht. Hatte es damals mit Labels gemacht. Vielleicht hilft dir ja das Script etwas:

    Spoiler anzeigen
    [autoit]


    ; by Jautois - 2009

    [/autoit] [autoit][/autoit] [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hWindow
    Global $aFonts[4] = ["MS Sans Serif", "Arial", "Times New Roman", "Lucida Console"]
    Global $sCurrentCap = ""
    Global $aColours[8] = [0xFF0000, 0x00FF00, 0x0000FF, 0x800000, 0x808080, 0x228B22, 0xFF00FF, 0xFFD700]

    [/autoit] [autoit][/autoit] [autoit]

    $hWindow = GUICreate("Captcha by Jautois", 300, 140, Default, Default, -1, BitOR($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE))
    $pButton_Renew = GUICtrlCreateButton(" ", 255, 0, 45, 45)
    GUICtrlSetImage(-1, "shell32.dll", -239)
    $pInput_Captcha = GUICtrlCreateInput("", 64, 110, 150, 21)
    GUICtrlCreateLabel("Captcha", 8, 115, 51, 17)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $pButton_CheckCap = GUICtrlCreateButton(" ", 255, 95, 45, 45)
    GUICtrlSetImage(-1, "shell32.dll", -211)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _Captcha_Generate(8)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $pButton_Renew
    _Captcha_Generate(8)
    Case $pButton_CheckCap
    _Captcha_Check($pInput_Captcha)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _Captcha_Check
    ; Description ...: The inserted data in $sFunc_InputID will be check if its equal to the generated captcha
    ;
    ; Parameters ....: $sFunc_InputID - Handel of an input, created with GUICtrlCreateInput
    ; Return values .: None
    ; ===============================================================================================================================
    Func _Captcha_Check($sFunc_InputID)
    If GUICtrlRead($sFunc_InputID) == $sCurrentCap Then
    MsgBox(1, "Info", "Captcha okay!")
    Else
    MsgBox(48, "Info", "The entered data isn't correct!")
    EndIf
    EndFunc ;==>_Captcha_Check

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _Captcha_Generate
    ; Description ...: Generate a captcha
    ;
    ; Parameters ....: $sFunc_CapLength - The length of the captcha
    ; - Normal it's set to 8
    ; Return values .: None
    ; ===============================================================================================================================
    Func _Captcha_Generate($sFunc_CapLength = 8)
    Local $iNextLabPos = 0, $iLabTop = 0, $iLabLe = 0, $iLabWid = 0, $iLabHei = 0, $sCurStr = "", $sFullCap = ""

    [/autoit] [autoit][/autoit] [autoit]

    $aRValue = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1))
    For $i = 7 To $aRValue[0]
    GUICtrlDelete($i)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $sFunc_CapLength
    GUISetFont(Random(12, 26, 1), 400, 0, $aFonts[Random(0, UBound($aFonts) - 1, 1)])

    [/autoit] [autoit][/autoit] [autoit]

    If Random(0, 1, 1) = 1 Then
    $sCurStr = Chr(Random(Asc("A"), Asc("Z"), 1))
    Else
    $sCurStr = Chr(Random(Asc("a"), Asc("z"), 1))
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $sFullCap &= $sCurStr
    $pCurLabel = GUICtrlCreateLabel($sCurStr, 30 + $iNextLabPos, 30)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetColor(-1, $aColours[Random(0, 7, 1)])
    GUICtrlSetBkColor(-1, 0xFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    $iCurLabPos = ControlGetPos($hWindow, "", $pCurLabel)
    If $iLabLe > $iCurLabPos[0] Then $iLabLe = $iCurLabPos[0]
    If $iLabTop > $iCurLabPos[1] Then $iLabTop = $iCurLabPos[1]
    $iLabWid = $iCurLabPos[2] + $iCurLabPos[0]
    If $iLabHei < $iCurLabPos[3] + $iCurLabPos[1] Then $iLabHei = $iCurLabPos[3] + $iCurLabPos[1]

    [/autoit] [autoit][/autoit] [autoit]

    $iNextLabPos += $iCurLabPos[2]
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel("", $iLabLe, $iLabTop, $iLabWid + 10, $iLabHei + 10, $WS_CLIPSIBLINGS, $WS_EX_DLGMODALFRAME + $WS_EX_CLIENTEDGE)
    GUICtrlSetBkColor(-1, 0xFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    $sCurrentCap = $sFullCap
    EndFunc ;==>_Captcha_Generate

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    @Jautois: Du hast wieder Globale Variablen drin und genau die wollten wir vermeiden. ;)

    Muster:

    [autoit]

    $hWndCaptcha = _CreateCaptcha() ; === $hWndCaptch enthält jetzt den Wert von $CaptchaLabel aus der Funktion

    [/autoit][autoit][/autoit][autoit]

    Func _CreateCaptcha()
    ;.....
    Return $CaptchaLabel
    EndFunc

    [/autoit]
  • Also ich bin immer noch nicht soweit, das ich es zum laufen bekomme. :(

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo PrideRage,

    Hallo.
    Also echt, du stellst hier so ein noob Script rein, was du wahrscheinlich in 5 Min höchstens geschrieben hast, und nennst das Captcha ?
    Captchas sind nicht direkt lesbare >>Bilder<<.
    Du hast ne einfache Mathe aufgabe in deinem "Captcha".

    Zitat

    CAPTCHA ['kæptʃə] ist ein Akronym für Completely Automated Public Turing test to tell Computers and Humans Apart. Wörtlich übersetzt bedeutet das „Vollautomatischer öffentlicher Turing-Test, um Computer und Menschen zu unterscheiden“. CAPTCHAs werden verwendet, um zu entscheiden, ob das Gegenüber ein Mensch oder eine Maschine ist. Der Begriff wurde zum ersten Mal im Jahr 2000 von Luis von Ahn, Manuel Blum und Nicholas J. Hopper an der Carnegie Mellon University und von John Langford von IBM gebraucht und ist ein Homophon des englischen Wortes capture (einfangen, erfassen).
    CAPTCHA, das auf der Verschleierung von Buchstaben (hier: „smwm“) in Bildern basiert
    CAPTCHA, das eine Rechenaufgabe ausgibt, die der User lösen muss – Hier wäre die Lösung 25
    CAPTCHA, bei dem das Erlesen durch den Hintergrund erschwert wird. (Hier: MV52RQ)

    Während bei einem Turing-Test ein Mensch entscheiden soll, ob sein Gegenüber ein Rechner oder ein anderer Mensch ist, ist die Idee bei einem CAPTCHA, dass ein Rechner diese Unterscheidung machen soll. CAPTCHAs sollen im Internet sicherstellen, dass nur Menschen und keine programmierten Bots bestimmte Dienste nutzen können. Die Herausforderung für einen Programmierer beim Turing-Test ist es, den Computer möglichst menschenähnlich erscheinen zu lassen; bei CAPTCHAs entstehen zwei Herausforderungen: einerseits schwere Aufgaben in den CAPTCHAs zu stellen, andererseits solche Aufgaben lösen zu können.

    Quelle: http://de.wikipedia.org/wiki/CAPTCHA
    Es ist ein Captcha, allerdings sehr einfach, dies möchte er aber (auf Vorschlag von GtaSpider mit GDI+ lösen. PS.: deine sind zu schwer, also für viele Menschen auch nicht zu lösen.

    mfg (Auto)Bert