lostyazilim

preg_match Hakkında

10 Mesajlar 1.873 Okunma
lstbozum
wmaraci reklam

Yusufcoruh Yusufcoruh WM Aracı Kullanıcı
  • Üyelik 30.08.2016
  • Yaş/Cinsiyet 48 / E
  • Meslek Muhasebe
  • Konum İstanbul Anadolu
  • Ad Soyad Y** C**
  • Mesajlar 136
  • Beğeniler 17 / 16
  • Ticaret 0, (%0)
Merhaba ;
Tipik kullanıcı kayıt formumda Kulanıcı adı Kullanıcı Soyadı alanlarım var ve Türkçe karakterler dahil a-z ye tüm alfabeye izin vermek adına yine bu forumda bulduğum bu kodu kullanıyorum

$var = @$_POST['ad'];
if (!preg_match('/^[a-zA-Z0-9 ÇŞĞÜÖİçşğüöı]+$/', $var)){
echo "Uyarı";
} else {
echo "uygun karakter" ;
}

gayetde güzel çalışıyor sorum şöyle SQL inj , xss , vb...gibi bir sürü güvenlik adına
tüm kullanıcıdan gelenleri
trim , strip_tags . addslashes , htmlspecialchars gibi fonksişyonlardan geçirerek veritabanınıza kaydedin deniliyor preg_match dan sonra tüm bu zımbırtılara gerek varmı _? sonucta


a-zA-Z0-9 ÇŞĞÜÖİçşğüöı bu karakterlerle eşleşmiyor ise zaten geçişe izin vermiyor tekrar neden trimden yada tek tek hepsinden gecireyimki ?
 

 

wmaraci
reklam

Burak611 Burak611 WM Aracı Kullanıcı
  • Üyelik 28.05.2018
  • Yaş/Cinsiyet 33 / E
  • Meslek Çalışmıyor
  • Konum İstanbul Avrupa
  • Ad Soyad B** Y**
  • Mesajlar 119
  • Beğeniler 41 / 42
  • Ticaret 0, (%0)
preg_match sadece eşleşme yapar.

mesela trim boşluk siler. eğer sen bu düzenlemeyi yapmayı kabul etmeyip direk kullanıcıdan düzenlemesini istersen preg_match 'ı kullanabilirsin fakat sana önerim girilen kelimeyi uygun hale getirip database'ye yollamak. kullanıcı boşluk girdiyse ondan bunu kendisinin silmesini bekleme. kendin uygun hale getir. böylesi daha kullanışlı ve ergonomik olur. çoğu kullanıcı tırnak, boşluk falan silmeyle uğraşmaz. hazır gelen veriyi kaçırırsın.
Yusufcoruh

kişi bu mesajı beğendi.

Yusufcoruh Yusufcoruh WM Aracı Kullanıcı
  • Üyelik 30.08.2016
  • Yaş/Cinsiyet 48 / E
  • Meslek Muhasebe
  • Konum İstanbul Anadolu
  • Ad Soyad Y** C**
  • Mesajlar 136
  • Beğeniler 17 / 16
  • Ticaret 0, (%0)
Öncelikle yanıt için teşekkür ederim . Şu şekilde sorayım ; amacım seninde önerdiğin gibi girilen kelimeyi uygun hale getirip database'ye yollamak . ve bu önerini yapabilmek için soruyorum.
sadece eşleşme yaptığını söylediğin preg_matc ifadesi ile a-zA-Z0-9 ÇŞĞÜÖİçşğüöı bu kısımda belirtilen harf ve rakamlar ile eşlemiyor ise yani kullanıcı adında (") çift tırnak yada (') tek tırnak gibi karkaterler kullanmışsa yada bir boşluk bırakılmış ise if koşulu ile sayfada hata almasını sağlıyorum ve devam etmesini engelliyerek durduruyorum durum bu iken Kullanıcı belirtilen karakterleri giremediği halde illegal karakter denetimi gerçekleştirmek örneğin addslashes() kullanmak gerekirmi veya boşluk silmek için trim gereklimi ? zaten boşluk karakteri varsa izin verilmiyor tekrar trime yada diğer fonksiyonlardan geçirmelimiyim ?
 

 

Burak611 Burak611 WM Aracı Kullanıcı
  • Üyelik 28.05.2018
  • Yaş/Cinsiyet 33 / E
  • Meslek Çalışmıyor
  • Konum İstanbul Avrupa
  • Ad Soyad B** Y**
  • Mesajlar 119
  • Beğeniler 41 / 42
  • Ticaret 0, (%0)
Kullanıcı belirtilen karakterleri giremediği halde illegal karakter denetimi gerçekleştirmek örneğin addslashes() kullanmak gerekirmi?

Kullanmanda hiçbir sakınca yok, ben hiç preg_match falan kullanmamayı tercih ederim. Kullanıcı uygun karakter girse de girmese de karakter denetimi yapılmalı. aşağıdaki seçeneklerden 2.sini tercih ediyorum. daha az kod daha az karmaşa.

1. Secenek

$var = @$_POST['ad'];
if (!preg_match('/^[a-zA-Z0-9 ÇŞĞÜÖİçşğüöı]+$/', $var)){
echo "Uyarı";
//// karakter düzenlemesi yap databaseye yolla
} else {
//// karakter düzenlemesi yapmadan databaseye yolla
}


2. Secenek:

hiç preg_match kullanmadan karakter düzenlemesi(boşluk silme, tırnak önü "\" , html tag silme) yapıp yolllamak.
Yusufcoruh

kişi bu mesajı beğendi.

wmaraci
wmaraci

Yusufcoruh Yusufcoruh WM Aracı Kullanıcı
  • Üyelik 30.08.2016
  • Yaş/Cinsiyet 48 / E
  • Meslek Muhasebe
  • Konum İstanbul Anadolu
  • Ad Soyad Y** C**
  • Mesajlar 136
  • Beğeniler 17 / 16
  • Ticaret 0, (%0)
cok teşekkur ederim burak kolay gelsin
 

 

mehmet01 mehmet01 WM Aracı Kullanıcı
  • Üyelik 12.03.2013
  • Yaş/Cinsiyet 32 / E
  • Meslek ...
  • Konum Adana
  • Ad Soyad M** Ç**
  • Mesajlar 665
  • Beğeniler 329 / 328
  • Ticaret 1, (%100)
Verdiğiniz kodda boşluğa izin vermişsiniz. Kullanıcı kelimenin başında veya sonunda boşluk bırakabilir. Bu da gereksiz olur. Bu baştaki ve sondski boşluğu silmek için trim eklemeniz iyi olur. Ama boşluğu da engellerim derseniz trime gerek yok tabi. İkincisi de, eğer ki kodunuz tırnak gibi karakterlerin geçmesine izin vermiyorsa addslash gerekli olmaz. Ama herkes her ihtimale karşı koyuyor yine. Sistemi ne karar yorar bilmiyorum ama pek de yormaz gibi...
Yusufcoruh

kişi bu mesajı beğendi.

Yusufcoruh Yusufcoruh WM Aracı Kullanıcı
  • Üyelik 30.08.2016
  • Yaş/Cinsiyet 48 / E
  • Meslek Muhasebe
  • Konum İstanbul Anadolu
  • Ad Soyad Y** C**
  • Mesajlar 136
  • Beğeniler 17 / 16
  • Ticaret 0, (%0)
Teşekkürler mehmet . aslında o kod sadece kullanıcı adı için değilde daha bir genel durum için yazılımış bi kod. Yukardaki örnek kodu "Firma adı " adında bir input için kullanıyorum ve içeriği örnek olarak şöyle değerler içerebiliyor Taze&doğal Ürünler Tic. Ltd. Şti. . Bu yüzden aralarda boşluğa hatta ve hatta kodda yok ama (.) ve (&) karakterlerine izin vermem gerekiyor .
aslında Konu benim açımdan yeterince açıklayıcı ama okuyacak diğer arkadaşlara bir fikir vermesi açısından biraz detay vermek gerekirse

https://www.btkakademi.gov.tr/ adresinde ücretsiz sunulan isterseniz edevlet şifreniz ilede girebilidiğiniz portalda gerçekten gereğinden fazla detaylı bir anlatıma sahip hoş bir Php kursu var bu dersin 40.Örnek uygulamalar kısmında hoca şunu yapıyor ,

function filtrele($deger) {
$trimle = trim($deger);
$strip =strip_tags($trimle);
$addslash = addslashes($strip);
$htmls =htmlspecialchars($addslash, ENT_QUOTES,'UTF-8');
$sonuc = $htmls;
return $sonuc;

}


Not (Videolu anlatımda $addslash = addslashes($strip); kısmı yok ben ekledim )

ve bu filtrele fonksiyonunuda posttan gelen değerlerde
$gelenkullaniciad= filtrele($_POST['kullaniciad'])
şeklinde kullanıyor. Bu kadar detaya gerek varmı yokmu kararını verecek php bilgim yok ancak adamıın kodu ile kendi sade preg_match ile kontrol sağladığım kodu karşılaştırdığımda benimki biraz öğrenci menüsü gibi kaldı tüm bu konuyu o yüzden açtım..
İKİNCİ olarak
Sıkı araştırmacıyımdır bu yüzden yabancı kaynaklar nasıl yapıyor diye biraz detaya indiğimde
Yabancı kaynaklar , özellikle form değerlerini kontrol etme söz konusu olduğunda trim, strip tags , addslashes ve htmlspecialchars gibi fonksiyonlar yerine kitaba (https://www.php.net/)daha çok bağlılar ve özellikle formdaki bir input söz konusu ise
https://www.php.net/manual/en/ref.filter.php ve
https://www.php.net/manual/tr/filter.filters.php bu iki linkde bulunanları uyguluyolar.

Şimdi yazacağım tespitten emin değilim yanlış olabilir ancak yukardaki adı geçen 4 fonksiyon gibi bir kaç fonksiyon daha varki bir makale gibi bir paragraf gibi birşey söz konusu ise daha çok ara-bul-düzelt tarzı işlerde kullanıyorlar .

ek olarak eyer eski örnekleri inceliyor iseniz genelde preg_match ifadesini daha çok email kontrolu için kullanmışlar bunun yerine son bir kaç yıllık yeni örneklerde yukardaki adreste bulunan sanitize mail ve validate mail filtreleri olmazsa olmazları



Dip not : Tüm araştırmalaımda google yada youtube olsun mutalaka arama filtresine zaman sınırlamasını koyar son bir yıla ait sonuçları incelerim ..
 

 

bytokca bytokca WM Aracı Kimlik Onayı
  • Üyelik 29.11.2012
  • Yaş/Cinsiyet 39 / E
  • Meslek Yazılım
  • Konum Konya
  • Ad Soyad H** T**
  • Mesajlar 48
  • Beğeniler 1 / 26
  • Ticaret 1, (%100)
@Yusufcoruh clean fonksiyonunu kullanmanı tavsiye ederim.



function clean($data) {
$data = str_replace(array('&','<','>'), array('&','<','>'), $data);
$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
$data = preg_replace('#]*+>#i', '', $data);
do {
$old_data = $data;
$data = preg_replace('#]*+>#i', '', $data);
}
while ($old_data !== $data);
return $data;
}




$Name = clean($_POST["name"]);

echo $Name;
Yusufcoruh

kişi bu mesajı beğendi.

Yusufcoruh Yusufcoruh WM Aracı Kullanıcı
  • Üyelik 30.08.2016
  • Yaş/Cinsiyet 48 / E
  • Meslek Muhasebe
  • Konum İstanbul Anadolu
  • Ad Soyad Y** C**
  • Mesajlar 136
  • Beğeniler 17 / 16
  • Ticaret 0, (%0)
Çok Teşekkür ederim benim için iler seviye bir fonksiyon bu konuda kayıtlı olmasıda iyi oldu tekrar teşekkürler
 

 

mehmet01 mehmet01 WM Aracı Kullanıcı
  • Üyelik 12.03.2013
  • Yaş/Cinsiyet 32 / E
  • Meslek ...
  • Konum Adana
  • Ad Soyad M** Ç**
  • Mesajlar 665
  • Beğeniler 329 / 328
  • Ticaret 1, (%100)
Siz mantığı anlamışsınız o yeter. Gerisi ufak tefek deneyimlere kalmış. Yaptığınız kodlarda kendinizi hacker yerine koyun ve kodlarınızı o şekilde test edin. Yaptığınız kodlara tek tırnak, çift tırnak, başka karakterler koyarak çıktı almaya çalışın. Zamanla püf noktaları daha iyi anlayacaksınızdır. Şuan size söyleyeceğim tek püf nokta veritabanına veri kaydederken tırnak eklenmesine izin verecekseniz muhakkak addslashes kullanın. Basit hack olaylarında tırnakları kullanarak içeri sızmaya çalışırlar.
Yusufcoruh

kişi bu mesajı beğendi.

wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al