Captcha erstellen

    • VB.NET

      Captcha erstellen

      Hallo Leute,
      hab mich mal kurz hingesetzt und eine Captcha-Klasse geschrieben:
      "Code"

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Stellt ein einfaches Captcha dar.
      3. ''' </summary>
      4. ''' <remarks></remarks>
      5. Public Class Captcha
      6. 'Deklaration der Variablen für die Eigenschaften
      7. Private _bitmap As Bitmap
      8. Private _text As String
      9. Dim r As New Random(Now.Millisecond)
      10. 'Kontstruktoren
      11. Public Sub New()
      12. _bitmap = New Bitmap(500, 100)
      13. 'Captcha zeichenen
      14. DrawBitmap()
      15. End Sub
      16. 'Funktionen
      17. ''' <summary>
      18. ''' Gibt einen zufälligen Buchstaben zurück
      19. ''' </summary>
      20. ''' <returns></returns>
      21. ''' <remarks></remarks>
      22. Private Function GetRandomChar() As Char
      23. 'Zeichen generieren
      24. NeuesZeichen: Dim i = r.Next(10, 100)
      25. Dim zeichen = Char.ConvertFromUtf32(i)
      26. 'Zeichen überprüfen
      27. If Char.IsLetter(zeichen) Or Char.IsDigit(zeichen) Then
      28. Return zeichen
      29. Else
      30. GoTo NeuesZeichen
      31. End If
      32. End Function
      33. ''' <summary>
      34. ''' Gibt eine zufällige Farbe zurück
      35. ''' </summary>
      36. ''' <returns></returns>
      37. ''' <remarks></remarks>
      38. Private Function GetRandomColor() As Color
      39. Return Color.FromArgb(255, r.Next(0, 100), r.Next(0, 200), r.Next(0, 256))
      40. End Function
      41. ''' <summary>
      42. ''' Gibt einen zufälligen Punkt im Bild zurück
      43. ''' </summary>
      44. ''' <returns></returns>
      45. ''' <remarks></remarks>
      46. Function GetRandomPoint() As Point
      47. Return New Point(r.Next(0, _bitmap.Width), r.Next(0, _bitmap.Height))
      48. End Function
      49. ''' <summary>
      50. ''' Zeichnet das Captcha
      51. ''' </summary>
      52. ''' <returns></returns>
      53. ''' <remarks></remarks>
      54. Private Function DrawBitmap()
      55. Using g = Graphics.FromImage(_bitmap)
      56. 'Hintergrund zeichenen
      57. g.FillRectangle(Brushes.DarkGreen, New Rectangle(0, 0, _bitmap.Width, _bitmap.Height))
      58. Dim last_y = 10
      59. For index = 1 To 7
      60. Dim gc = GetRandomChar()
      61. 'Zeichen zeichnen
      62. g.DrawString(gc.ToString, New Font(FontFamily.GenericMonospace.Name, r.Next(20, 40)), New SolidBrush(GetRandomColor), New Point(r.Next(last_y, last_y + 11), r.Next(10, 70)))
      63. 'Text erweitern
      64. _text &= gc
      65. last_y += 55
      66. Next
      67. 'Noch eine Linie - zur sicherheit!
      68. g.DrawCurve(Pens.Black, New Point() {New Point(0, r.Next(0, _bitmap.Height)), GetRandomPoint(), New Point(_bitmap.Width, r.Next(0, _bitmap.Height))})
      69. End Using
      70. End Function
      71. 'Eigenschaften
      72. ''' <summary>
      73. ''' Das fertige Captcha
      74. ''' </summary>
      75. ''' <value></value>
      76. ''' <returns></returns>
      77. ''' <remarks></remarks>
      78. Public ReadOnly Property Bitmap As Image
      79. Get
      80. Return _bitmap
      81. End Get
      82. End Property
      83. ''' <summary>
      84. ''' Die Lösung des Captchas
      85. ''' </summary>
      86. ''' <value></value>
      87. ''' <returns></returns>
      88. ''' <remarks></remarks>
      89. Public ReadOnly Property Text As String
      90. Get
      91. Return _text
      92. End Get
      93. End Property
      94. End Class



      Aufruf ganz einfach :)

      VB.NET-Quellcode

      1. Dim c As New Captcha()
      2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      3. pb_Captcha.Image = c.Bitmap
      4. End Sub
      5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      6. If TextBox1.Text.ToLower = c.Text.ToLower Then
      7. MessageBox.Show("Richtig.")
      8. Else
      9. MessageBox.Show("Falsch.")
      10. End If
      11. c = New Captcha()
      12. pb_Captcha.Image = c.Bitmap
      13. TextBox1.Clear()
      14. TextBox1.Select()
      15. End Sub


      Viel Spass ;)
      FileSpy 1.3 - Herausfinden, wo Programme ihre Daten speichern! Zum Download

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Memo“ ()

      Vielleicht solltest du nochmal umgehen, dass die Buchstaben den Rand nicht übersteigen. Auf dem letzten Captcha sieht man z.B. beim letzten nicht, ob es ein V oder ein Y ist. Und der Hintergrund... Du musst dir selber eingestehn, dass das den Erblindungsprozess eines menschen sehr stark beschleunigt ;P
      "Wenn jemand in einem Betrieb unverzichtbar ist, dann ist dieser Betrieb falsch organisiert." - Roberto Niederer
      Gut soltte nicht mehr vorkommen.
      Das mit dem Erblindungsprozess haben auch viele andere Captchas auf sich, aber es kann ja jeder seine eigene "GetRandomColor"-Function schreiben wenn ihn meine nicht passt ;)
      FileSpy 1.3 - Herausfinden, wo Programme ihre Daten speichern! Zum Download
      Hm. das wäre schon schwerer, schließlich möchte ich ja kein Windings und dongs drin haben, dass keiner lesen kann ^^
      Und ich wüsste keine Art solche Schriftarten auszusortieren :(
      FileSpy 1.3 - Herausfinden, wo Programme ihre Daten speichern! Zum Download
      Warum machst du es eigentlich so kompliziert? :thumbdown:
      Man nehme einfach eine Picturebox, einen Button, und eine Textbox.
      So dann sucht man in Google einfach nach einem Captcha man braucht nur eins wozu mehrere?
      Und fängt an..
      Den Captcha in die Picturebox laden.. und einfach den jeweiligen Skalierungs Modus wählen!
      Und falls der Captcha den Text hat macht man das hier z.B Captcha: Cy3zNg

      Quellcode

      1. If Textbox1.Text = ("Cy3zNg") then
      2. Button1.Show
      3. End if

      Und falls wir auf den Button klicken sollte ein Text kommen.. :thumbsup:

      Quellcode

      1. If Msgbox("Captcha akzeptiert") then
      2. Form1.Show
      3. End if

      Man kann mit diesem Code einfach sein Programm mit einem Captcha sichern, man sollte halt nicht vergessen bei den
      Einstellungen das, dass Programm als erstest die Form2 startet 8-)

      So einfach geht das :P
      Der Sinn eines Captchas geht dann leider verloren. Denn die Bots werden einfach so programmiert, diesen bestimmten Captcha-Code einzugeben und fertig.
      „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

      -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
      hey, ich find das captcha gut. ich hab nur ein paar sachen geändert ^^

      d.h.
      2te curve
      Farbverläuf im Hintergrund
      Buchstaben gehen nicht überm Rand
      und Random Schriftarten

      Hier mal ein Preview:

      .NET-Code != Serveranwendung
      Man denke mal an ASP.NET ;)

      In PHP musst es dir selber überlegen, aber es gibt einige Dienste die das (glaub ich) gratis zum Einbinden anbieten.
      FileSpy 1.3 - Herausfinden, wo Programme ihre Daten speichern! Zum Download

      Investmentclub schrieb:

      Sehr schönes Programm, nur wie kann ich es in eine Serveranwendung (z.B. PHP) einbinden?



      Für php nehm recaptcha von Google: google.com/recaptcha
      Der Kaufmann: 1%
      ich bin hab echt kaum Ahnung, aber ich würde gerne dieses Captcha feld in meiner Registration einfügen.

      Wo muss ich den oberen größeren code einfügen?
      also den hier:

      Spoiler anzeigen

      VB.NET-Quellcode

      1. ''' <summary>
      2. ''' Stellt ein einfaches Captcha dar.
      3. ''' </summary>
      4. ''' <remarks></remarks>
      5. Public Class Captcha
      6. 'Deklaration der Variablen für die Eigenschaften
      7. Private _bitmap As Bitmap
      8. Private _text As String
      9. Dim r As New Random(Now.Millisecond)
      10. 'Kontstruktoren
      11. Public Sub New()
      12. _bitmap = New Bitmap(500, 100)
      13. 'Captcha zeichenen
      14. DrawBitmap()
      15. End Sub
      16. 'Funktionen
      17. ''' <summary>
      18. ''' Gibt einen zufälligen Buchstaben zurück
      19. ''' </summary>
      20. ''' <returns></returns>
      21. ''' <remarks></remarks>
      22. Private Function GetRandomChar() As Char
      23. 'Zeichen generieren
      24. NeuesZeichen: Dim i = r.Next(10, 100)
      25. Dim zeichen = Char.ConvertFromUtf32(i)
      26. 'Zeichen überprüfen
      27. If Char.IsLetter(zeichen) Or Char.IsDigit(zeichen) Then
      28. Return zeichen
      29. Else
      30. GoTo NeuesZeichen
      31. End If
      32. End Function
      33. ''' <summary>
      34. ''' Gibt eine zufällige Farbe zurück
      35. ''' </summary>
      36. ''' <returns></returns>
      37. ''' <remarks></remarks>
      38. Private Function GetRandomColor() As Color
      39. Return Color.FromArgb(255, r.Next(0, 100), r.Next(0, 200), r.Next(0, 256))
      40. End Function
      41. ''' <summary>
      42. ''' Gibt einen zufälligen Punkt im Bild zurück
      43. ''' </summary>
      44. ''' <returns></returns>
      45. ''' <remarks></remarks>
      46. Function GetRandomPoint() As Point
      47. Return New Point(r.Next(0, _bitmap.Width), r.Next(0, _bitmap.Height))
      48. End Function
      49. ''' <summary>
      50. ''' Zeichnet das Captcha
      51. ''' </summary>
      52. ''' <returns></returns>
      53. ''' <remarks></remarks>
      54. Private Function DrawBitmap()
      55. Using g = Graphics.FromImage(_bitmap)
      56. 'Hintergrund zeichenen
      57. g.FillRectangle(Brushes.DarkGreen, New Rectangle(0, 0, _bitmap.Width, _bitmap.Height))
      58. Dim last_y = 10
      59. For index = 1 To 7
      60. Dim gc = GetRandomChar()
      61. 'Zeichen zeichnen
      62. g.DrawString(gc.ToString, New Font(FontFamily.GenericMonospace.Name, r.Next(20, 40)), New SolidBrush(GetRandomColor), New Point(r.Next(last_y, last_y + 11), r.Next(10, 70)))
      63. 'Text erweitern
      64. _text &= gc
      65. last_y += 55
      66. Next
      67. 'Noch eine Linie - zur sicherheit!
      68. g.DrawCurve(Pens.Black, New Point() {New Point(0, r.Next(0, _bitmap.Height)), GetRandomPoint(), New Point(_bitmap.Width, r.Next(0, _bitmap.Height))})
      69. End Using
      70. End Function
      71. 'Eigenschaften
      72. ''' <summary>
      73. ''' Das fertige Captcha
      74. ''' </summary>
      75. ''' <value></value>
      76. ''' <returns></returns>
      77. ''' <remarks></remarks>
      78. Public ReadOnly Property Bitmap As Image
      79. Get
      80. Return _bitmap
      81. End Get
      82. End Property
      83. ''' <summary>
      84. ''' Die Lösung des Captchas
      85. ''' </summary>
      86. ''' <value></value>
      87. ''' <returns></returns>
      88. ''' <remarks></remarks>
      89. Public ReadOnly Property Text As String
      90. Get
      91. Return _text
      92. End Get
      93. End Property
      94. End Class


      tut mir leid, aber ich bin noch ziemlich neu in diesem Gebiet...


      bei:

      pb_Captcha.Image = c.Bitmap

      ist das pb_Captcha der name der PictureBox1?

      tut mir leid, aber es wäre super wenn mir das einer erklären würde...



      liebe Grüße

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „K31X“ ()

      K31X schrieb:

      Wo muss ich den oberen größeren code einfügen?

      Unterhalb von "End Class" in deiner Datei. Noch besser: In einer eigenen (Code-)Datei, um den Überblick zu bewahren ;)

      K31X schrieb:

      ist das pb_Captcha der name der PictureBox1?

      Jep. Normalerweise solltest du immer Controls benennen. Wenn du ein größeres Projekt hast kommen sicher mal 8 Buttons in einer Form vor. (Ich habe zb Ein Hauptfenster, mit einem TabControl ~7 Seiten dass sind zusammen ~22 Buttons und ~15 LinkLabels) 50 Formen sind für dich vielleicht ein bisschen unvorstellbar, aber es kann vorkommen. Wenn du da noch den Überblick bewahren kannst...
      Lies dich bitte auch mal hier ein: [Allgemein] Grundlagen: Benennung von Controls (Update: 24.10.2010) ;)

      Manawyrm schrieb:

      Wie wunderbar unnötig ein Clientseitiges Captcha ist =D

      Eigentlich war's auch nur eine Spielerei ;) Aber ich glaube jeder kann sich denken, dass das Captcha in dieser Form keinerlei "echte" Sicherheit bietet. ^^ (Was ist im Thema Sicherheit schon 100% sicher? :P)
      FileSpy 1.3 - Herausfinden, wo Programme ihre Daten speichern! Zum Download
      Wobei, bei genauerem Überlegen ist das gar nicht so dumm.

      In einer WinForms/WPF Anwendung ist das zwar blödsinn, aber in einer ASP.net Anwendung wäre das wunderbar....
      #define true ((rand() % 2)? true: false) //Happy debugging suckers
      Ich gebe KEINE Hilfe per PN! Es gibt für ALLES nen Forum/Thread!
      Selbst in einer Lokalen Anwendung, kann man das Captcha so umbasteln, dass der Text vom Server generiert wird. (Bei einer Registrierung online zum Beispiel) Das meiste ist ja doch nur das Zeichnen. ;)
      FileSpy 1.3 - Herausfinden, wo Programme ihre Daten speichern! Zum Download