Güvenlik bir PHP webcoder yazma?

2 Cevap php

Ben ilk kez PHP bir web hizmeti yazıyorum ve bazı güvenlik sorunları içine koştu.

1) I am planning to hash passwords using md5() before I write them to the database (or to authenticate the user) but I realize that to do that, I would have to transmit the password in plaintext to the server and hash it there.
Because of this I thought of md5()ing it with javascript client side and then rehashing on the server but then if javascript is disabled, then the user can't login, right?

2) Ben eylem salt okunur olduğunda, kullanmak gerektiğini şey GET duydum ama veritabanı değiştirir, POST kullanmalısınız. GET gibi, değil sadece adres çubuğuna gibi şeffaf göndermek değil mi?

2 Cevap

Genellikle kendi karma katman uygulamak için tavsiye edilmez. Ben sadece öğrenme amaçları için gerçekten küçük bir siteyi yapıyoruz md5 iyi olacak eminim, ama daha büyük bir site için önemli bilgiler saklıyorsanız sen gibi, bir kütüphane kullanmanız gerekir PHPass:

Bu PHPass kod parçacığı için Jacco için teşekkür ederiz:

require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hashed stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

Kendiniz yapıyor ısrar ederse, gereken şifreleri tuz. Bkz http://phpsec.org/articles/2005/password-hashing.html.

define('SALT_LENGTH', 9);

function generateHash($plainText, $salt = null)
{
    if ($salt === null)
    {
        $salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    }

    return $salt . sha1($salt . $plainText);
}

GET ve POST arasındaki farkın nedeni, tarayıcılar istekleri yorumlamak yoludur. Yukarıda belirtildiği gibi, web tarayıcılarının POST istekleri yürütmek olmaz. Ancak http://example.com/deleteuser.php?userid=25 kötü bir spam silmek için sitenizde bir sayfaya gittiğini düşünün. Sonra tarayıcınızı kapatın. Eğer firefox geri gelmek dahaki sefere o sayfayı yeniden açar ve ne yazık ki sadece kayıtlı kullanıcıyı sildim!

POST vs GET başka nedeni cross-site request forgeries karşı kısmi önlenmesidir. Eğer bir GET isteği kullanıcıyı dışarı açmış bir sayfa olsaydı, birisi <img src="http://example.com/logout.php" /> gibi bir yorum ya da forum sonrası içine bir resim etiketi embed olabilir ve tarayıcı çıkış işlemi yürütmek zorunda olacaktır. Yani o sayfayı inceledi herhangi bir kullanıcı onlar bir yönetici olsa bile, dışarı günlüğe olacaktır.

Edit: bir kenara, muhtemelen kırık olmuştur sha-256 veya Bcrypt yerine md5, kullanmalısınız (?).

1) ben) veritabanına yazma önce () MD5 kullanarak şifreleri hash (veya kullanıcının kimliğini doğrulamak için planlıyorum ama ben bunu fark, ben sunucuya düz metin parola iletmek ve orada karma olurdu .

Bu nedenle ben, tamam) javascript istemci tarafında ile ing ve sonra sunucu üzerinde rehashing ama javascript devre dışı ise o zaman, o zaman kullanıcı giriş yapamıyorum (md5 düşündüm?

Şifreleri karma noktası veritabanı maruz sonuçlarını azaltmaktır. Onlara istemci tarafında hash, sadece istemci farklı bir dize için göndermek zorunda olduğu bir dize değiştirin. Bu anlamsız.

2) Ben eylem salt okunur olduğunda, kullanmak gerektiğini şey GET duydum ama veritabanı değiştirir, POST kullanmalısınız. GET gibi, değil sadece adres çubuğuna gibi şeffaf göndermek değil mi?

(Arama motoru Dizinleyicilere dahil) Botlar POST isteklerini yapmaz. Tarayıcılar genellikle POST verileri resubmitting hakkında kullanıcıları uyarır.

POST kullanarak ve doğru şeyler için GET güvenlik meselesi değildir.