• 07-01-2011, 14:56:22
    #1
    Merhaba arkadaşlar;

    Çoğumuzun başına bir çok sıkıntı gelmiştir bu yazılım dünyasında.. Kimi kazıklanmıştır. Kiminin yazdığı sistem çalınmıştır. Kiminin parasi ödenmemiştir. Kimide parayı alıp kaçmıştır..

    Şimdi "Kiminin yazdığı sistem çalınmıştır" cümlemize çözüm bulacağız. Aslında çok basit bir işlem ancak biraz karışık gibi gelebilir oldukça basit anlatacağım.

    Admin panelimizi şu mantıkta tasarlayacağız bir çok açıkta otomatik kapanmış olacaktır.

    admin panelimizi ayrı klasörde yapıp, içine index.php, orta.php boş dosya açıp birde class diye klasör yaratıp içerisine, fonksiyonlar.php
    boş dosya açıp işlemlerimize başlıyoruz.

    Bu yaptığımızın mantığı nedir ?

    Tüm işlemleri index.php üstünden yürüteceğiz diğer dosyaları sadece include edeceğiz ve sadece işlem komutları olacak, bir daha veritabanını include etmemiş, diğer fonksiyon dosyalarını tekrar tekrar kodlarını yazmamış olacağız hatta tablolarla bile uğraşmayacağız, sadece adminin değişmesi gereken kısımla uğraşacağız 2 html 2 de php attıkmı tamamdir hesabı

    Şimdi işlemlere geçelim..

    index.php

    Admin paneli tasarımımızı yapıyoruz yada burdan hazır yapılmış cillop gibi tasarımlardan çok ucuza satın alıyoruz. tasarımın ana sayfasını index.php ye geçiriyoruz. daha sonra tasarımın işlem bölgesi yani ekle çıkarma formlarının olduğu kodu içinde buluyoruz ve oranın kodlarını kesip

    <?php include('orta.php'); ?>

    bu kodu yazıp, sonrada default.php adında bir dosya yaratıp o kestiğiniz html kodları onun içine ekliyoruz.

    Şimdi orta.php yi açıyoruz.

    Orta.php

    <?php
    $ejder=@$_GET['ejder']; // dışarıdan hangi sayfayı çağırdığımızı öğrenmek için get değerini çekiyoruz ben ejder yaptım adını
    $ejder=(int) $ejder; // bakalım dışarıdan ne tür veri geliyo int yaparsak ne girersek girelim rakam oluşturmaya çalışacak mesela 1a yapsak 1 değerini alır
    switch ($ejder): // basit bir switch eylemi yapıyoruz
    case '1': // şimdi diyelim kategoriler listesini çağıracağız o yuzden kategori.php yapıp sadece default.php de yaptığımız gibi html ve php kodlarıkoyacağız çağırdığımızda buraya direkt çalışacak
    include('kategori.php');
    break;
    case '2':
    include('kategori_ekle.php');
    break;
    case '3':
    include('kategori_duzen.php');
    break;
    default: // eğer herhangi bir veri gelmezse bu çağrılacak
    include('default.php');
    }
    endswitch;
    ?>

    Açıklamalara baktığımızda zaten anlayacaksınız şimdi bunu neden yaptık, neden int olarak veri aldık neden direk dosya adını girmedik. dosya adını girmedik çünkü RFI dediğimiz açık oluşuyor. örnek olarak admin panelinizde demo hesabı açsanız bile kişi burdan kendi sunucusundan kodları sizin sunucunuzdanmış gibi çalıştırabilir. yine caseden önce int değerini koruduk ne girersek girelim int değeri dönecektir. yazdığınız durumda hiç rakam olmazsa 0 dönecektir bu da default dosyanızı çalıştıracaktır yine RFI açığından yırtmış olduk. ayrıca sadece orta.php yi çağırdığımızdan dolayı biraz daha rahat bir kullanım sunduk sadece her dosyada tek tek elle tanımlayacaksınız isterseniz çok geniş bir sistem yazın tek tek her dosyayı tanımlayacaksınız. Burası biraz uğraştırmış olacak ancak alışınca pek sorun olmayacaktır. Bu ileride işimize çok yarayacak makalemizin sonlarına doğru anlayacaksınız..

    Şimdi gelelim fonksiyonlar.php

    fonksiyonlar.php

    Şimdi index.php yi yaptık içine orta.php yi include ettik. index.php'nin en üst satırına fonksyonlar.php yi include edeceksiniz. Peki neden ?

    Güvenliğini koruyacağımız dosyalardan birisi index.php ayrıca tekrar tekrar çağırmamak için index.php den çağırdığımızda orta.php de çağırdığınız tüm dosyalardada aktif olacaktır. yani veritabanı çağırmadan tekrar mysql_query yaptığınızda direk işlem yapacaktır örneğin.

    fonksiyonlar.php'nin içine kategori listeleme, ekleme, silme atıyorum haber ekleme silme güncelleme şeklinde fonksyonlar yapacaksınız. sonra bunları orta.php dosyasında tanımladığınız yerlerde çağıracaksınız, yani sistemin şah damari fonksiyonlar.php olmasi gerekiyor..

    şimdi sistemin işleyişini anladığımıza göre lisanslamamızı yapalım kontrollerini gerçekleştirelim.

    ilk önce benim çok yazılımım olduğu için özel, özel olmayan, sürüm satışlar vb tarzında olduğu için lisans sunucum var.

    lisans sunucusunun mantığını anlatacağım isterseniz lisans verisini xml ye bastırırsınız isterseniz veritabanından xml çıktı verirsiniz fark etmes ana mantık lisans varmı yok mudur bu kadar..

    mesela benim lisans sunucumun domaini www.prolisans.com, diyelim ki atıyorum lisansların tutulduğu bir xml adresim var bunun adıda lisanslarim.xml bunun içine lisans kodunu ekleyeceksiniz bu kadar, tüm lisansları aynı dosyaya koyabilirsiniz.

    şimdi fonksiyonlar.php nin içinde şu şekilde bir fonksiyonumuz olmasi gerekiyor.

    şimdi öyle bir fonksiyon yazacağız ki, eğer lisansı olmadan kullanılıyorsa yada lisanssız giriş yapılmaya çalışıyorsa size ihbar edecek..

    session_start();
    if (!$_SESSION['durumnedir']) {
    function domainver() {
    if (substr($_SERVER['HTTP_HOST'], 0, 4) == "www.") { //alan adı değişkeni bazı sunucularda www ile başlıyor bazılarında www. suz ondan böyle bir değişkene ihtiyac var
    $domainadi = substr($_SERVER['HTTP_HOST'], 4);
    } else {
    $domainadi = $_SERVER['HTTP_HOST'];
    }
    return $domainadi;
    }
    $alanadi=domainver();
    $hesap=1+9+2*8/1%12+8-10*1;
    $hesap2=2*4/7*5/6/8;
    $alanadi_md5=md5($hesap.$alanadi.$hesap2);
    $alansayfa=$_SERVER['REQUEST_URI'];
    $lisans=curl_cek('http://www.prolisans.com/lisanslarim.xml');
    if (!eregi($alanadi_md5,$lisans)) {
    if (eregi('index.php',$alansayfa)) {
    curl_cek("http://www.prolisans.com/lisans_ihbar.php?url=$alanadi&md5=$alanadi_md5");
    $msj="Lisansınız yok.<br />$alanadi<br />$alanadi_md5<br /> Eğer lisansınızın olduğunu düşünüyorsanız lisans sunucusunda geçicir bir çalışma yapıldığından sunucuya ulaşılamıyordur.";
    echo iconv('UTF-8','ISO-8859-9',$msj);
    exit();
    }else{
    curl_cek("http://www.prolisans.com/lisans_ihbar.php?url=$alanadi&md5=$alanadi_md5");
    $bugfix='1';
    }
    }else{
    $_SESSION['durumnedir']='ok';
    }
    }

    şimdi yazdığımız bu fonksiyonu açıklıyorum sırayla. domain ver diye bi fonksyon oluşturdum bu fonksyon domainin www'süz halini veriyor kısaca domaine lisanslıyoruz. daha sonra domaini alıp bir kaç çarpım işlemi yapıp kafama göre rastgele ama diğer lisanslardada aynısı olacak şekilde bir md5 sonucu çıkartıyorum, md5 i o şekilde karıştırmamın amacı spof yapıp kendileri md5 leyip sanki domainde lisans varmış gibi gösterebilir. bu lisans fonksiyonunu sizden başkası görmemesi gerekiyor çünkü spof yapabilir.

    lisans_ihbar.php diye bir dosya oluşturdum bunun içine alan adı ve md5 li halini koyuyorum, eğer lisanssız giriş yapmaya calisiyorsa bunu bizim sistemimize get methodu ile yolluyor sizde bunu get url get md5 diye alııp kayıt attirebilirsiniz istediğiniz gibi.

    durumnedir diye bir session oluşturdum çünkü kullanıcı giriş yaptığında her işlem yaptığında kontrol edeceği için gereksiz bir yük oluşturacak bir kez eğer giriş tamamlandıysa bir daha kontrol etmeyecek. curl_cek diye bir fonksyon oluşturdum daha sonra sistemimin baska yerlerindede daha kolay kullanmak için xml dosyasını curl ile çekip işlem yaptırmak için. bu lisanslamanın mantıgı dosyayı kontrol edip, eğer içinde üretilen key varmı yok mı kontrol amaçlıdır.

    lisans domaininizede o dosyanın içerisine o keyi eklediğinizde sorunsuz bir şekilde lisanslanmış olacaktır. ayrıca domain lisanslamada genelde sonradan değiştirememe gibi bir problem oluyordu, sunucu tabanlı olduğu zaman, mesela ttnet tarafından banlansa kişi domaini ancak yazılımı değiştirmemek istese size bir haber verip yeni lisans kodunu ulaştırdığında eskisi ile değiştirmeniz yeterli olacaktır.

    şimdi php ile yazdığınız bu scriptte en önemli unsur hangi dosyalar şifrelenmeli, bu mantığa göre yazdığınızda 2 dosyayı şifreleyeceksiniz, geri kalan tüm dosyaların kodları açık olacak. Hem sistemi satın alan kişi istediği gibi geliştirebilecek, hemde %99'u açık kaynaklı bir yazım olacak, güvenliğinizde risk altına girmiş olmayacak. kısaca sisteminizi oluşturan 2 dosya olduğunda diğer dosyalar çöp olacak, fonksiyonlar.php'yi yeniden yazacak bir baba yiğit çıkmazsa.. sizin değişkenlerinizin aynısını kullanıp yine sizin mantığınızda yazması gerekecek, ee her değişkenide görebilecek değil ya ? ayrıca onu yazacak kapasitede bir insan, zaten sizin sisteminize ihtiyac duymaz, hem sizin yazılım mantığınızı çözmesi zaman alır, hem onu yazması zaman alır, oturur çatır çatır yazar

    İşin aslı 3 yıldır bu lisans mantıgını kullanıyorum ilk zaman 1-2 deneme yapan olduda ondan sonra bir daha uğraşan olmadı..

    Son olarak curl_cek fonksiyonunun kodlarınıda vereyim size yazmaya uğraşmayın

    function curl_cek($ursa){
    $useragent = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
    $referer = 'http://www.google.com/';
    $ch = curl_init();
    $zaman = 0;
    curl_setopt ($ch, CURLOPT_URL, $ursa);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $zaman);
    curl_setopt ($ch, CURLOPT_REFERER, $referer);
    curl_setopt ($ch, CURLOPT_USERAGENT, $useragent);
    $rmx = curl_exec($ch);
    curl_close($ch);
    return $rmx;
    }

    Şimdi şifreleme için 2 seçenek sunuyorum.

    * IONCUBE
    * ZEND

    Ioncube'yi tavsiye ederim yogun kodlara sahip bir dosyayı kırması çok zor olur, oturupda baştan yazmak da istemez kimse.. şifrelemesi çokda kolay ioncube'nin adresine giriyorsunuz 5$, 25 dosya şifreleme hakkı satın alıyorsunuz bu kadar.

    Zend'i pek tavsiye etmiyorum, kırılmasi çok yaygındı bir sıralar şimdi ne durumdadir açıkçası bilmiyorum.

    Benden bu kadar.. Gerisi size kalmış, hayal gücü + geliştirme yeteneği ile gelsin paralar )

    Diğer makalemde görüşmek dileğiyle..

    Hakan Bulut

    Yeni açtığım makale sitemi yayına aldım.
    http://www.kodara.com/php-ile-lisanslama.html
  • 07-01-2011, 15:26:00
    #2
    Üyeliği durduruldu
    Merhabalar,

    Gayet güzel bir konuya değinmişsiniz. Fakat bu yaptığınız şifreleme kolaylıkla kırılabilir. Üstelik ioncube'yi çözmeden. Site adresini $_SERVER['HTTP_HOST'] ile alıyorsunuz. Fakat

    $_SERVER['HTTP_HOST'] = 'önceden lisans almış alan adı';
    Yazarsak ne olacak? Ayrıca eregi fonksiyonu PHP 5.3.0 sürümünden sonra tavsiye edilmiyor.
  • 07-01-2011, 15:35:59
    #3
    Üyeliği durduruldu
    makale için elinize sağlık yalnız hatıtlatma yapalım

    uzaktan lisans kontrolu sakıncalıdır , şimdi benim yazımları 250 site kullanıyor diyelim
    1 site 50k hite dayanırsa server load olur


    ne yapmak lazım

    kendi içerisinde lisans kontrolu yapılır eğer ters durum varsa mail gönderir veya tüm dosyaları siler
  • 07-01-2011, 15:52:37
    #4
    SametAras adlı üyeden alıntı: mesajı görüntüle
    Merhabalar,

    Gayet güzel bir konuya değinmişsiniz. Fakat bu yaptığınız şifreleme kolaylıkla kırılabilir. Üstelik ioncube'yi çözmeden. Site adresini $_SERVER['HTTP_HOST'] ile alıyorsunuz. Fakat

    $_SERVER['HTTP_HOST'] = 'önceden lisans almış alan adı';
    Yazarsak ne olacak? Ayrıca eregi fonksiyonu PHP 5.3.0 sürümünden sonra tavsiye edilmiyor.
    eragi fonksyonu değiştirebilinir amaç varmı yok mı kontrolu, zaten spoffing i aşmak için md5 e farklı smileler ekledim fark ettiysen, bu hesaplamayı senden baskası bilmezse sorun olmuyor. yanı ztn sen ioncubeledin, adam domaini düz md5 lerse olmaz, farklı sonuc cıkar bu mantıgı vbulletin kullanıyor mesela. normal user şifrelerinde bile, mesela phpmyadminden kullanıcıya düz şifre versen md5 e bastırsan olmuyor, ufak bi algoritma değişikligi var vbde o kadar.

    BHCoder adlı üyeden alıntı: mesajı görüntüle
    makale için elinize sağlık yalnız hatıtlatma yapalım

    uzaktan lisans kontrolu sakıncalıdır , şimdi benim yazımları 250 site kullanıyor diyelim
    1 site 50k hite dayanırsa server load olur


    ne yapmak lazım

    kendi içerisinde lisans kontrolu yapılır eğer ters durum varsa mail gönderir veya tüm dosyaları siler
    bu lisanslar ***** projelerindede kullanmıştım o yuzden sık domain değişikligi istiyorlar zırt pırt sırf adama özel şifreleme yapmak istemediğim için sunucu kontrollu yaptım, load sorununa gelince, ben sadece admini şifreliyorum bu mantıkta normal kullanıcı arayuzunude güvenlige alabilirsin, ilk girişte bi kontrol yapıyor sonra session a alıyor, sonra bi daha sorgulamıyor sıkıntı burda değilde, veritabanından her kontrolde çekmekte. ben bunu şu şekilde aştım, veritabanında yine bilgiler ancak, bir lisans eklediğimde, tekrar XML oluşturuyorum, sitemap mantığında, yani 250 tane lisans olsa id ve lisans keyını girse taş çatlasın 10 - 20 kb tutar xml dosyası, buda loadları yükseltmiyor daha fazla lisansa sahip olduğum için denedim, sorun yok, 2-3 yıldırda problem yok, 2-3 yıldır bu lisanslama mantıgını kullandıgım ıcın eragi eskimiş olabilir onuda farklı bi fonksyonla değiştirdikmi yeterli
  • 07-01-2011, 15:54:34
    #5
    SametAras adlı üyeden alıntı: mesajı görüntüle
    Merhabalar,

    Gayet güzel bir konuya değinmişsiniz. Fakat bu yaptığınız şifreleme kolaylıkla kırılabilir. Üstelik ioncube'yi çözmeden. Site adresini $_SERVER['HTTP_HOST'] ile alıyorsunuz. Fakat

    $_SERVER['HTTP_HOST'] = 'önceden lisans almış alan adı';
    Yazarsak ne olacak? Ayrıca eregi fonksiyonu PHP 5.3.0 sürümünden sonra tavsiye edilmiyor.
    birde ek yapayım bu mesajınıza, alan adı ile değilde, lisans keyıyle çalışıyor sadece. diyelim spoffingle aştınız. ancak bu sefer domain + domainin gerçek keyinede sahip olmak gerekiyor. zaten bunlar da şifreli olduğu için sattığınız kişi göremiyor. key ise sunucudan geliyor
  • 07-01-2011, 16:00:15
    #6
    Üyeliği durduruldu
    MaviEjder adlı üyeden alıntı: mesajı görüntüle
    birde ek yapayım bu mesajınıza, alan adı ile değilde, lisans keyıyle çalışıyor sadece. diyelim spoffingle aştınız. ancak bu sefer domain + domainin gerçek keyinede sahip olmak gerekiyor. zaten bunlar da şifreli olduğu için sattığınız kişi göremiyor. key ise sunucudan geliyor
    Meselâ siz, abc.com adresine lisans verdiniz. Bu durumda abc.com adresinin sahibi, cba.com adresindede bu scripti kullanabilir. Sadece yapması gereken:


    $_SERVER['HTTP_HOST'] = 'www.abc.com';
  • 07-01-2011, 16:07:03
    #7
    Uzmek istemem yontem guzel fakat ioncube iki dk'da kiriliyor.. Wp tema verdim alan kirmis hatta footer author ada ada hatasiz kul kirilmayan kod olmaz yazmisti (: cok mide bulandirici bir durum..
  • 07-01-2011, 16:14:41
    #8
    Verirsiniz 300$ alırsınız ioncube tüm dosyaları bir domain ya da ip adresi üzerinde çalışacak şekilde şifrelersiniz olur biter. hem compiled kod daha hızlı çalışır ))
    hele hele böyle lisansı başka siteden çeken sunucu işleri çok sakat.
    senin sunucun Türkiye'de benim sunucum amerikada. Türk telekım yurt dışı çıkış hatları göçtü mü benim sitede göçer. Ben sana parayı peşin verdim mi scripti almak için. Sen bana hizmeti kesintiye uğratacak riskte kodu nasıl verirsin. Senin serverın yandı 1 gün boyunca kapalı kalan sitemde oluşan adsense hit sıralama kaybımı ödeyecek misin peki?
    Kodunuzu koruyun elbette ama size hizmet için parayı veren adamı mağdur etmeye de hiç hakkınız yok.
  • 07-01-2011, 16:15:48
    #9
    SametAras adlı üyeden alıntı: mesajı görüntüle
    Meselâ siz, abc.com adresine lisans verdiniz. Bu durumda abc.com adresinin sahibi, cba.com adresindede bu scripti kullanabilir. Sadece yapması gereken:


    $_SERVER['HTTP_HOST'] = 'www.abc.com';
    tamamda arkadaşım sen bu kodları göremeyeceksin ki nasıl değiştireceksin, sen yazdığın için biliyorsun ? yazan adam kendi yazdığını tersine çevirerek her zaman kırar, aradaki farkı bilmiyorsun ki..

    shevko adlı üyeden alıntı: mesajı görüntüle
    Uzmek istemem yontem guzel fakat ioncube iki dk'da kiriliyor.. Wp tema verdim alan kirmis hatta footer author ada ada hatasiz kul kirilmayan kod olmaz yazmisti (: cok mide bulandirici bir durum..
    ioncubenın kırılmasi boyuttan boyuta değişiyor. tüm sitenin fonksyon kodları bir dosyada olursa ortalama 80 kb fln olur, he kırılmaz diye bişey yok, zaten %100 kırılmazda demedim, önleyebildiğm kadar önledim, 2 yıldır kafam rahat dedim, kullanan kullanır kullanmayan, hiç bişi kullanmadan durur, müşterim geliyor domainimi x.com yaptım, tmm kardeşim diyorum, bitiyor gidiyor

    yoksa dünyada kırılmayacak kod mu var