Bir veritabanı-düzey MD5 fonksiyonunu bir uygulama düzeyi işlevi daha büyük bir güvenlik riski kullanıyor?

5 Cevap php

Bir kullanıcının kullanıcı adı ve böyle bir şey gider şifreyi doğrular kod yığın var:

$sql = "SELECT * 
FROM user 
WHERE 
    username='{$_POST['username']}' AND 
    password=MD5('{SALT}{$_POST['password']}')";

Bu böyle yapıyor daha bir daha / daha az güvenli mi?

$sql = "SELECT * 
FROM user 
WHERE 
    username='{$_POST['username']}' AND 
    password='".md5(SALT.$_POST['password'])."'";

Ne olursa olsun / kaçan yapılırsa, ilk yöntem sql injection saldırılarına karşı savunmasız nerede mi? Cevap MySQL dışında diğer veritabanı motorları için aynı olur muydu?

5 Cevap

Eğer düzgün değişkenleri kaçış eğer enjeksiyon hakkında konuşan, her iki yönde, güvenli.

Eğer tam sorgu günlüğü kullanırsanız ilk vaka, daha savunmasız olacak ve böylece şifre düz metin olarak görünecektir.

Lütfen sistem komut ve veritabanı arasında proxy olarak çalışır bazı virüs tarafından etkilenmiş yanında eğer, bu şifrenizi yakalamak mümkün olacak.

Sistem belleğinden mantıklı verileri okuyan bir virüs ile verdirdiler zaman (oldukça nadir, aslında) karşılaşabilirsiniz son bir sorundur.

Bu mantıklı umuyoruz.

Yerine and this question bakabilirsiniz hazırlanmış ifadeler kullanmak gerekir.

Tanrım, herhangi bir {[bazı mysql_escape_string veya mysql_real_escape_string türünü veya en az addslashes veya addcslashes yaptığını söyle lütfen (4)]} değişkenler before Bir çiğ MySQL deyimi içine ekleyebilirsiniz?

Bunu yapmak için en güvenli yolu olduğunu düşünüyorum:

a) filter_var kullanın veya preg_replace $ _POST gelen yabancı karakterleri kurtulmak için ['username']

MySQL kullanıcı adı ile b) SELECT satır (ayrıca) sindirilmiş şifreyi kapma

c) değil SQL deyiminde, uygulama kodu) Eğer şifrenizi düz metin bırakmayın varsayarak ($_POST dan alınan satırın buna şifre mesajı sindirilmiş sürümünü karşılaştırmak

Eğer bu şekilde yaparsanız, orada enjeksiyon (username) için sadece 1 mümkün yerdir, ve bir preg_replace( '/\W/', '', $_POST['username'] ) A-Za-z0-9_-(veya değiştirmek bir şey değil kaldırır yapıyoruz olduğunda oldukça imkansız karakter adınızı izin verilenler için).

Eğer kaya gibi sağlam, uygun sanitasyon yapıyoruz eğer karşılaştırma yapmak nerede Ancak, bu gerçekten önemli değil. Teorik olarak, olsa, ben kullanıcı girişi ve ham SQL ifadeleri (yani sadece SELECT username tarafından ing ve DB karşılaştırarak dışında) ile mümkün olan en az etkileşim için izin istiyorum.

MD5 ile başlamak için güvensiz bir algoritma olması önlemek ve parolalar için asla kullanılmamalıdır. Bir staled sha256 kullanmak gerekir ve en veritabanları bu işlev çağrısı yok. Ama veritabanı yaptım bile ben onun kötü bir fikir bence. Etrafında şifre olarak birkaç kopya tutmak için çok kötü bir fikir, ama onun iyi. Genellikle veritabanı tamamen farklı bir makinede olabilir, ve bu makine nerede tehlikeye eğer saldırgan quires bakarak metin şifreler elde edebilir. SQL Injection açısından, güvenlik açısından fark yoktur ve sorgular tarafından bakarsak, SQL enjeksiyonu konusunda daha endişeli olmalıdır.

Ne olursa olsun / kaçan yapılırsa, ilk yöntem sql injection saldırılarına karşı savunmasız nerede mi?

Uygun öncelemeli ve sanitasyon yer alırsa, SQL enjeksiyonu olmayacağına

Cevap MySQL dışında diğer veritabanı motorları için aynı olur muydu?

Ben, üzerinde başka bir eylemi gerçekleştirmek için alınan pahasına daha fazla bakmak gerektiğini düşünüyorum. İlk yöntem, ikinci yöntem, koşullar sabitken daha çalıştırmak için daha az zaman alacaktır.