Php Güvenliği

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    İş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


    :)
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    yolbulucu
    yolbulucu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 06/Nisan/2007
    Homo

    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

    29.99cm, titanyum kaplamalı, çift damarlı, su ve yağ soğutmalı.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek

    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


    .
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Framework öğren, hazır fonksiyonları kullan daya geç yani? :D


    :)
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    sokoban
    sokoban's avatar
    Kayıt Tarihi: 23/Ocak/2010
    Erkek
    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.


    .
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    kvasir
    kvasir's avatar
    Kayıt Tarihi: 24/Ağustos/2005
    Erkek

    get ve post yerinede filter_input kullan. Birde projene uygun şifreleme algoritmasını seç, bcrypt gibi, şimdi herhalde scrypt yolda.

  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    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

    :)
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    yolbulucu
    yolbulucu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 06/Nisan/2007
    Homo
    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

    29.99cm, titanyum kaplamalı, çift damarlı, su ve yağ soğutmalı.
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    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.


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    yolbulucu
    yolbulucu's avatar
    Banlanmış Üye
    Kayıt Tarihi: 06/Nisan/2007
    Homo
    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


    29.99cm, titanyum kaplamalı, çift damarlı, su ve yağ soğutmalı.
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    $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.


    :)
Toplam Hit: 1805 Toplam Mesaj: 19