cybton.com
Über uns | Jobs | Werbung | Sitemap | AGB | Impressum | Hilfe ?
 Kostenlos anmelden)
wichtigWir suchen PHP-Entwickler/innen (Freelancer oder Vollzeit)
Forum
Aktuellste Beiträge
Forenregeln

Community
BB-Codes
Tags
Chat
Suche (Web)
Wer ist online?
Top-User

Basar


Statistik
Mitglieder gesamt: 69399
Mitglieder online: 0
Gäste online: 1
mehr...

Anzeige
Forum » Forum: Website & Webprogrammierung » Thread: Captcha Script - bitte bewerten

Thread: Captcha Script - bitte bewerten

Tags: PHP , Captcha , Spambot

29.08.2009 20:45 Uhr

 

Status: offline
Hallo,

ich saß heute den ganzen Nachmittag an diesem Captcha-Script hier und wollte euch fragen, was ihr davon haltet, bzw. wo Fehler oder Schwachstellen sein könnten. Das die Bilddateien nicht gelöscht werden, ist mir bewusst, und das werde ich auch noch ändern.
+ PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
<?php
  class captcha
  {
    private $num_chars    = 5;              //Anzahl der Captcha-Zeichen
    private $all_chars    = 'cn';           //c = Großbuchstaben, l = Kleinbuchstaben, n = Zahlen, s = Sonderzeichen
    private $captcha_str  = '';             //Captcha String
    private $algo         = 2;              //Algorythmus, der zum verschlüsseln verwendet werden soll (zur Laufzeit nicht ändern)
    private $font         = '/srv/www/captcha/ALGER.TTF';   //Pfad zur Schriftdatei
    
    private function get_char()
    {
      $chars              = '';
      $chars_c            = '|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z';
      $chars_l            = '|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z';
      $chars_n            = '|0|1|2|3|4|5|6|7|8|9';
      $chars_s            = '|&|%|$|?|§|=|+|-|*|/|ß|ä|ö|ü|Ä|Ö|Ü|#';
      
      if(strpos($this->all_chars,'c') !== FALSE)
        $chars           .= $chars_c;
      if(strpos($this->all_chars,'l') !== FALSE)
        $chars           .= $chars_l;
      if(strpos($this->all_chars,'n') !== FALSE)
        $chars           .= $chars_n;
      if(strpos($this->all_chars,'s') !== FALSE)
        $chars           .= $chars_s;
      $char               = explode('|',substr($chars,1));
      $random             = rand(1,count($char));
      return $char[$random];
    }
    
    public function checksum()
    {
      $sum                = 0;
      for($a=0;$a<$this->num_chars;$a++)
      {
        $sum             += ord($this->captcha_str[$a]);
      }
      $algo               = $this->algo+round(time()/1800)%18;
      if($algo > 18)
        $algo            -=18;
      if($algo < 1)
        $algo            +=18;
        
      switch($algo)
      {
        case 1:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[1]);
          $code               = $sum*$multi;
        break;
        case 2:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[2]);
          $code               = $sum*$multi;
        break;
        case 3:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[3]);
          $code               = $sum*$multi;
        break;
        case 4:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[4]);
          $code               = $sum*$multi;
        break;
        case 5:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[5]);
          $code               = $sum*$multi;
        break;
        case 6:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[6]);
          $code               = $sum*$multi;
        break;
        case 7:
          $string             = md5($this->captcha_str);
          $multi              = ord($string[1]);
          $code               = $sum*$multi;
        break;
        case 8:
          $string             = md5($this->captcha_str);
          $multi              = ord($string[2]);
          $code               = $sum*$multi;
        break;
        case 9:
          $string             = md5($this->captcha_str);
          $multi              = ord($string[3]);
          $code               = $sum*$multi;
        break;
        case 10:
          $string             = md5($this->captcha_str);
          $multi              = ord($string[4]);
          $code               = $sum*$multi;
        break;
        case 11:
          $string             = md5($this->captcha_str);
          $multi              = ord($string[5]);
          $code               = $sum*$multi;
        break;
        case 12:
          $string             = md5($this->captcha_str);
          $multi              = ord($string[6]);
          $code               = $sum*$multi;
        break;
        case 13:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[1]);
          $code               = 100000-$sum*$multi;
        break;
        case 14:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[2]);
          $code               = 100000-$sum*$multi;
        break;
        case 15:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[3]);
          $code               = 100000-$sum*$multi;
        break;
        case 16:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[4]);
          $code               = 100000-$sum*$multi;
        break;
        case 17:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[5]);
          $code               = 100000-$sum*$multi;
        break;
        case 18:
          $string             = sha1($this->captcha_str);
          $multi              = ord($string[6]);
          $code               = 100000-$sum*$multi;
        break;
      }
      
      return $code;
    }
    
    public function __construct($check = '')
    {
      if (! $check)
      {
        for ($a=0;$a<$this->num_chars;$a++)
        {
          $this->captcha_str     .= $this->get_char();
        }
      }
      else
        $this->captcha_str        = $check;
    }
    
    public function check($sum)
    {
      if ($sum == $this->checksum())
        return true;
      else
      {
        $this->algo        -=1;
        if ($sum == $this->checksum())
          return true;
        else
          return false;
      }
    }
    public function output()
    {
      return $this->captcha_str;
    }
    
    public function image()
    {
      $width  = 15+$this->num_chars*25;
      $img    = imagecreatetruecolor($width,40);
      $bck    = imagecolorallocate($img,200,200,200);
      imagefill($img,0,0,$bck);
      $hpos   = 10;
      for($a=0;$a<$this->num_chars;$a++)
      {
        $string = substr($this->captcha_str,$a,1);
        $col  = imagecolorallocate($img,rand(10,170),rand(10,170),rand(10,170));
        imagettftext($img, 20,rand(-20,20),$hpos,30,$col,$this->font,$string);
        $hpos += 25;
      }
      imagejpeg($img, $this->checksum().'.jpg', 80);
      imagedestroy($img);
    }
  }
?>
Code ist zu freien Verwendung freigegeben  :wink: 
3 Dateien angehängt
___________________________
MFG Jan
"funzt nicht" ist keine gültige Fehlerbeschreibung!*haarerauf*
http://www.sysprofile.de/id30821
29.08.2009 21:34 Uhr

 

Status: offline
Huhu,

in der Methode get_char() setzt du ja das Array mit den erlaubten Zeichen zusammen - verlagere das in den __construtor() !
Momentan ist es ja so, das für ein "5 Zeichen Captcha" diese Methode fünfmal aufgerufen und somit auch fünf mal das SELBE erlaubte Zeichen-Array generiert wird, obwohl sich an diesem ja nichts geändert hat !

~Dragonl
___________________________
Gemeinde Jugend Vertretung Bremen
"Ich will das Rad kein zweites mal erfinden,
ich will nur verstehen wie es funktioniert !"
29.08.2009 22:05 Uhr

 

Status: offline
Beim Drüberfliegen habe ich keine Erkennung von ähnlichen Zeichen entdeckt.

Man sollte ein Flag setzen können, das aktiviert, dass ähnliche Zeichen auch dann gelten, wenn das andere gemeint war (z.B. 0 und O, l und I, ...).
29.08.2009 22:58 Uhr

 

Xaron
Programmierer
Status: offline
Ich verstehe nicht ganz warum du eine checksum berechnest und dazu noch so kompliziert. Du musst nur den Filename (z.B. inkrementierende Zahl) und den captcha String speichern. Da niemand auf diese Daten zugreifen kann und diese sowieso nur von geringem Wert und kurzer Lebenszeit sind, reicht das vollkommen. Außerdem könnte man noch das Erstellungsdatum speichern, dann kann man auch einfach die veralteten captcha's aufräumen.
Ähnliche Threads Forum Ähnlichkeitsgrad
 Rechen Captcha - Sicher? Website & Webprogrammierung 2
 PHP Chat - Lgin Seite umschreiben - CyDots zu verdienen Website & Webprogrammierung 1
 Fragen zur PHP Injection. Website & Webprogrammierung 1
 [gelöst] Null anfügen -> Problem bei Berechnung Website & Webprogrammierung 1
 Captcha Script - lokal auf Xampp läuft es aber online nicht ? Website & Webprogrammierung 1
 Captcha Reload im IE geht nicht Website & Webprogrammierung 1
 PHP-Chat; DB oder txt? Traffic? Website & Webprogrammierung 1
nach obennach oben

Copyright © 2014 cybton-network

Google
Partner: #Musik - Dein Internetradio - nexem. - .wir machen news
ANEXIA - PHP Entwicklung - Web-Entwicklung - Fritz!Box Anrufmonitor für Mac OS - Rolladen, Markisen und Jalousien in Stuttgart - Rolladen in Stuttgart - SMSjobs