2011-10-12 47 views
0

出于某种原因,我的支票登录脚本正在让客人。检查登录脚本让客人?

我还没有使网站生活,所以它的一切都很好。

我检查数据库的用户名和密码,用户放在html表单中,但由于某种原因,如果它甚至没有得到结果,它仍然设置用户名为零 如果它得到结果它设置用户名到用户名,但如果它没有得到任何结果,它将用户名设置为空。

我有一个if语句,但仍然设置它。

$myusername = mysql_real_escape_string($_POST['myusername']); 
$mypassword = mysql_real_escape_string($_POST['mypassword']); 


$sql  = "SELECT * FROM users WHERE username='$myusername'"; 
$result  = mysql_query($sql) or die(mysql_error()); 
$battle_get = mysql_fetch_array($result);  

if ($battle_get['password'] == $mypassword) 
{  
    $_SESSION['username'] = $myusername ; // store session data  
    header('Location: http://mydomainname.net/new_rpg/dashboard.php');  
} else { 
    echo "wrong password" ; 
} 
+1

** 1)**你为什么不保存密码的哈希? ** 2。)**然后你将不必逃避密码。 ** 3。)**为什么你不检查MySQL端的密码? ** 4。)**您是否清除了缓存以供测试? – ComFreek

+0

是的ive清除缓存,并在急于和我讨厌md5制作变量md5很难找到。我不介意逃跑。我发现它是使脚本安全的一部分 –

+0

在散列它之后,您不需要再次输入密码。它将是十六进制字符串。此外,还有其他(更安全的)哈希算法可用(见['哈希()'](http://php.net/manual/function.hash.php)) – ComFreek

回答

0

Yur错误:

说我不是用户。

因此$battle_get['password'] = false;

$mypasswordfalse

所以$battle_get['password']等于就可以解决这个$mypassword

双向。

首先,SQL赤密码:

$sql = "SELECT * FROM users WHERE username='$myusername' AND password = '$mypassword'";

if(!$battle_get) { 

echo "wrong password" ; 

} 
+0

** http://php.net/ faq.passwords ** – hakre

2

您不检查用户帐户是否实际存在。您只是盲目地从结果集中获取一行,即使该结果集中有记录也不例外。这意味着$battle_get将是一个空数组(如果查询失败,则为布尔值false)。然后您对提交的密码进行字符串比较。如果该密码也是空的,你做if (empty == empty)和咚......用户在

你应该做的事情是:

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 

$sql = "SELECT ... FROM users WHERE (username = '$username') AND (password = '$password')"; 
$result = mysql_query($sql) or die(mysql_error()); 

if (mysql_num_rows($sql) != 1) { 
    die("Invalid username and/or password"); // don't tell the user which failed. 
} 

检查是如何返回多少行是至关重要的 - 如果没有行被返回,则用户不存在或密码错误。如果返回1行,那么它是有效的登录名。如果返回多于1行,则数据库中有重复的用户名/密码对,需要立即解决。

而刚刚看到你的“md5很难”评论如上:你错了。 MD5非常简单。

当您创建的用户记录,你可以很容易地散列密码:

INSERT INTO users (password) VALUES (MD5('$password')); 

和登录检查:

SELECT ... WHERE (password = MD5('$password')); 

没什么它。

+0

mysql_real_escape_string非常方便,但参数化查询是最佳选择。看看这个帖子http://spotthevuln.com/2011/08/boundaries-sql-injection/另外Sha1是比md5更安全的散列,它的使用非常简单:) sha1($ Password) – CountMurphy

+0

参数化查询是所有这些都适用于他们所在的地方,但他们根本无法正常工作。 –

+0

如何?我从来没有听说过任何问题,我肯定会用它登录页面 – CountMurphy