Bir ya-email-ya da-adı-can-hareket-gibi-kullanıcı giriş sistemi sunarken önlemek için herhangi bir güvenlik sorunları var mı?

2 Cevap php

Ben giriş için e-posta kullanan biri için bir "kullanıcı adı / parola" sisteminden taşıma sürecinde yaşıyorum. Ben giriş için e-posta veya kullanıcı adı ya da izin ile herhangi korkunç sorun olduğunu sanmıyorum, ve ben de bunu yaparken biraz saygın dikkate siteleri gördüğümü hatırlıyorum, ama ben olabilir herhangi bir büyük güvenlik açıkları haberdar olmak istiyorum tanıtan.

Daha spesifik olarak, burada ilgili fonksiyon (işlev query_row sql parameterizes) 'dir.

function authenticate($p_user, $p_pass) {
    $user        = (string)$p_user;
    $pass        = (string)$p_pass;
    $returnValue = false;

    if ($user != '' && $pass != '') {
        // Allow login via username or email.
        $sql = "SELECT account_id, account_identity, uname, player_id 
                FROM accounts 
                JOIN account_players ON account_id=_account_id 
                JOIN players ON player_id = _player_id 
                WHERE lower(account_identity) = lower(:login) 
                      OR lower(uname) = lower(:login) 
                      AND phash = crypt(:pass, phash)";
        $returnValue = query_row($sql, array(':login'=>$user, ':pass'=>$pass));

    }
    return $returnValue;
}

Özellikle, ben oturum açma işlemi için kendi e-posta kullanmaya olmayacak kullanıcılar için zarif geriye dönük uyumluluğu sağlamak için WHERE lower(account_identity) = lower(:login) OR lower(uname) = lower(:login) ...etc bölümü ekledik. O OR olsa, güvenli olduğundan tam olarak emin değilim. Ben yukarıda php kod güvenliğini sıkın gereken bazı yolları var mı?

2 Cevap

Well, after formatting your query, it become clear to me that your OR is unsafe.
Make it

WHERE (lower(account_identity) = lower(:login) OR lower(uname) = lower(:login)) 
      AND phash = crypt(:pass, phash)";

Parantezler VEYA fıkra unutmayın.

Eh, ben de e-posta / username çiftleri yaparken herhangi bir sakınca görmüyorum. Günün sonunda, giriş olarak e-posta kullanarak sadece farklı bir kullanıcı adı, hiçbir şey daha az bir şey olması gibi. Sadece bir ekran adı sağlamak için kullanıcılara sor, onlar o ile giriş eğer onların e-posta göstermek istemiyorum.

Kodunuz için olduğu gibi, gerçekten (query_row function yaptığı sürece sizin için) bir mysql_real_escape_string veya $user SQL enjeksiyonu önlemek için benzer yapmalıdır. Bu karma olmak için gidiyor hiçbir enjeksiyon, orada mümkün olsa da $pass kaçabilir.

Bildiğim kadarıyla OR deyimi herhangi bir zarar teşkil etmez.