PHP uygun kimlik doğrulaması ile güvenli giriş

6 Cevap php

Nasıl yazıyorum / PHP güvenli giriş araya? website developer guide Ben kendi rulo gerektiğini söyledi, bu yüzden Google üzerinden mevcut örneklere atıfta işe yaramaz.

Eğer profesyoneller bunu nasıl yapabilirim? Aynı kütüphaneler / teknikleri burada kullanışlı olurdu, sen raylar dünya standartlarında bir uygulama yapıyolar Diyelim?

Teşekkürler

6 Cevap

Raylar, bir genel olarak önceden varolan bir kütüphane kullanımı olacaktır. Doğrulama yanlış yapmak kolaydır, ve sorun tekrar çözmek için çaba nadiren değer olduğunu pek çok kez çözüldü oldu. Eğer kendi uygulama yazmak isteyen varsa, o zaman modern bir kimlik nasıl çalıştığını anlatacağım.

Bir kullanıcı kimlik doğrulama yöntemi, naif bir veritabanındaki parola saklamak ve kullanıcı gönderen parolası ile mukayese etmektir. Bu basit ama inanılmaz güvensiz. Veritabanını okuyabilen herkes kimsenin şifresini görebilirsiniz. Eğer veritabanı erişimi denetimleri koymak bile, (ve kullanıcıların) çevrelerindeki kesmek herkese açıktır.

Uygun formu sonra gönderilen her zaman seçilir ve zaman parolayı işlemek için bir kriptografik hash fonksiyonu kullanmaktır. İyi bir karma işlevi pratikte geri döndürülemez - Eğer bir karma almak ve bir parola haline geri dönemeyiz. Kullanıcı açtığında Yani, sunulan şifre, hash sürer, ve veritabanındaki karma karşılaştırın. Bu şekilde, parola kendisini saklamak asla. Kullanıcı şifresini unutursa olumsuz, bunu sıfırlamak yerine onlara göndermek zorunda.

Hatta bu, ancak, belirli saldırılara karşı savunmasız olduğunu. O sadece sözlükte her kelime alır ve o kelimeyi sağlamalarının, orijinal ile tutmak: Bir saldırganın şifre sağlamalarının ele alır ve parolalarınızı karma nasıl biliyorsa, o zaman bir sözlük saldırısı yapabilir. Bu veri yapısı bir gökkuşağı tablo denir. Sözlük kelimesi sağlamalarının herhangi bir şifre karma neticesinde eğer, saldırgan şifre o şifre sağlamalarının sözlük kelime olduğunu söyleyebiliriz. Kısacası, veritabanı okuyabilirsiniz saldırgan hala zayıf şifreleri ile hesaplarına giriş yapabilirsiniz.

Çözelti, bir şifre karma önce, her bir kullanıcı için benzersiz olan bir tuzu olarak adlandırılan bir değer ile (genellikle birleştirilmiş veya xor'd) bir araya getirilmiş olmasıdır. Bu rastgele oluşturulmuş olabilir, ya da bir hesap oluşturma damgası ya da böyle olabilir. Her şifre aslında biraz farklı karma çünkü Sonra, bir saldırganın bir gökkuşağı tablo kullanamazsınız; o engelleyici hesaplama pahalı olacaktır (pratikte her hesap için) her farklı tuz için ayrı bir gökkuşağı tablo oluşturmak gerekir.

Ben diğer cevap verenlere tavsiye yankı: Bu basit şeyler değil, ve daha önce yapılmış çünkü bunu yapmak gerekmez, ve bunu kendiniz yaparsanız bir hata yapma çok iyi bir şansı ve yanlışlıkla ödün Sisteminizin güvenlik. Sebebi ne olursa olsun, gerçekten, gerçekten bir kendiniz yazmak istiyorsanız, Ama, ben nasıl yapıldığını bir (incomplete!) taslak sağladı umuyoruz.

Zend Framework başlamak için iyi bir yer olurdu bir 'Auth' module hangi vardır. Siteniz bir WordPress veya PHPBB kurulumu sahipliği yapacak veya eğer bir sitenin diğer sayfalarına giriş için bu teknolojileri 'kimlik doğrulama modülleri yararlanarak yolları vardır.

Eğer kimlik doğrulaması için çalışırken bakmak için bir şey gerçek hedefi budur.

Örneğin, SO Ben google giriş kullanmak, ve onlar sadece benim kim olduğumu biliyor gerekir gibi olduğunu, çalışır ve onlar hakkında bir fikri vardır ki güvenebilirsiniz. Bu model sizin için çalışacaktır eğer Yani, o bunun için çeşitli araçlar olduğu gibi, OpenID kullanarak bakmak.

Kendi yapmak gerekir, o zaman olmak istiyorum nasıl paranoyak bağlı olarak, yine, güvenli olduğundan emin olmak için çeşitli testler olacak.

  • Bazı sıkı doğrulama kullandığınız sürece, kullanıcı bir şey asla güvenme.
  • Kullanıcının parolasını korumak için https kullanmak, o kadar onlara borçlu.

Thom fantastik bir yanıtı olduğu gibi ben burada benim yanıt sona erecek.

by Soulmerge:

Ben accepted answer in your other question oldukça iyi devletler düşünüyorum. Bir tuz ile şifreleri karma. Bunun dışında, taşıma katmanı üzerinde bazı güvenlik fikirler vardır:

  • Şifreleri gönderirken https kullanmak. Bu kimsenin (man-in-the-middle attack veya istemci kötü bir proxy kullanır) tel bunları yakalamak yapar
  • Alternatif bir giriş formu gönderildiğinde javascript kullanarak şifreyi karma etmektir. Bu parola düz metin olarak taşınan asla emin olur. Sen sunucusunda bir tuz ile tekrar karma değeri karma olabilir. (md5($_POST['postedPwHash'] . $salt))

(no ssl varsa) biraz istemci-sunucu işlemi güvenli iyi bir yöntemdir sonra sadece sunucuya benzersiz karma göndermek, kimlik benzersiz bir karma oluşturmak için bir kerelik rasgele anahtarı kullanmaktır. Sunucu daha sonra yerine gerçek kimlik bilgileri karşılaştırarak kendi oluşturulan karma bu karma karşılaştırır. Bu man-in-the-middle saldırısı karşı iyi bir savunma sağlayacaktır. olumsuz kullanıcı JS (en azından ben onsuz istemci tarafı verileri şifrelemek için iyi bir yöntem bilmiyorum) etkinleştirilmiş olması gerektiğini bu yapmaktır. Bu açık değil ne zaman yeterli bir son çare ihtiyacınız olacak demektir. Hatta emin onun etkin yapmak JS formu oluşturabilirsiniz.

this library muhtemelen bazı iyileştirmeler ihtiyacı olsa o, ben anlatılan prosedürü yapar zamanlar yazdığım basit bir kütüphanedir.

Bu "tuzlama" yöntemleri ve diğer sunucu tarafı güvenlik önlemleri kullanmanın yanı olduğunu unutmayın. Tüm karma süreci, tanımı gereği, prosedürel öngörülebilir ve (JS her zaman olduğu gibi) kullanıcıya görünür olduğu gibi aynı zamanda sözlük saldırılarına karşı oldukça savunmasızdır.

Benim cevabım "Yapmayın" dir

Bu potansiyel güvenlik yakaladım yıllardan dolu çok karmaşık bir alandır. Eğer bu alanda bir uzman değilseniz, o zaman gerçekten sadece yolda sorun ve problemler için soruyorsunuz.

Ben yapmak için varolan bir çözümü elde bakarak tavsiye ederim. Ne yazık ki ben OpenID dışında, tavsiye mutlu olacağını hiç bilmiyorum. Ben burada olsa bazı iyi öneriler alırsınız eminim ...