+ Cevap Yaz
2 sonuçtan 1 ile 2 arası gösteriliyor

Konu: Güvenlik grafiklerinden karakter okuma (PIL)

  1. #1
    osx
    osx hatta değil
    Üye
    Üyelik Tarihi
    02/2007
    Yer
    Adana
    Mesaj
    61

    Güvenlik grafiklerinden karakter okuma (PIL)

    Selam arkadaşlar, bu yazıyı turkpython'da da yazmıştım, buraya eklemenin de faydalı olacağını düşündüm...

    Bildiğiniz gibi birçok sitenin önemli noktalarına (kayıt formu, giriş sayfası...) güvenlik amaçlı*, rastgele karakterlerden, oluşan grafik koyarlar ve bu grafiği doğru bir şekilde kodlamanızı isterler. (sanırım buna "capchta" diyorlar ama emin değilim)...

    Bu grafikler sayesinde siteye kötü amaçlı yazılmış robotlar sayesinde otomatik girişler, kayıtlar(vb...) önlenir*..

    Eğer rastgele* oluşturulan grafik ne kadar karmaşık ve ne kadar tanımlanması zor (standart ve aynılıklar olmadan) olursa bu grafiği okuyacak bir algoritma geliştirmesi de o kadar zor olur...

    Bu başlıkta; basitçe hazırlanan güvenlik kodunu PIL(Python Imaging Library) sayesinde okuyan bir uygulamaya yazacağız...
    Hazırlayacağımız programın okuyacağı grafiklerden örnekler;



    Ben okuma işlemini şöyle planladım:
    1- Temizleme (arka plandaki çizgiler temizlenir...)
    2- Parçalama (grafik karakterlerin hizasından parçalanır...)
    3- Tanımlama (tanımlama işlemini karşılaştırma yöntemi ile yaptım, aslında bu yöntem pek sağlıklı değil çünkü bu yöntemle karakterleri ezberletmiş olduk....

    1) Temizleme işlemi:
    Temizleme işlemi karışık sistemlerde pek mümkün olmayabilir ama bizim seçtiğimiz sistemin ürettiği grafiğin arka planı sade, işimiz kolay ...

    tamam, yukarıda gördüğünüz gibi karakterlerin arkasındaki ızgaraların rengi farklı (hexlenmiş renk kodunda da gördüğünüz gibi) biz bunu PIL'in getpixel() fonksiyonu ile okutup yine okunan koordinatta istediğimiz renge boyayabiliriz...
    Kod:
    import Image,ImageDraw
    
    kütüphaneleri uygulamaya dahil ettik...
    Kod:
    gr=Image.open("6.png")
    gr=gr.convert("RGB")
    boyut=gr.size
    
    Grafiği açtık, gif olduğundan dolayı RGB düzenine geçirdik,boyutunu size fonksiyonu ile okuduk.
    Kod:
    print boyut
    boya=ImageDraw.Draw(gr)
    for x in range((boyut[0])):
        for y in range((boyut[1])):
            bul=gr.getpixel((x,y))
            if bul==(255,200,150):
                boya.point((x,y),(255,244,234))
            if (x==0) or (y==0) or (y==(boyut[1]-1)) or (x==(boyut[0]-1)):
                boya.point((x,y),(255,244,234))
    print boyut
    gr.save("temiz.png")
    
    Yukarıda renk kontrolü yaptık, (255,200,150) renk kodunun hexlenmiş hali "ffc896"'du (ki PIL her iki renk kodlamasını da kabul eder), eğer okunan koordinatta renk kodu (255,200,150) ise o nokta (255,244,234) boyanacak...
    işlem bitti ve kaydettik...

    Aslında bu sistem en ufak bir renk değişikliğinde çakar bundan dolayı daha zeki sistemler yazmak gerekir... Mesela bütün renklerin (renk kodlarının) sayısı belirlenir ve en çok olan boyanır (vb eleme yöntemleri)... Dediğim gibi grafiğin şekline göre algoritma değişir...

    2)Parçalama:
    Parçalama işlemini yine "ezber" yöntemi ile yaptım yani iki karakter arasındaki piksel sayısını girerek yaptım, gelişmiş bir sistemde bu sistem başarısız olur fakat uygulamnın okuduğu grafiği kullanan siteler hala var (!)
    Kod:
    import Image
    gr=Image.open("temiz.png")
    boyut=gr.size
    x=8
    y=4
    artan=0
    for kx in range(6):
        if kx<>0:
            alan=kx*x+artan,y,(kx+1)*x+artan,boyut[1]-y
            print alan
            res=gr.crop(alan)
            res.save("parcalar/"+str(kx)+".bmp")
            artan=artan+1
    
    Yukarıdaki kod temizlenen garifiği karşılaştırma işlemi için parçalara ayırıyor...

    3) Tanımlama:
    Daha önce de belirttiğim gibi tanımlama işlemi kontrol yolu ile yapılıyor yani elimizde olan grafiklerdeki karakterler le parçalar kontrol ediliyor mesela: parçalardan biri 0'dan 9'a kadar olan bütün grafiklerle karşılaştırılıyor...
    Aslında bu yöntem çok ilkel, en ufak bir değişiklikte bile işe yaramayabilir ama 1-2 satırlık değişimle çok daha zeki hale getirilebilir...
    Kod:
    import os,Image
    
    bulunan=""
    dosyalar=os.listdir("parcalar")
    for x in dosyalar:
        if x=='Thumbs.db':dosyalar.remove('Thumbs.db')
    
    karakterler=os.listdir("karakterler")
    for x in karakterler:
        if x=='Thumbs.db':karakterler.remove('Thumbs.db')
    
    print "Dosyalar:",dosyalar,"\n"
    print "Karakterler:",karakterler
    
    fark=0
    for dos in range(len(dosyalar)):
        for kar in range(len(karakterler)):
            
            karakter=Image.open("karakterler/"+karakterler[kar])
            karakter=karakter.convert("RGB")
            
            dosya=Image.open("parcalar/"+dosyalar[dos])
            dosya=dosya.convert("RGB")
            boyut=karakter.size
            
            for x in range(boyut[0]):
                for y in range(boyut[1]):
                    Ka_renk=karakter.getpixel((x,y))
                    Do_renk=dosya.getpixel((x,y))
                    if Ka_renk<>Do_renk:
                        fark=fark+1
            if fark==0:
                print dosyalar[dos],karakterler[kar]
                bulunan=bulunan+karakterler[kar][0:1]
            fark=0
    print bulunan
    
    Yukarıdaki kodda; parçaların eklendiği klasörden okumalar ve karşılarştırmalar için karakterlerin bulunduğu klasör üzerinde işlem yaptık... (işin işletim sistemi kısmı yani )

    Karşılaştırma karakterleri:
    http://rapidshare.com/files/78552466/karakterler.rar
    Uygulamamız bitti. Dediğim gibi bu sadece bir deneme yani çok basit bir uygulama bu, en ufak bir renk değişiminde* en ufak bir font değişiminde çakacaktır ama küçük değişiklerle bu uygulama daha zeki hale getirilebilir... Ve birçok portaldaki ziyaretçi defterleri mesaj gönderme sisteminde bu grafik düzenini kullanıyor...
    Başarılar...
    Kod:
    # mehmet3@gmail.com
    

  2. #2
    Üye
    Üyelik Tarihi
    05/2007
    Mesaj
    17

    Teşekkürler verdiğininiz bilgiler için, devamını bekliyoruz..
    Inş anlatılacak başka konularla python severleri çekip python'un güzellerini anlatacağımız bir ortam oluşur .!

+ Cevap Yaz

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

     

Benzer Konular

  1. XML okuma
    By telmessos in forum Visual Basic
    Cevap: 1
    En Son Mesaj: 21/01/2007, 21:19
  2. Php de Rss okuma
    By onurkuru in forum PHP
    Cevap: 4
    En Son Mesaj: 07/01/2007, 14:24
  3. Yazılımsal Güvenlik Algoritmaları ve Güvenlik Paranoyaları İçin Ek Dosya
    By cemaliozan in forum Pascal / Delphi / Delphi.NET
    Cevap: 5
    En Son Mesaj: 07/04/2006, 17:18
  4. RSS okuma
    By KanKi in forum Visual Basic
    Cevap: 3
    En Son Mesaj: 26/01/2006, 02:50

Bookmarks

Mesaj Yazma Hakları

  • Yeni mesajgöndermezsiniz
  • Cevap yazamazsınız
  • Dosya ekleyemezsiniz
  • Mesajınızı düzenleyemezsiniz