Bu kodu php ne kadar tehlikeli? Bu konuda ne yapılabilir?
$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";
Olası Sorunlar:
SQL Bildirimi sorunlu olabilir. Bu sql enjeksiyon için kendinizi açık bırakmak için kötü bir uygulamadır.
SQL Injection is bad. Güven bana.
Bir HTML sayfasında $ kullanıcıyı görüntülemek istiyorsanız, o zaman gibi komutları yazarak düzenini "hack" insanlar için yeteneği dahil etmek istemeyebilirsiniz
<H1>HI MOM</H1>
ya da bir demet javascript.
Ayrıca, düz metin şifrenizi saklamak asla (iyi yakalamak cagcowboy!). İnsanların uygulanmasını (veya hack) veritabanı çok fazla güç verir. Birinin şifreyi bilmek İHTİYACINIZ asla.
Bu gibi taktikleri deneyin:
// mostly pulled from http://snippets.dzone.com/posts/show/2738
function MakeSafe($unsafestring)
{
$unsafestring= htmlentities($unsafestring, ENT_QUOTES);
if (get_magic_quotes_gpc())
{
$unsafestring= stripslashes($unsafestring);
}
$unsafestring= mysql_real_escape_string(trim($unsafestring));
$unsafestring= strip_tags($unsafestring);
$unsafestring= str_replace("\r\n", "", $unsafestring);
return $unsafestring;
}
// Call a function to make sure the variables you are
// pulling in are not able to inject sql into your
// sql statement causing massive doom and destruction.
$name = MakeSafe( $_POST["user"] );
$pwd = MakeSafe( $_POST["pwd"] );
// As suggested by cagcowboy:
// You should NEVER store passwords decrypted.
// Ever.
// sha1 creates a hash of your password
// pack helps to shrink your hash
// base64_encode turns it into base64
$pwd = base64_encode(pack("H*",sha1($pwd)))
Tek bir isim için 0';drop table users;--
göndermek için olsaydı
Komut olmanın sona ereceğini
select name, pwd form users where name='0';
drop table users; --'and pwd = '[VALUE OF PWD]'
Bu bir yorumdur beri bu yüzden ilk önce kullanıcıların masa öldürmek sonra, veri almak ve geri kalanı ile bir şey yapacağını.
Sql geçtiğinde php bazı mysql komutları birden sorguları yapacak, bunu önlemek için en iyi yoldur parametrized sorgularını.
Ben bütün DB erişim için PDO kullanmak ve bunu tavsiye ederim. Kafamın üst kapalı herhangi bir bağlantıları yok ama ben Google tepesinde kullanılan öğreticiler hatırlıyorum.
Bu sadece SQL enjeksiyon eğilimli, aynı zamanda bir enjeksiyon bile uygun değildir durumlarda başarısız olur:
Örneğin kullanıcı adı "Guillaume François Antoine, Marquis de L'Hospital" istiyor. Adı bir alıntı içerir ve bunu kaçan olmadığından kullanıcı sistemi kırmak istemedim rağmen, sorgu başarısız olur!
Kullanmak PDO veya bu şekilde bunu ya:
$query = sprintf(
"SELECT 1 FROM users WHERE name = '%s' AND password = '%s'",
mysql_real_escape_string($_POST['name']),
mysql_real_escape_string(md5($_POST['password']))
);
Very very dangerous. A good idea for passwords is to convert the password into a MD5 hash and store that as the user's 'password'.
1) protects the users from having their passwords stolen
2) if a user writes a malicious string they could wipe out your entry/table/database
Ayrıca emin sadece A-Za-z0-9 kullanır ve belki bir kaç aksanlı karakterler (özel karakterler * 'nin, <' s> 'ın özellikle yapmak adına bazı temel maç regex ifadesini yapmalıyım .)
Kullanıcı verileri bir SQL sorgusu involed olduğunda, daima mysql_real_escape_string
a> ile veri sanatize.
Ayrıca, sadece şifre tuzlu bir karma yerine parola kendisini saklamak gerekir. Siz oluşturmak ve rastgele bir tuz değere sahip bir tuzlu karma denetlemek için aşağıdaki işlevi kullanabilirsiniz:
function saltedHash($data, $hash=null)
{
if (is_null($hash)) {
$salt = substr(md5(uniqid(rand())), 0, 8);
} else {
$salt = substr($hash, 0, 8);
}
$h = $salt.md5($salt.$data);
if (!is_null($hash)) {
return $h === $hash;
}
return $h;
}
Hep birlikte:
$query = 'SELECT pwd FROM users WHERE name = "'.mysql_real_escape_string($_POST['user']).'"';
$res = mysql_query($query);
if (mysql_num_rows($res)) {
$row = mysql_fetch_assoc($res);
if (saltedHash($_POST["pwd"], $row['pwd'])) {
// authentic
} else {
// incorrect password
}
} else {
// incorrect username
}