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