Php Güvenliği
-
İşin mantıksal kısımlarını kendim koşullarla oluşturdum aklıma geldiği kadarıyla ama bilmiyorum ne kadar doğru yaptım.
Mesela
<?php $pdo = new PDO('sqlite:users.db'); $pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']);şu kodda id yerine "1;DELETE FROM tablo_adı" yazılarak tüm kullanıcılar temizlenebilir demiş adamlar, ve güvenliği sağlamak için
<?php $pdo = new PDO('sqlite:users.db'); $stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id'); $stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // $stmt->execute();kodu yazılmalı demişler. Ben bunun yerine ctype_digit($_GET['id']) yapıp eğer id numara değilse hiç sorgu yaptırmıyorum. PDO yerine mysqli kullanıyorum(pdoya pek bakmadım ama aynı işi yapıyo sanki), sorguları da stored procedure olarak kullanıyorum.
Zaten linklerden gelen idlerin kontrolünü yaptırıyorum eğer farklı bi durum varsa if-else ile hata sayfasına yönlendiriyorum. Kullanıcıdan gelen verileri htmlspecialchars, addslashes gibi fonksiyonlarla düzgünce alıyorum.Yani bu şekilde kullanmak sadece daha kolay(kısa) mı yoksa daha güvenli mi? bu başlık altında az teknik-taktik yapalım
-
o kadar ugrasma pdo kullan, pdo kullanirken php ye diyosunki , al bu sorgu kodu(sql) buda parametre. sikseler o parametreyi kod olarak algilamiyo
ayrica, basitinden bi framework kullansana haci ? butun ameleligi senin yerine o yapsin
codeigniter ile baslayabilirsin mesela
symfony yada zend cok karisik gelir simdi sana
edit: ayrica, aldigin deger eger integer sa (int)$_REQUEST['id'] demen yeterli olacaktir, text olsada onu int e cevirir, 1 olarak algilar.
yolbulucu tarafından 22/Ağu/13 15:06 tarihinde düzenlenmiştir -
arkadaşın dediği gibi pdo da sql parameter olarak gönderdiğinde zaten içini temizliyor.mysqli'de de temizliyor sıkıntı yok yani hocam :D
-
Framework öğren, hazır fonksiyonları kullan daya geç yani? :D
-
wasd bunu yazdı
Framework öğren, hazır fonksiyonları kullan daya geç yani? :D
Hayır hocam zaten pdo ve mysqli senin yapmak istediğin güvenlik temizliğini yapıyor üzerine senib bir şey yapmana gerek yok.Eğer düz mysql_ komutlarını kullansaydın o zaman oturur yazardın bi güvenlik class'ı ama gerek yok yani.
-
get ve post yerinede filter_input kullan. Birde projene uygun şifreleme algoritmasını seç, bcrypt gibi, şimdi herhalde scrypt yolda.
-
sokoban bunu yazdı
Hayır hocam zaten pdo ve mysqli senin yapmak istediğin güvenlik temizliğini yapıyor üzerine senib bir şey yapmana gerek yok.Eğer düz mysql_ komutlarını kullansaydın o zaman oturur yazardın bi güvenlik class'ı ama gerek yok yani.
mysql_ komutlarına sonraki sürümlerde destek vermeyeceğiz uyarısını görünce mysqli_ ye çevirdim. Basit bi dilek-şikayet formu ve admin paneli kodladım sadece, güvenlik classına gerek yok. (zaten oop denen şeyden de eser yok denilebilir mysqli'yi nesne oluşturarak kullandığımı saymazsak) Konuyu açıp sorma sebebim sadece merak, biraz daha detay almak :)
Edit:
VBDream bunu yazdıget ve post yerinede filter_input kullan. Birde projene uygun şifreleme algoritmasını seç, bcrypt gibi, şimdi herhalde scrypt yolda.
Şifreleme algoritması kullanıcı şifresi için mi sadece? yoksa sessionlardaki verileri falan da şifrelemek gerekiyor mu?
Ben şifreyi kaydederken md5(md5("şifre")) şeklinde bişey kullandım ama adamlar password_hash() fonksiyonu geliştirmişler.
wasd tarafından 22/Ağu/13 16:36 tarihinde düzenlenmiştir -
wasd bunu yazdı
Framework öğren, hazır fonksiyonları kullan daya geç yani? :D
soyle bir ornek vereyim, direk su anda calistigim koddan aliyorum, herboku alip array e atiyorum sonra modelimin icinde direk insert ediyorum bu arrayi, sana ne gibi kolayliklar getirecegine sen karar verebilirsin.
bu controller tarafindaki kod
$owner = $this->auth->user()->row()->username; $title = $this->input->post('title'); $content = $this->input->post('content'); $opt1 = $this->input->post('opt1'); $opt2 = $this->input->post('opt2'); $params = array( 'title' => $title, 'content' => $content, 'owner' => $owner, 'option1' => $opt1, 'option2' => $opt2, 'entryId' => $id ); $result = (int)$this->eventModel->insert($params); buda model in icindeki kodum : public function insert(array $params){ $this->db->insert('entries', $params); return $this->db->affected_rows(); }yolbulucu tarafından 22/Ağu/13 16:36 tarihinde düzenlenmiştir -
Eğer prepared statements yerine soylediğin gibi bir yöntem kullanıyorsan sql injection ataklarına açık bırakmış olursun. SQL injection sadece-- delete. ... şeklinde yazmakla olmuyor. Adam oraya binary formatta sql kodunu bir çakar aklın hayalin şaşar. OWASP'ın SQL Injection hakkındaki dökümanlarını okumanı tavsiye ederim.
-
DrKill bunu yazdı
Eğer prepared statements yerine soylediğin gibi bir yöntem kullanıyorsan sql injection ataklarına açık bırakmış olursun. SQL injection sadece-- delete. ... şeklinde yazmakla olmuyor. Adam oraya binary formatta sql kodunu bir çakar aklın hayalin şaşar. OWASP'ın SQL Injection hakkındaki dökümanlarını okumanı tavsiye ederim.
hoca o nasil ya ? varmi bildigin ornek, denemek istiyorum
-
$baglanti->query("call spEkle('".$tarih."','".$ad."','".$soyad."','".$konu."','".$mesaj."','".$uid."','".$ipNo."')")şeklinde kayıt işlemini yaptım.
$tarih = date("d/m/Y H:i:s"); $ad = htmlspecialchars($_POST['ad']); $soyad = htmlspecialchars($_POST['soyad']); $konu = htmlspecialchars($_POST['konu']); $mesaj = htmlspecialchars($_POST['mesaj']); $kod = $_POST['kod']; $uid = substr(md5($ad.$kod.$konu.$soyad), 6, 7); $ipNo = ipAl();değişkenler de bunlar. filter_input direk filtreliyormu bir deniyeyim.(filter_var fonksiyonunu email kontrolü için kullanmıştım koşul kontrolünde işe yarıyodu)
DrKill bunu yazdıEğer prepared statements yerine soylediğin gibi bir yöntem kullanıyorsan sql injection ataklarına açık bırakmış olursun. SQL injection sadece-- delete. ... şeklinde yazmakla olmuyor. Adam oraya binary formatta sql kodunu bir çakar aklın hayalin şaşar. OWASP'ın SQL Injection hakkındaki dökümanlarını okumanı tavsiye ederim.
Sağol bir bakayım. Yanlış hatırlamıyorsam ya php.nette ya da phptherightway.comda görmüştüm dediğin dökümanların önerisini, bakmakta fayda var.
