tepisenordek
08-11-2007, 20:36 PM
Signup, login vs. gibi kullanıcıdan form aracılığıyla bilgi girmesini beklediğimiz uygulamalarda,
post (veya get) edilen datayı, gerçekten kullanıcınınmı(insan) yoksa iyi niyetli olmayan bir
programınmı gönderdiğini anlamamız gerekebilir. Bu noktada insanın algı mekanizmasını kullanıp,
kötü niyetli programın resim olarak algıladığı, ama insanın resimdeki şekilleri harf ve rakam
olarak algıladığı bir atlatmaca kullanırız. İçinde harfler ve rakamlardan oluşan text bulunan bir
resim bu atlatmacayı kolayca yapacaktır. Ancak bazı OCR uygulamaları image dosyası içindeki
şekilleri ascii karakterlere çevirebilmektedir. OCR programları kitap harfleri ve bilinen
fontlardaki düzgün şekilleri ascii ye çevirebilmektedirler. Bunun için resmimizdeki texti biraz
okunması zor hale getirmek yeterli olacaktır. Hele yazı için yamuk bir font kullanırsak ocr nin işi
çok zorlaşacaktır.
KOD:
1.
2. <form name=formlogin method=post action="dologin.php">
3. Kullanıcı Adı :
4. <input name=user_title><br>
5. Kullanıcı Şifre:
6. <input type=password name=user_pass><br>
7. Güvenlik Kodu:
8. <input name=security_code><br>
9. <img src="s_code.php" width="144" height="32" border="0">
10. </form>
Yukarıdaki basit login formuna s_code.php ile image dosyası hazırlayalım;
PHP:
1.
2. <?
3. // s_code.php dosyamızın .png olarak algılanabilmesi için header
4. header("content-type: image/png");
5. session_start();
6.
7. // hafızada boş bir image oluşturalım
8. $im = imagecreate(144, 32);
9.
10. // resmimizin arka plan rengi için beyaz, yazı rengi için siyah renklerini oluşturalım;
11. $byz = imagecolorallocate($im, 255, 255, 255);
12. $syh = imagecolorallocate($im, 0, 0, 0);
13.
14. // resmimizi beyaza boyayalım. (default siyah oluşur)
15. imagefill($im, 0, 0, $byz);
16.
17. // resmimizin arkasına desen yapıyoruz.
18. // bunun için 20 adet boyutları ve rengi rastele elips ekleyelim
19. for($i=0;$i<20;$i++) {
20. $e_x = rand(0,144);
21. $e_y = rand(0,32);
22. $e_genislik = rand(3, 100);
23. $e_yukseklik = rand(3, 100);
24. $e_renk = imagecolorallocate($im, rand(200,255), rand(200,255), rand(200,255));
25. imagefilledellipse($im, $e_x, $e_y, $e_genislik, $e_yukseklik, $e_renk);
26. }
27.
28. // güvenlik için session_id yi hash edip ilk 5 karekterini alalım
29. $kod = substr(md5(sha1(session_id())), 0, 5);
30.
31. // bu beş karekteri resmin içine yazalım.
32. // yazarken bu dosyanın yanına koyacağımız
33. // True Type bir fontu kullanabiliriz.
34. // Burdaki 16 = font boyutu, 10 = açısı, 30 = x ve 22 = y
35. imagettftext($im, 16, 10, 30 , 32, $syh, 'ace.ttf', $kod);
36.
37. // oluşan image i gösterelim
38. imagepng($im);
39.
40. //hafızadaki resmi silebiliriz
41. imagedestroy($im);
42. ?>
post (veya get) edilen datayı, gerçekten kullanıcınınmı(insan) yoksa iyi niyetli olmayan bir
programınmı gönderdiğini anlamamız gerekebilir. Bu noktada insanın algı mekanizmasını kullanıp,
kötü niyetli programın resim olarak algıladığı, ama insanın resimdeki şekilleri harf ve rakam
olarak algıladığı bir atlatmaca kullanırız. İçinde harfler ve rakamlardan oluşan text bulunan bir
resim bu atlatmacayı kolayca yapacaktır. Ancak bazı OCR uygulamaları image dosyası içindeki
şekilleri ascii karakterlere çevirebilmektedir. OCR programları kitap harfleri ve bilinen
fontlardaki düzgün şekilleri ascii ye çevirebilmektedirler. Bunun için resmimizdeki texti biraz
okunması zor hale getirmek yeterli olacaktır. Hele yazı için yamuk bir font kullanırsak ocr nin işi
çok zorlaşacaktır.
KOD:
1.
2. <form name=formlogin method=post action="dologin.php">
3. Kullanıcı Adı :
4. <input name=user_title><br>
5. Kullanıcı Şifre:
6. <input type=password name=user_pass><br>
7. Güvenlik Kodu:
8. <input name=security_code><br>
9. <img src="s_code.php" width="144" height="32" border="0">
10. </form>
Yukarıdaki basit login formuna s_code.php ile image dosyası hazırlayalım;
PHP:
1.
2. <?
3. // s_code.php dosyamızın .png olarak algılanabilmesi için header
4. header("content-type: image/png");
5. session_start();
6.
7. // hafızada boş bir image oluşturalım
8. $im = imagecreate(144, 32);
9.
10. // resmimizin arka plan rengi için beyaz, yazı rengi için siyah renklerini oluşturalım;
11. $byz = imagecolorallocate($im, 255, 255, 255);
12. $syh = imagecolorallocate($im, 0, 0, 0);
13.
14. // resmimizi beyaza boyayalım. (default siyah oluşur)
15. imagefill($im, 0, 0, $byz);
16.
17. // resmimizin arkasına desen yapıyoruz.
18. // bunun için 20 adet boyutları ve rengi rastele elips ekleyelim
19. for($i=0;$i<20;$i++) {
20. $e_x = rand(0,144);
21. $e_y = rand(0,32);
22. $e_genislik = rand(3, 100);
23. $e_yukseklik = rand(3, 100);
24. $e_renk = imagecolorallocate($im, rand(200,255), rand(200,255), rand(200,255));
25. imagefilledellipse($im, $e_x, $e_y, $e_genislik, $e_yukseklik, $e_renk);
26. }
27.
28. // güvenlik için session_id yi hash edip ilk 5 karekterini alalım
29. $kod = substr(md5(sha1(session_id())), 0, 5);
30.
31. // bu beş karekteri resmin içine yazalım.
32. // yazarken bu dosyanın yanına koyacağımız
33. // True Type bir fontu kullanabiliriz.
34. // Burdaki 16 = font boyutu, 10 = açısı, 30 = x ve 22 = y
35. imagettftext($im, 16, 10, 30 , 32, $syh, 'ace.ttf', $kod);
36.
37. // oluşan image i gösterelim
38. imagepng($im);
39.
40. //hafızadaki resmi silebiliriz
41. imagedestroy($im);
42. ?>