• 29-10-2020, 22:56:33
    #1
    merhaba arkadaşlar güncel güvenli post etme yöntemi nedir ?.
    pdo kullanıyorum ama hangi yöntemin daha güvenli lduğunu bilgim yok.


    her iki yöntemde güvenli yöntem nelerdir
    $_POST , $_GET yöntemleri ,
    Veri Listeleme gibi.


    eklemede bunu kullanıyrum,


    $odeme_ali = $db->prepare("INSERT INTO veri SET
      veri1=?,
      veri2=?");
    
    $odeme_ali->execute(array(
      $barkod_no,
      $odeme_tutari
    ));
  • 29-10-2020, 23:04:53
    #2
    Ben Post yöntemini tercih ediyorum, en azından gönderdiğin veriyi URL kısmına şiir gibi yazdırmaktan iyidir.
  • 29-10-2020, 23:07:11
    #3
    Kesinlikle $_POST . Verilerin arkada işleniyor. Get yapınca URL kısmında reklam gibi
  • 29-10-2020, 23:38:51
    #4
    @ahmetkucukonder; @nraltas; hocam postu düzenledim yanlış anlattım, en güvenli yöntem demek istedim . her iki yöntemde güvenli olan neler
  • 30-10-2020, 00:16:25
    #5
    Bununla ilgili yabancı forumlarda güzel anlatımlar vardı, kaba bir çeviriyle ekleyeceğim;

    1-GET Değişkenleri URL aracılığıyla işlendiği için sunucu loglarında ve tarayıcı geçmişlerinde kaydedilir, ayrıca URL kısmında yer aldığı için kolaylıkla oynama yapılabilir.
    2-POST ile sunucuya kolaylıkla sahte veri gönderilebilir, bu yüzden "halka açık" olarak tabir ettiğimiz üyeli/üyesiz ana sayfalardaki formlarda recaptcha tarzı doğrulama kullanmak farzdır.
    3-GET ile ilgili en büyük sorun kötü niyetli kullanıcıların rahatlıkla veri göndermesidir, örneğin "example.com/changepassword.php?newpass=hackedu" - Yeterli güvenliğe sahip olmayan sunucuda bir kullanıcı bu URL'ye girdiğinde şifresi "hackedu"" olacaktır ve kötü niyetli kişi hesabına erişim sağlayacaktır. Bu değişken yolunu bulmanın en kolay yolu da kötü niyetli kişinin "Şifremi Değiştir" sayfasına girip şifresini değiştirmesi olacaktır, gerisini tarayıcının URL kısmından takip edecektir.
    4-GET görünür okunur dedik ama POST görünmez okunmaz diyemeyiz, POST verileri de üçüncü şahıslar tarafından izlenebilir bu yüzden HTTPS protokolü mutlaka kullanılmalıdır.
    5-Webcrawlerar GET değişkenleri için yüksek risk oluşturmaz fakat Web Accelerator'lar sitenizdeki her yere tıklayarak terör estirirler, eğer bir dosyayı silmek için kullanılan GET değişkenine tıklarlarsa size veri kaybettirirler (Kasıtlı değildir). 2005 yılında insanlar sitelerindeki dosyaların silinmesinden şikayetçiydi, bu olayda Google'ın Web Accelerator Botu Yakalandı ve suçlu bulundu.
    6-GET değişkenleri için doğrudan güvenlik doğrulaması yapamazsınız, ancak POST formunu sunucuya postlamadan önce reCaptcha gibi yazılımlarla güvence altına alabilirsiniz. Bu sayede Confused Depucy ataklarından bir nebze de olsa kurtulursunuz.
    7-Kullanıcı, sayfada GET verisi gönderilirken sayfayı sürekli yenileyebilir ancak POST değişkeni post edilirken sayfa yenilendiğinde tarayıcı js alert uyarı verecektir.

    SS SORU
    S-HTTPS Protokolü kullanıyorum, POST verilerim güvende peki GET verilerim? Sonuçta onlar URL kısmında görünüyor.
    C-GET/POST verisi gönderilirken arada varsayılan olarak 2 şahıs vardır, birincisi son kullanıcı ikincisi ise sunucudur, verilerin 3. şahıs kişiler tarafından görüntülenmemesi için HTTPS protokolü ile şifrelenme yapılır, bu şifreleme URL kısmında görünmez fakat sunucu ile client arasındaki iletişimde kendisini gösterir, protokolün asıl amacı da budur yani GET ve POST değişkenlerinde protokolden bir kayıp olmaz. Ancak GET verisi içeren bağlantı kullanıcının tarayıcısındaki "Geçmiş" sekmesinde görünüyor olacaktır.

    Sonuç;
    İkisinin kullanım alanları değişkenlik gösteriyor, yeri gelir GET kullanırsınız yeri gelir POST kullanırsınız fakat buradan çıkartmanız gereken şey güvenlik gerektiren işlemlerde POST yöntemini kullanmanızdır. Şimdi bu yazılardan sonra GET'e veya POST'a düşman olmayalım, iksinin de işimizi kolaylaştırdığı ve/veya işlem güvenliğini arttırdığı yönleri var.
  • 30-10-2020, 01:20:07
    #6
    @ahmetkucukonder; yazınızı dikkatlice okudum script yazarken bunları göz önüne alacağım.

    veri ekleme ve listeleme kodları için örnek gösterebilir misiniz?
  • 30-10-2020, 01:40:48
    #7
    ahmetkucukonder adlı üyeden alıntı: mesajı görüntüle
    Bununla ilgili yabancı forumlarda güzel anlatımlar vardı, kaba bir çeviriyle ekleyeceğim;

    1-GET Değişkenleri URL aracılığıyla işlendiği için sunucu loglarında ve tarayıcı geçmişlerinde kaydedilir, ayrıca URL kısmında yer aldığı için kolaylıkla oynama yapılabilir.
    2-POST ile sunucuya kolaylıkla sahte veri gönderilebilir, bu yüzden "halka açık" olarak tabir ettiğimiz üyeli/üyesiz ana sayfalardaki formlarda recaptcha tarzı doğrulama kullanmak farzdır.
    3-GET ile ilgili en büyük sorun kötü niyetli kullanıcıların rahatlıkla veri göndermesidir, örneğin "example.com/changepassword.php?newpass=hackedu" - Yeterli güvenliğe sahip olmayan sunucuda bir kullanıcı bu URL'ye girdiğinde şifresi "hackedu"" olacaktır ve kötü niyetli kişi hesabına erişim sağlayacaktır. Bu değişken yolunu bulmanın en kolay yolu da kötü niyetli kişinin "Şifremi Değiştir" sayfasına girip şifresini değiştirmesi olacaktır, gerisini tarayıcının URL kısmından takip edecektir.
    4-GET görünür okunur dedik ama POST görünmez okunmaz diyemeyiz, POST verileri de üçüncü şahıslar tarafından izlenebilir bu yüzden HTTPS protokolü mutlaka kullanılmalıdır.
    5-Webcrawlerar GET değişkenleri için yüksek risk oluşturmaz fakat Web Accelerator'lar sitenizdeki her yere tıklayarak terör estirirler, eğer bir dosyayı silmek için kullanılan GET değişkenine tıklarlarsa size veri kaybettirirler (Kasıtlı değildir). 2005 yılında insanlar sitelerindeki dosyaların silinmesinden şikayetçiydi, bu olayda Google'ın Web Accelerator Botu Yakalandı ve suçlu bulundu.
    6-GET değişkenleri için doğrudan güvenlik doğrulaması yapamazsınız, ancak POST formunu sunucuya postlamadan önce reCaptcha gibi yazılımlarla güvence altına alabilirsiniz. Bu sayede Confused Depucy ataklarından bir nebze de olsa kurtulursunuz.
    7-Kullanıcı, sayfada GET verisi gönderilirken sayfayı sürekli yenileyebilir ancak POST değişkeni post edilirken sayfa yenilendiğinde tarayıcı js alert uyarı verecektir.

    SS SORU
    S-HTTPS Protokolü kullanıyorum, POST verilerim güvende peki GET verilerim? Sonuçta onlar URL kısmında görünüyor.
    C-GET/POST verisi gönderilirken arada varsayılan olarak 2 şahıs vardır, birincisi son kullanıcı ikincisi ise sunucudur, verilerin 3. şahıs kişiler tarafından görüntülenmemesi için HTTPS protokolü ile şifrelenme yapılır, bu şifreleme URL kısmında görünmez fakat sunucu ile client arasındaki iletişimde kendisini gösterir, protokolün asıl amacı da budur yani GET ve POST değişkenlerinde protokolden bir kayıp olmaz. Ancak GET verisi içeren bağlantı kullanıcının tarayıcısındaki "Geçmiş" sekmesinde görünüyor olacaktır.

    Sonuç;
    İkisinin kullanım alanları değişkenlik gösteriyor, yeri gelir GET kullanırsınız yeri gelir POST kullanırsınız fakat buradan çıkartmanız gereken şey güvenlik gerektiren işlemlerde POST yöntemini kullanmanızdır. Şimdi bu yazılardan sonra GET'e veya POST'a düşman olmayalım, iksinin de işimizi kolaylaştırdığı ve/veya işlem güvenliğini arttırdığı yönleri var.
    Arkadaş gayet güzel açıklamış ek olarak bunlara dikkat edilerek oluşturulmuş REST modeli var. Özetle

    POST: Bir şey oluşturuyorsan
    GET: Bir şeyi okuyorsan
    PUT: Bir şeyi güncelliyorsan
    DELETE: bir şeyi siliyorsan

    tüm crud (create, read, update, delete) uygulamalarda bu mantığı kullanarak iş yapmak sizin için büyük kolaylık sağlayacaktır.
    Örnek verelim;

    GET /news : haberleri getirir
    POST /news: haber oluşturur
    GET /news/1: 1 idli haberi getirir
    PUT /news/1: 1 idli haberi günceller
    DELETE /news/1: 1idli haberi siler.


    Edit: tekrar okuyunca farkettim merkeze koyduğun şey güvenlikmiş. Bunun öyle sabit bir cevabı yok öncelikle bunu kabul etmek lazım. Verdiğim REST modelini kullanmak bir çok şeyde yararlı olacaktır ancak CSRF, XSS, Template Injection vs. gibi bir takım web güvenliği alanındaki konuları bilmezseniz her seferinde ciddi risklerle karışalacaksınız. Bunları bildiğiniz zaman ise çoğunlukla otomatik olarak requestin nasıl olması gerektiğini inputların nasıl filitrelenmesi gerektiğini doğru anlayacaksınız. Başlangıç için OWASP Top 10 güvenlik açığına bakarak çok temel ve büyük bir adım atmış olursunuz.
  • 30-10-2020, 01:56:44
    #8
    Mesela giriş veya kayıt formu hazırlıyorsunuz, bu durumda mutlaka POST tipinde değişken kullanmanız gerekecek. Ardından bu veriyi süzgeçten geçirmeniz lazım, bir rivayete göre POST değişkeninden çektiği verileri filtrelemeden veritabanına gönderen yazılımcılar toprağa gömülüp taşlanırmış.

    Şimdi ilgili POST değişkeninin içeriğini temizlemek için standart haline gelmiş filtreleme fonksiyonu oluşturalım, bu fonksiyon PHP'nin hazırladığı fonksiyonları kullanarak gönderdiğimiz değişkeni temizleyip bize geri verecek.
    <?php
    function Temizle($veri) {
    return trim(htmlspecialchars($veri)); //Değişken içerisindeki HTML karakterlerini ayıkladık bu sayede ilgili post değişkeni kullanılarak sayfaya JS exploit atılması mümkün olmayacak.
    }
    
    $isim = Temizle($_POST['isim']);
    if (!preg_match('/^[a-zA-Z0-9\s]+$/', $isim)) print 'Lutfen sadece harf girin.'; //Rakamdan sembolden isim olmaz, isim istedik isim gelecek.
    
    $email = Temizle($_POST['email']);
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) print 'Gecersiz mail adresi'; //Biz mail adresi istediysek mail adresi gelmeli, yoksa post most yok.
    
    $sifre= Temizle($_POST['sifre']);
    if (strlen($sifre) < 6)  print 'En az 6 karakterli sifre girin.'; //Evet 123456 şifreleri bu şekilde türedi.
    
    
    //Örneğin GET değişkeni ile id alacaksınız bu durumda sadece 0'dan büyük sayı yazılmışsa işleme alın.
    //Önce değişkenin isset edilip edilmediğine bakalım, eğer isset edilmişse içeriğini kontrol edelim çünkü bize sadece sayı lazım.
    if(isset($_GET['id']) && preg_match("/^[A-Fa-f0-9]{32}$/", $_GET['id'] ) > 0) {
    $id = $_GET['id']; //Artık kullanabiliriz.
    }
    
    //Sayısal olup olmadığı umurumuzda olmayan bir GET değişkenini çekelim
    if(isset($_GET['bar']) && $_GET['bar'] != '') {
    $foo = $_GET['bar']; //Artık kullanabiliriz.
    }
    ?>
    Yorgun olduğum için hatalı veya eksik kod yazmış olabilirim, amacım filtrelemenin temelini anlatabilmek bunu başardıysam ne mutlu bize
  • 30-10-2020, 02:16:08
    #9
    $sth = $dbh->prepare('SELECT name, colour, calories
        FROM fruit
        WHERE calories < :calories AND colour = :colour');
    $sth->bindParam(':calories', $calories, PDO::PARAM_INT);
    $sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
    $sth->execute();
    Bu şekilde sorguları tipine göre sınırlandırabiliyorsun PDO ile.

    Diğerleri için;
    https://www.php.net/manual/en/pdo.constants.php