Merhaba arkadaşlar , bugünlerde geliştirmekte olduğum bir sistem için yazdığım form verileri kontrol sınıfını sizlerle paylaşmak istedim , bazen arşivimden bazı dosyaları elimden geldiğince seyrek olarak eklemeye çalışıyorum , bu sefer form verilerini kontrol etmemizi sağlayan GUMP sınıfını örnek alarak geliştirmekte olduğum bir sınıfı sizlerle paylaşacağım ;
En sonda örnek bir kullanım yer almakta bu kullanımda kullanıcının get değerlerine göre bir kontrol yapıyor $_POST değerlerine göre de yapılabilir burada bir form başlatıyoruz , verileri tutabiliyoruz , girdileri_tut ile form verilerini bir COOKIE olarka kayıt edip sayfa yenilendiğinde kalmasını sağlıyor , bunun haricinde deneme ve bekletme kontrolleri var , birçok kontrol komutu var ve çoğaltmaya çalışıyorum , şu anda sorunsuz gözüküyor fakat sizlerinde kontrol etmesini , açıklar varsa söylemesini isterim , ayrıca son olarak tüm raporlar $site_formlari->raporlar değişkeninde toplanıyor , bunuda bir rapor fonksiyonuna dökmeyi planlıyorum , ayrıca sınıf içinde projede kullandığım site_guvenligi ve site_dili sınıflarını kullanmaktayım bunlar yüzünden kullanmanız biraz sıkıntı olabilir biraz kodtan anlayan birisi $site_guvenliği adı altında bir nesne oluşturup guvenli_post ve guvenli_get adı altında 2 fonksiyon altına return yapabilir. site_dili nesnesi için ise $site_dili->hazirla , $site_dili->getir komutlarını yine return olarak yapabilir ve hataları fixleyebilir , sınıfın bitmiş halini de paylaşmaya çalışacağım eğer tatmin olursam , bu kodu $site_dili ve $site_guvenliği sınıflarından bağımsız çalışmaya hazır hale getireceğim.
Kod:
<?php
include_once(__DIR__.DIRECTORY_SEPARATOR.'guvenlik.sinif.php');
Class form_verileri_sinifi {
/* Bu sınıf formlardan gelen , kullanıcının girdiği verileri kontrol eden sınıftır.
Kullanıcının bir email , bir url , bir değişkenin post etmesi sonucunda oluşacak
verileri kontrol eder süzgeçinden geçirir ve öyle işler , bu sayede olası hack'in önüne
geçilir.
*/
Public $raporlar;
private static $istenmeyen_kelimeler;
private static $bekletme_suresi;
private static $maksimum_deneme_sayisi;
private static $tekrar_deneme_suresi;
private static $girdi_kayit_suresi = 5*24*60*60; #24saat.
Public $kontrol_elemani_ismi;
Protected $deneme_bekletiliyor = 0;
Private static $dogru_yanlis_dizisi = array('1','true',true,1,'0','false',false,0,'evet','hayir','acik','kapali');
Public $baslangic_parametreleri = array('form_etiket'=>'global',
'deneme_kontrolu'=>true,
'dogrulama_kontrolu'=>true,
'bekletme'=>true,
'tutulacak_girdiler'=>array('get'=>'form_id','post'=>'nick'));
Public $girdiler;
Public Function __construct(){
Global $site_ayarlari;
#istenmeyen_kelimeler.
self::$istenmeyen_kelimeler = explode(',',$site_ayarlari->getir('istenmeyen_kelimeler'));
#her denemede bekletme süresi ( saniye bazında )
self::$bekletme_suresi = $site_ayarlari->getir('g_bekletme_suresi');
#maksimum_giris_denemesi.
self::$maksimum_deneme_sayisi = $site_ayarlari->getir('g_maksimum_deneme');
#tekrar_deneme_süresi. ( dakika bazında )
self::$tekrar_deneme_suresi = $site_ayarlari->getir('g_tekrar_deneme_suresi')*60;
}
Public Function form_baslat($parametreler = array()){
@session_start();
if(count($parametreler) > 0){
#yazılanları değiştiriyoruz. @o3karahan.
foreach($parametreler as $param_etiket => $param_deger){
#değiştirme işlemi tamamlandı.
$this->baslangic_parametreleri[$param_etiket] = $param_deger;
}
#tutulacak girdiler formda girilen önceki değeri tutmaya yarar., açılıp kapatılabilir.
$this->girdileri_tut($this->baslangic_parametreleri['form_etiket'],$this->baslangic_parametreleri['tutulacak_girdiler']);
$this->girdileri_yukle($this->baslangic_parametreleri['form_etiket']);
}
}
/*
Girdiler ile ilgili bölüm başlıyor , bu bölüm başlatılan formun
kullanıcı tarafından girilen verilerini tutar , bu tutma sonucu
kullanıcı sayfayı yenilediğinde tekrar bir önceki girdilerine rahat
bir şekilde ulaşabilir.
$tutulacak_girdiler = array('post'=>'email');
$site_formlari->form_baslat(array('form_etiket'=>'kayit','tutulacak_girdiler'=>$tutulacak_girdiler));
$site_formlari->girdi('email','Lütfen email adresinizi giriniz!');
Eğer kullanici daha önceden email adında bir post yolladıysa bu verileri tutar
daha sonrasında çağırdığınızda yazar , bulamaz ise yoksa etiketindeki
"Lütfen..." kelimesini bastırır.
$tutulacak_girdiler = array('email'=>'get','x'=>'get');
$site_formlari->form_baslat(array('form_etiket'=>'kayit','tutulacak_girdiler'=>$tutulacak_girdiler));
echo $site_formlari->girdi('email','Lütfen email adresinizi giriniz!');
*/
Private Function girdileri_tut($form_etiket = "global",$girdiler = array()){
Global $site_guvenligi;
$form_etiket = $this->baslangic_parametreleri['form_etiket'];
if(count($girdiler) > 0){
$cookie = "";
foreach($girdiler as $girdi_etiket => $girdi_tipi){
#Site güvenliği nesnemin içinde guvenli_post ve guvenli_get adında girdilerim var.
if(method_exists($site_guvenligi,'guvenli_'.$girdi_tipi)){
#getiriyoruz.
$girdi = call_user_func(array($site_guvenligi,'guvenli_'.$girdi_tipi), $girdi_etiket);
#kayıt ediyorum.
if($girdi !== false){
$cookie .= $girdi_etiket.'-'.$girdi.'.';
}
}
}
#cookie ayarlıyoruz.
$form_cookie_etiket = $site_guvenligi->cookie_etiket_sifrele('F_'.$form_etiket.'_G');
setcookie( $form_cookie_etiket , $site_guvenligi->cookie_sifrele($cookie), time() + self::$girdi_kayit_suresi , '/');
}
}
Private Function girdileri_yukle($form_etiket = "global"){
Global $site_guvenligi;
$form_etiket = $this->baslangic_parametreleri['form_etiket'];
$form_cookie_etiket = $site_guvenligi->cookie_etiket_sifrele('F_'.$form_etiket.'_G');
if(isset($_COOKIE[$form_cookie_etiket])){
$parcalanacak = $site_guvenligi->cookie_sifre_boz(htmlspecialchars_decode($_COOKIE[$form_cookie_etiket]));
$birinci_kademe = explode('.',$parcalanacak);
if(count($birinci_kademe) > 0){
foreach($birinci_kademe as $parcalanacak){
$ikinci_kademe = explode('-',$parcalanacak);
$girdi_etiket = (!empty($ikinci_kademe[0]) ? $ikinci_kademe[0] : null);
$girdi = (!empty($ikinci_kademe[1]) ? $ikinci_kademe[1] : null);
$this->girdiler[$form_etiket][$girdi_etiket] = $girdi;
}
}
}
}
Public Function girdi($girdi_etiket,$yoksa){
$form_etiket = $this->baslangic_parametreleri['form_etiket'];
if(isset($this->girdiler[$form_etiket][$girdi_etiket])){
return $this->girdiler[$form_etiket][$girdi_etiket];
}else{
return $yoksa;
}
}
/*
Tekrar deneme bölümündeki komutlar ile kullanıcının forma girdiği
verileri tekrar denemesinin bir sınır şartı ile gerçekleşmesi sağlanır.
Bu sayede kullanıcının bir şifre kırma , bir sistem yorma amacı engellenmiş
olur , aynı zamanda bekletme süresi de bu komutların içinde yer alır.
$site_formlari->form_baslat();
$site_formlari->deneme_kontrolu(array('get','email'));
*/
Public Function deneme_kontrolu($deneme_etiket=array()){
Global $site_guvenligi,$site_dili;
$deneme_tipi = $deneme_etiket[0];
$deneme_etiket = $deneme_etiket[1];
if(method_exists($site_guvenligi,'guvenli_'.$deneme_tipi)){
#getiriyoruz.
$deneme = call_user_func(array($site_guvenligi,'guvenli_'.$deneme_tipi), $deneme_etiket);
#kayıt ediyorum.
if($deneme !== false){
#SESSİON'lar önemli.
$yasak_suresi = 0;
$deneme_sayisi = (isset($_SESSION['g_deneme_sayisi']) ? $_SESSION['g_deneme_sayisi'] : 0);
$son_deneme_zamani = (isset($_SESSION['g_s_deneme_zamani']) ? $_SESSION['g_s_deneme_zamani'] : null);
$deneme_hakki = self::$maksimum_deneme_sayisi;
$tekrar_deneme_suresi = self::$tekrar_deneme_suresi;
$bekletme_suresi = self::$bekletme_suresi;
$bekletildi_mi = 0;
#Mantıksal kontroller.
if($this->baslangic_parametreleri['bekletme']){
#bekletme kontrolü.
if(!empty($son_deneme_zamani)){
$beklenilen_zaman = time() - $son_deneme_zamani;
if($beklenilen_zaman < $bekletme_suresi and !isset($_SESSION['yasak_suresi'])){
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_bekletme_suresi',array('s'=>$bekletme_suresi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 0, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => 'deneme',
'rapor_yazisi' => $hata_yazisi
);
$bekletildi_mi = 1;
}
}
}
#Mantıksal kontroller.
if($this->baslangic_parametreleri['deneme_kontrolu'] and !$bekletildi_mi){
if($deneme_sayisi == $deneme_hakki){
#Yasak süresi bekirleniyor.
$yasak_suresi = time() + $tekrar_deneme_suresi;
$_SESSION['yasak_suresi'] = $yasak_suresi;
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_deneme_yasaklandi',array('h'=>$deneme_hakki,'s'=>$bekletme_suresi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 0, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_etiket' => __FUNCTION__,
'rapor_yazisi' => $hata_yazisi
);
}
if(isset($_SESSION['yasak_suresi'])){
$kalan_sure = $_SESSION['yasak_suresi'] - time();
if($kalan_sure > 0 and ($deneme_sayisi !== $deneme_hakki)){
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_deneme_yasaklandi',array('h'=>$deneme_hakki,'s'=>floor($kalan_sure/60))),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 0, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => 'deneme',
'rapor_yazisi' => $hata_yazisi
);
$this->deneme_bekletiliyor = 1;
}else{
#resetliyoruz.
unset($_SESSION['yasak_suresi']);
$_SESSION['g_deneme_sayisi'] = 0;
}
}
}
#Son işlemler.
$_SESSION['g_s_deneme_zamani'] = time();
if(isset($_SESSION['g_deneme_sayisi'])){
$_SESSION['g_deneme_sayisi'] = $_SESSION['g_deneme_sayisi']+1;
}else{
$_SESSION['g_deneme_sayisi'] = 1;
}
}
}
}
/*
Filtre ve kontrol_et komutları asıl elemanlardır , bu komutlar sayesinde form girdileri_tut
bir süzgeçten geçirilir , bu süzgecin sonrasında raporlara bu durum eklenir. Eğer filtreleme
ve kontrol olumlu ise raporlar 3. statüde olumlu bir şekilde eklenir , aksi halde olumsuz
sonuçlar raporlara işlenir. Ya bismillah!
$parametreler = dizi. #GUMP'a benzetildi.
$veri = get_etiket , post_etiket;
*/
Public Function kontrol_et($p_g=array(),$parametreler=array()){
if(!$this->deneme_bekletiliyor){
#Parçalama işlemi yapıyorum.
foreach($parametreler as $etiket => $islemler){
$this->kontrol_elemani_etiketi = $etiket;
$this->kontrol_elemani_ismi = $islemler[0];
$birinci_kademe = explode('|',$islemler[1]);
foreach($birinci_kademe as $islem){
$parametre = null;
if(strpos($islem,':')){
#Kontrol parametresi varsa.
$ikinci_kademe = explode(':',$islem);
$islem = $ikinci_kademe[0];
$parametre = $ikinci_kademe[1];
}
if(method_exists($this,'kontrol_'.$islem)){
#getiriyoruz.
$kontrol = call_user_func_array(array($this,'kontrol_'.$islem),array($p_g,$etiket,$parametre));
}
}
}
}
}
Protected Function kontrol_sifre($p_g,$etiket,$parametre="sayi_buyukharf_kucukharf_uzunluksarti"){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket])) {
return;
}
$regex = "/^";
$parametreler = explode('_',$parametre);
foreach($parametreler as $parametre){
Switch($parametre){
case 'buyukharf':
$regex .= "(?=.*[A-Z])";
break;
case 'kucukharf':
$regex .= "(?=.*[a-z])";
break;
case 'sayi':
$regex .= "(?=.*\d)";
break;
case 'ozelkarakter':
$regex .= "(?=.*[@#\-_$%^&+=§!\?])";
break;
case 'uzunluksarti':
$regex .= "(?=.*[A-Z])[0-9A-Za-z@#\-_$%^&+=§!\?]{6,12}";
break;
}
}
$regex .="$/";
if(!preg_match($regex,$p_g[$etiket])){
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kabuledilemez',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
/*
Aşağıdaki regex kullanılacak;
^ # start of line
(?=(?:.*[A-Z]){2,}) # 2 upper case letters
(?=(?:.*[a-z]){2,}) # 2 lower case letters
(?=( ?:.*\d){2,}) # 2 digits
(?=(?:.*[!@#$%^&*()\-_=+{};:,<.>]){2,}) # 2 special characters
(.{8,}) # length 8 or more
$ # EOL
*/
}
Protected Function kontrol_isim($p_g,$etiket,$parametre=null){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket])) {
return;
}
$regex = "/^([a-zÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖßÙÚÛÜ***221;àáâãäåçèéêëìíîïñ***240;òóôõöùúûü***253;ÿ '-])+$/i";
if (!preg_match($regex, $p_g[$etiket]) !== false) {
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kabuledilemez',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
}
Protected Function kontrol_ipadresi($p_g,$etiket,$parametre=null){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket])) {
return;
}
if (!filter_var($p_g[$etiket], FILTER_VALIDATE_IP)) {
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kabuledilemez',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
}
Protected Function kontrol_dogruyanlis($p_g,$etiket,$parametre=null){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket]) && $p_g[$etiket] !== 0) {
return;
}
if (in_array($p_g[$etiket], self::$dogru_yanlis_dizisi, true )) {
return;
}
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kabuledilemez',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
Protected Function kontrol_sayi($p_g,$etiket,$parametre=null){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket])) {
return;
}
if (!filter_var($p_g[$etiket], FILTER_VALIDATE_INT)) {
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kabuledilemez',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
}
Protected Function kontrol_url($p_g,$etiket,$parametre=null){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket])) {
return;
}
if (!filter_var($p_g[$etiket], FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_PATH_REQUIRED)) {
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kabuledilemez',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
}
Protected Function kontrol_email($p_g,$etiket,$parametre=null){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket])) {
return;
}
if (!filter_var($p_g[$etiket], FILTER_VALIDATE_EMAIL)) {
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kabuledilemez',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
}
Protected Function kontrol_telefonnumarasi($p_g,$etiket,$parametre = null){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket])) {
return;
}
$regex = '/^(\d[\s-]?)?[\(\[\s-]{0,2}?\d{3}[\)\]\s-]{0,2}?\d{3}[\s-]?\d{4}$/i';
if (!preg_match($regex, $p_g[$etiket])) {
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kabuledilemez',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
}
Protected Function kontrol_kullanicietiket($p_g,$etiket,$parametre = null){
Global $site_dili;
if (!isset($p_g[$etiket]) || empty($p_g[$etiket])) {
return;
}
if(!preg_match('/^[A-Za-z][A-Za-z0-9_-]{5,14}$/',$p_g[$etiket])){
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_kullanicietiket',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
}
Protected Function kontrol_gerekli($p_g,$etiket,$parametre = null){
Global $site_dili;
/* Değerlerin 0 olması , 0.0 ,ve false olması mümkün. */
if (isset($p_g[$etiket]) && ($p_g[$etiket] === false || $p_g[$etiket] === 0 || $p_g[$etiket] === 0.0 || $p_g[$etiket] === '0' || !empty($p_g[$etiket]))) {
return true;
}
$hata_yazisi = $site_dili->hazirla($site_dili->getir('f_v_gerekli',array('i'=>$this->kontrol_elemani_ismi)),'ilkibuyuk');
$this->raporlar[] = array(
'rapor_durumu' => 1, #0 kritik , 1 kontrol. 2. filtre 3.olumlu
'rapor_fonsiyon' => __FUNCTION__,
'rapor_etiket' => $etiket,
'rapor_yazisi' => $hata_yazisi
);
}
/*
Rapor komutları , fonksiyonların içinde oluşan kontrol sonuçlarının , hataların ve olumlu sonuçlarının
rapor edildiği bir fonksiyondur. rapor_et komutu ile işlem sonucu rapor edilir rapor komutu ile ise işlemlerin
sonuçları alınır. Bu sonuca göre işlem yapılır veyahut yapılmaz.
*/
}
/* Kullanımı.
$site_formlari = new form_verileri_sinifi();
$site_formlari->form_baslat(array('deneme_kontrolu'=>true));
$site_formlari->deneme_kontrolu(array('get','user_email'));
$array = array(
'user_email'=>array('Email','gerekli|email'),
'user_name'=>array('Ad','gerekli|kullanicietiket|maksimum_uzunluk:20|minimum_uzunluk:5'),
'user_password'=>array('Şifre','gerekli|sifre:sayi_buyukharf_kucukharf_ozelkarakter_uzunluksarti'),
'user_phone'=>array('telefon numarası','gerekli|telefonnumarasi'),
'user_url'=>array('website adresi','gerekli|url'),
'user_okul'=>array('okul_id','gerekli|sayi'),
'user_var'=>array('varmı','gerekli|sayi|dogruyanlis')
);
$site_formlari->kontrol_et($_GET,$array);
var_dump($site_formlari->raporlar);
*/
?>