[英]Checking user by his password. PHP MySQL
我試圖編寫一個簡單的注冊和登錄代碼,但是登錄文件出現問題。
login.php-
<?php
session_start();
include"header.php";
include"config.php";
connect();
if(isset($_POST['login'])){
if(isset($_SESSION['uid'])){
echo"you are already logged in";
}else{
$username = protect($_POST['username']);
$password = protect($_POST['password']);
$login_check = mysql_query("SELECT `id` FROM `users` WHERE `username` = '$username' AND `password` = '".md5($password)."' ") or die (mysql_error());
echo $login_check;
if(mysql_num_rows($login_check) == 0){
echo"invalid login password";
}else{
$get_id = mysql_fetch_assoc($login_check);
$_SESSION['uid']=$get_id['id'];
header("Location: main.php");
}
}
}else{
echo"u need to log in";
}
/* */
include"footer.php";
?>
當我嘗試此代碼時,沒有錯誤,但是我總是得到:“無效的登錄密碼”。 如果我嘗試僅通過用戶名從users
選擇id
,它就可以正常工作,並將我帶到main.php。
這是我的Config.php和表格。
config.php-
<?php
function connect(){
mysql_connect("localhost","root","");
mysql_select_db("game2");
}
function protect($string){
return mysql_real_escape_string(strip_tags(addslashes($string)));
}
?>
來自header.php的表格:
<form action="login.php" method="POST">
Username:<input type="text" name="username"/><br />
Password:<input type="password" name="password"/><br />
<input type="submit" name="login" value="login"/>
</form>
更新:所以我按照Marc B的答案,我認為register.php文件肯定有問題。 首先,我注意到無論將什么內容寫到密碼輸入中,表中每個ID的哈希值都是相同的。 所以我什至切斷了protect()和md5部分,我看到無論我寫為什么密碼,表中的密碼都會出現空白。 用戶名和電子郵件進入表就可以了。 register.php-
<?php
session_start();
include"header.php";
?>
<?php
include("config.php");
connect();
?>
Rejestracja:
<br />
<?php
if (isset($_POST['register'])){
$username = protect($_POST['username']);
$password = protect($_POST['password']);
$email = protect($_POST['email']);
if($username=="" || $password="" || $email == ""){
echo"Wypelnij wszystkie pola";
}elseif(strlen($username) > 20){
echo"Nazwa musi miec max 20 znaków !";
}elseif(strlen($email) > 50){
echo"Email musi miec max 50 znakow!";
}else{
$register1 = mysql_query("SELECT `id` FROM `users` WHERE `username`='$username'") or die(mysql_error());
$register2 = mysql_query("SELECT `id` FROM `users` WHERE `email`='$email'") or die(mysql_error());
if(mysql_num_rows($register1) > 0){
echo"Jest juz taki uzytkownik!";
}elseif (mysql_num_rows($register2) > 0){
echo"email jest juz zajety";
}else{
$insertstats = mysql_query("INSERT INTO `stats` (`gold`,`attack`,`defense`,`food`) VALUES (100,5,5,100)") or die(mysql_error()) ;
$insertunits = mysql_query("INSERT INTO `units` (`worker`,`farmer`,`warrior`,`defender`) VALUES (5,5,5,10)") or die(mysql_error()) ;
$insertweapons = mysql_query("INSERT INTO `weapons` (`sword`,`shield`) VALUES (5,5)") or die(mysql_error()) ;
$insertusers = mysql_query("INSERT INTO `users` (`username`,`password`,`email`) VALUES ('$username','".md5($password)."','$email')") or die(mysql_error()) ;
echo"Zarejestrowales sie";
}
}
}
?>
<br />
<form action="register.php" method="POST">
Nazwa uzytkownika:<input type="text" name="username"/><br />
Haslo:<input type="password" name="password"/><br />
E-mail:<input type="text" name="email"/><br />
<input type="submit" name="register" value="Register" /><br />
</form>
<?php
include"footer.php";
?>
好的,我發現了自己的錯誤... if($ username ==“” || $ password =“” || $ email ==“”)太傻了。 感謝您提供有關改進代碼的所有建議。 麻煩您了
您沒有正確比較密碼。 您正在使用sql進行轉義, 然后執行md5哈希,這意味着添加到密碼中的所有轉義都將成為哈希的一部分。
例如
$foo = 'password with " quote';
$hashed_foo = md5($foo); // e938052104fd22cbdf0c822065557f09
$escaped_foo = addslashes($foo);
$hashed_escaped_foo = md5($foo); // b144a3e7ad3ea3fd4ae6ade0aa49a9b9
請注意兩個哈希如何變化。 如果您手動md5輸入了原始密碼,那么您將永遠無法獲得匹配,因為轉義是在對原始字符串進行散列之前對其進行了更改,這意味着散列將始終與原始未轉義的字符串不同。 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.