lostyazilim
tr.link

Php input,get vb. GÜVENLİĞİ! ?

11 Mesajlar 2.079 Okunma
acebozum
tr.link

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)
Merhabalar, hemen konuya geçiş yapmak istiyorum.

Şimdi şöyle bir formdaki inputlara kullanıcının veri girişi yapmasını istiyoruz fakat kullanıcıların arasında internet sektörüne yeni atılıp direkt olarak google amcadan gördükleri h*ck, mysql inj*ct vb. gibi başlıklı videolarda '=' 'or' gibi artık ne çeşitleri varsa, hiç bilimyorum :D mysql'i şapşal edicek girişler yapabiliyorlar ve güvenlik sorunu olan sitelerde haliyle sorun çıkabiliyor.

veya başka bir örnek vericek olursak get ile yolladığım değişken tarayıcı çubuğunda gözüküyor ve sonuna '=' +-'!% gibi karakterler kullanarak basitce mysql'i boşa çıkarabiliyorlar.

ve daha bilmem kaç tane örnek vardır allah bilir. :)

Arkadaşlar sizden istediğim şu piyasadaki açıkları nasıl kapatabiliriz ve bu açıklar nelerdir, açıkları kapatmanın/korunmanın yollarını yazarsanız, eminim benim gibi bu sorunu veya korkuyu yaşayan bayağı yoğun bir nüfus'un en azından içini rahatlatabiliriz :)

Şimdiden çok teşekkürler. :D
nebisenol

kişi bu mesajı beğendi.

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.
elektronikssl
webimgo

nebisenol nebisenol WM Aracı Kullanıcı
  • Üyelik 15.09.2017
  • Yaş/Cinsiyet 26 / E
  • Meslek Okuyorum.
  • Konum Bursa
  • Ad Soyad N** Ş**
  • Mesajlar 47
  • Beğeniler 8 / 14
  • Ticaret 0, (%0)
Pdo :)
 

 

tugrayaldiz tugrayaldiz tugra.dev Kullanıcı
  • Üyelik 02.07.2014
  • Yaş/Cinsiyet 26 / E
  • Meslek Öğrenci, Web Developer
  • Konum Afyon
  • Ad Soyad T** Y**
  • Mesajlar 481
  • Beğeniler 98 / 140
  • Ticaret 10, (%100)
Sql sorgusu yapacağınız zaman pdo yu kullanın. Form işlemlerinizde get kullanmanızı pek önermiyorum Post kullanın daha güvenli olacaktır.
 

 

hsntngr hsntngr Kontör at Kullanıcı
  • Üyelik 21.09.2016
  • Yaş/Cinsiyet 31 / E
  • Meslek Full Stack Developer
  • Konum İstanbul Avrupa
  • Ad Soyad H** T**
  • Mesajlar 1155
  • Beğeniler 99 / 327
  • Ticaret 3, (%100)
html taglarını, js kodlarını temizlemek için htmlspecialchars metodunu, diğer sql saldırılarından korunmak için ise pdo (prepare - execute) yapısını kullanın hocam.

Edit: Aklıma gelmişken yazayım, csrf açıklarını unutmayalım, her zaman postumuza bir csrf token koyalım :)
 

 

wmaraci
wmaraci

65116 65116 WM Aracı Anonim Üyelik
  • Üyelik 20.06.2016
  • Yaş/Cinsiyet - /
  • Meslek
  • Konum
  • Ad Soyad ** **
  • Mesajlar 632
  • Beğeniler 0 / 196
  • Ticaret 9, (%89)
0ktay öncelikle mysql kütüphanesinden vazgeçmek gereklidir. Basit diye bu sistemi kullanmak basit açıklara yol açar. Bunun yerine mysqli_ ve PDO kütüphane sınıflarını kullanmak ve şekillendirmek daha güvenlidir.

mysqli ve pdo da güvenliği arttırmanın birçok yolu var bunlardan bir kaçı post ve get ile edinilen verileri temizlemek yukardaki arkadaşların verdiği örnekler gibi. bir diğer yol ise kullanıcılar var ise ve sessiona atanmış kullanıcı ise gibi fonksiyonlarla direkleri dikmektir.

Bunun için if, elseif, else - swich case gibi işlemlerle güçlendirilebilir.
Dosya transferi gibi işlemlerde ise yine kullanıcı kontrolü yapılmalı doğru formatta dosya olup olmadığı, dosyanın boyutu vb filtreleme sistemleriyle işlem yapılmalıdır.
bunlar sadece bir kaç örnek.
Mümkün mertebe get ile veri çekme işleminden kaçınmak gereklidir kanımca bunun yerine post ile yapılabilir. javascript- ajax gibi kütüphanelerden yararlanılıp tek bir sayfa içerisinde yenilemeden işlemleri kontrol ve dogru hedefe yönlendirilerek bariz açıklardan kurtulunulabilir. birde alenen açık dosyalar var mesela header.php tek başına anlamsızdır ama include ile bunları indeximize ekleriz direkt bu dosyaya erişim engellemek için " define - defined" sabitlerinden yararlanılıp tek başına görüntülenmesini kısıtlayabiliriz. aynı şekilde veritabanı dosyamız içinde geçerli yapabiliriz. kodlama işi söledikleri gibi gerçekten şiirdir. Kafiyeyi uydurmak bizi keyiflendirir.


Tabi bu yukarda saydıklarım devede kulak ama en çok akılda soru işareti bırakan açıklardır.
 

 

ontedi ontedi www.ontedi.com Kullanıcı
  • Üyelik 03.10.2013
  • Yaş/Cinsiyet 44 / E
  • Meslek Yazılım Uzmanı, Matematikçi
  • Konum Ankara
  • Ad Soyad S** T**
  • Mesajlar 1118
  • Beğeniler 325 / 324
  • Ticaret 2, (%100)
Stored Procedure kullanicaksin o zaman.
 

 

www.ontedi.com
www.cizgi.site

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)


Pdo daha güvenli onda hem fikiriz fakat çoğu php sistemler mysql ile hazırlanmış herkez kalkıpta pdo'ya çeviremezki.

Pdo demek yerine var olan mysql'i güçlendirecek bir sınıf vb. belirtmek daha mantıklı olur. :)

PoseidonTR adlı üyeden alıntı

Sql sorgusu yapacağınız zaman pdo yu kullanın. Form işlemlerinizde get kullanmanızı pek önermiyorum Post kullanın daha güvenli olacaktır.


Pdo ile ilgili görüşümü nebisenol'un alıntısının altında bildirdim :)

Method olarak post kullanıyorum fakat post'uda basit işlemlerle alt edebiliyorlar onun için bir çözüm bulamazmıyız ?

hsntngr adlı üyeden alıntı

html taglarını, js kodlarını temizlemek için htmlspecialchars metodunu, diğer sql saldırılarından korunmak için ise pdo (prepare - execute) yapısını kullanın hocam


Sendende böyle bir cevap beklerdim (YARARLI!) :) teşekkürler. (htmlspecialchars) <-- Mutlaka bilinmesi gereken bir sınıf!

Pdo ile ilgili görüşümü nebisenol'un alıntısının altında bildirdim :)

Güven teşekkürler dostum yararlı.
Birde dosya filtreleme sistemi demişsin örnek verebilirmisin ?

ontedi aslında söylediğin mantıklı bir yol ancak bilmeyen arkadaşlar için baştan bir sistem öğrenmek zor olacaktır. (YARARLI!) Teşekkürler.
 

 

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.

ontedi ontedi www.ontedi.com Kullanıcı
  • Üyelik 03.10.2013
  • Yaş/Cinsiyet 44 / E
  • Meslek Yazılım Uzmanı, Matematikçi
  • Konum Ankara
  • Ad Soyad S** T**
  • Mesajlar 1118
  • Beğeniler 325 / 324
  • Ticaret 2, (%100)
Sp, aslında yazdığın "insert, update, delete, select" sorgularını sql metodolojisi içinde yazmaktan ibaret.
 

 

www.ontedi.com
www.cizgi.site

Decimas Decimas WM Aracı Kullanıcı
  • Üyelik 19.04.2015
  • Yaş/Cinsiyet 26 / E
  • Meslek Developer
  • Konum İstanbul Avrupa
  • Ad Soyad E** E**
  • Mesajlar 820
  • Beğeniler 1 / 302
  • Ticaret 1, (%100)
Bunun için yeteri kadar PHP ve SQL bilgisine sahip olman gerek, sahipsen otomatik olarak beynin boşlukları tamamlıyor ama burada ne kadar yazsak da yüzlerce başlığı bir araya getirmek zor olacak. Kumbaraya birkaç sent benden olsun.

- POST ve GET için sık kullandığım veri getirme yollarım, şöyle bir mantık izlenebilir.


/*--------------------- $_GET & $_POST ----------------- START */

// Secure via $_GET
public function get($parameter){
return !isset($_GET[$parameter]) ? false : strip_tags(trim(addslashes(htmlspecialchars($_GET[$parameter]))));
}

// Secure via $_POST
public function post($parameter){
if (!empty($_POST[$parameter])) {

if (is_array($_POST[$parameter])) {
$request = array();
foreach ($_POST[$parameter] as $param)
$request[] = htmlspecialchars(addslashes(trim($param)));
return $request;
}
return htmlspecialchars(addslashes(trim($_POST[$parameter])));
}
return false;
}

/*--------------------- $_GET & $_POST ----------------- END */


- Ajax kullandığın yerlerde, formlarda amacı dışında kullanımlar olabilir, xss açıklarını araştır. Belki csrf çözüm olabilir ama cloudflare + root erişimin varsa csf firewall önerebilirim. En sağlam şık Session + bu Session verisni formdann iste.

- Mysql'e asla root kullanıcısı ile bağlanma.

- Tarayıcıdan get'le veri almak yerine jquery gibi kütüphanelerden yararlanıp dinamik bir arayüz oluştur. (jquery gibi diyorum çünkü yetersiz ve güvensiz sayılabilir.)

- Sabit bir değer yoksa, yani kullanıcıdan veri isteniyorsa veritabanı işlemlrinde parametre kullan.

- Özel veri tiplerini ayır, kontrol et. Örneğin id bilgisi istediğin bir get parametresini $_GET['parametre'] is_numeric fonksiyonu ile kontrol et ya da (int) diyerek türünü belirt.

- PDO iyi bir çözüm gibi gözükebilir ama 100% koruma sağlamaz, kendine uygun bir kütüphane bulmaya bak, şunu önerebilirim.

vs, vs ,vs.

Security dev bir dünya, içinde kaybolmak mümkün. Basit değil, epey kafa yormak gerekiyor.
AhmetKarabulut 0ktay

kişi bu mesajı beğendi.

no time for caution

0ktay 0ktay strdex Kullanıcı
  • Üyelik 01.02.2018
  • Yaş/Cinsiyet 26 / E
  • Meslek Yazılım öğrencisi
  • Konum Antalya
  • Ad Soyad O** Ş**
  • Mesajlar 603
  • Beğeniler 25 / 155
  • Ticaret 2, (%100)
Decimas çok teşekkürler girişken arkadaşların mutlaka incelemesi gereken bir yorum :)
 

 

Eğitimin pahalı olduğunu düşünüyorsanız, cehaletin bedelini hesaplayın.
wmaraci
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