Php Giriş Sayı (Kullanıcılar giriş yapamıyorum ve kullanıcıların kendi hesaplarına erişmek için başkalarının şifreleri kullanabilirsiniz)

3 Cevap php

Tamam işte benim konudur, bazı kullanıcıların hesaplarına giriş yapamıyorum. Onlar düzgün şifre ve kullanıcı adı girin ama sadece çalışmak için görünmüyor.

ve ikincisi kullanıcıların bir kaç kendi şifresi değil özgün hesabın parolası ile istedikleri hesabınıza oturum açabilirsiniz fark ettim.

MYSQL ve PHP5 kullanarak.

/*Login script*/

if (isset($_POST['Submit'])) {

	$loginUserName = ($_POST['loginUserName']);
	$loginUserName = stripslashes($loginUserName);
	$loginUserName = strip_tags($loginUserName);
	$loginPassWord = ($_POST['loginPassWord']);
	$loginPassWord = stripslashes($loginPassWord);
	$loginPassWord = strip_tags($loginPassWord);
	$loginPassWord = md5($loginPassWord);

	$loginSubmitQuery = "SELECT username,password FROM users WHERE username = '". mysql_real_escape_string($loginUserName ."' and password = '". mysql_real_escape_string($loginPassWord) ."'"; 
	$loginResultQuery = mysql_query($loginSubmitQuery) or die ("Could not find loginUserName and/or loginPassWord");
	$loginResultQuery2 = mysql_fetch_array($loginResultQuery);

     if ($loginResultQuery2) {
		$sql = "SELECT * FROM users WHERE username='".$loginUserName."'";   
		$result = mysql_query($sql)or die('_'.mysql_error());
		while ($row = mysql_fetch_assoc($result)) {
		    $_SESSION['player']['id'] 				= $row['id'];
		    $_SESSION['player']['username'] 		= $row['username'];
		    $_SESSION['player']['gamestatus'] 		= $row['gamestatus'];
			$_SESSION['player']['healthpoints'] 	= $row['healthpoints'];
			$_SESSION['player']['maxhealthpoints'] 	= $row['maxhealthpoints'];
			$_SESSION['player']['manapoints'] 		= $row['manapoints'];
			$_SESSION['player']['maxmanapoints']	= $row['maxmanapoints'];
			$_SESSION['player']['level'] 			= $row['characterlevel'];
			$_SESSION['player']['strength'] 		= $row['strength'];
			$_SESSION['player']['defence'] 			= $row['defence'];
			$_SESSION['player']['monsterid'] 		= $row['monsterid'];
			$_SESSION['player']['decivers']			= $row['decivers'];
			$_SESSION['player']['experience'] 		= $row['experience'];
			$_SESSION['player']['nextlevel'] 		= $row['nextlevel'];
			$_SESSION['player']['inbattle'] 		= $row['inbattle'];
			$_SESSION['player']['monsterlevel']		= $row['monsterlevel'];
			$_SESSION['player']['monsterid']		= $row['monsterid'];

		}

		echo '<div id="loginaccess"><a href="home.php">[Success Click Here to Login]</a></div>';

	} else {

		echo '<div id="loginaccess">Invalid username or password.</div>';

	}
}
				?>
			<form id="login" action="" method="POST">
					<div id="uname" class="formfloat"><p><label for="loginUserName">Username:</label>
					<input type="text" id="loginUserName" name="loginUserName" value="" class="formfield" tabindex="1" size="15" maxlength="20" /></div></p>
					<div id="pword" class="formfloat"><p><label for="loginPassWord">Password: </label>
					<input type="password" id="loginPassWord" name="loginPassWord" value="" class="formfield" tabindex="2" size="15" maxlength="20" /></div></p>
					<div class="formbreak"></div><br />
					<input id="loginsubmit" type="submit" value="Login" name="Submit" tabindex="3" >
			</form>
			</div>
		</div>
		<div id="sidebarRight"><!-- sidebarRight div start -->
		</div>

3 Cevap

SQL sorgu şifreyi doğrulanırken yaparken bir madde eksik görünüyor. (Eğer herhangi bir şey için karşılaştırarak değil çünkü) verilen kullanıcı adı veritabanında varsa WHERE username = '$loginUserName' AND '$loginPassWord' true değerlendirecek ve değeri $loginPassWord true değerlendirir.

Ayrıca, mysql_real_escape_string , in order to prevent SQL Injection krizi gibi bir şey kullanarak, bir veritabanı sorgu kullanmadan önce kullanıcıdan almak girdi kaçan edilmelidir.

Bir araya koyarak, ben gibi bir şey ile sorgu yerine koyuyordu:

$loginSubmitQuery = "SELECT username, password
  FROM users
  WHERE username = '" . mysql_real_escape_string($loginUserName) . "'
    AND password = '" . mysql_real_escape_string($loginPassWord) . "'";

It's also worth noting that you shouldn't store your users' passwords (plaintext) in the database.
It's extremely insecure and exposes your user in bad ways.

Kodlama Korku makalesinden alıntı You're Probably Storing Passwords Incorrectly:

Users collect usernames and passwords like they do Pokemon. It's a sorry state of affairs, but for better or worse, that's the way it is. We, as software developers, are trusted with storing all these usernames and passwords in some sort of database. The minute we store a user's password, we've taken on the responsibility of securing their password, too. Let's say a hacker somehow obtains a list of all our usernames and passwords. Either it was an inside job by someone who had access to the database, or the database was accidentally exposed to the public web. Doesn't matter how. It just happened.

(...)

You might think it's relatively unimportant if someone's forum password is exposed as plain text. After all, what's an attacker going to do with crappy forum credentials? Post angry messages on the user's behalf? But most users tend to re-use the same passwords, probably because they can't remember the two dozen unique usernames and passwords they're forced to have. So if you obtain their forum password, it's likely you also have the password to something a lot more dangerous: their online banking and PayPal.

Bu iki makale konunun biraz kapak ve ben bunu bir okuma almak öneririz.

Never store passwords in a database!

Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes

Kimlik doğrulama ile ilgili tavsiye iyi bir derleme de bu StackOverflow soru kontrol edebilirsiniz:

The Definitive Guide To Website Authentication (beta)


Edit in response to OP's comment:

Evet, ben aptal değilim ve sadece yazdıktan sonra gördüm ama açıklama hala geçerlidir.

You're using MD5 hashes but if you look at the linked articles you will see that MD5 alone is not enough and one can easily pick "most" of your passwords back if they have your database.
For a quick test, just throw an MD5 hash into google and you will see that unless your password is really wicked, you will get it back.

Daha iyi bir yaklaşım için her şifre için md5hash ve tuz gerekir, ama ben burada daha iyi anlatmaya çalışırken daha bağlantılı makale Enough With The Rainbow Tables: What You Need To Know About Secure Password Schemes okumanızı işaret ediyorum.

Bu doğru yapmak için basit, kolay bir yol var. :)

Ben kendi sözleriyle açıklamaya çalıştı ben yanlış yapardı eminim! :)

Şunu mu demek istediniz:

SELECT username,password FROM users WHERE username = '$loginUserName' and password = '$loginPassWord'

Yerine:

SELECT username,password FROM users WHERE username = '$loginUserName' and '$loginPassWord'