2013-02-28 31 views
0

所以,这是我的代码:这个粗糙的PHP验证方法有什么问题?

$login_user_name = $_POST['login-user-name']; 
//salt is declared earlier 
$login_user_pword = super_encrypt($_POST['login-user-pword'], $login_salt);  

$login_veri_query = mysql_query("SELECT * FROM zebra_users WHERE username='".$login_user_name."'"); 

$login_veri_numrows = mysql_num_rows($login_veri_query); 

if ($login_veri_numrows != 0) { 
    while ($value = mysql_fetch_array($login_veri_query)) { 
     if ($value['password'] == $login_user_pword) { 
      $login_error .= '<p class="success">Logged in Successfully!</p><br/>'; 
      $main_error .= '<p class="success">Logged in Successfully!</p><br/>'; 
      $login_good = true; 
      $login_error .= '<script type="text/javascript"> <!-- window.location = "main.php" //--> </script>'; 
     } else { 
      $login_error .= '<p class="warning">Incorrect password, try again.</p><br>'; 
     } 
    } 
} 
} 

,如果有与“PWORD”用户'和密码的用户名的用户,并且这些凭据被输入到表格中,“验证”方法会声称密码不正确。

这里有什么问题?

而且,我知道这是不是一个真正的好登录的风格,但我用这个作为一个占位符,直到我使用cookies,这我不

+1

简化并隔离问题...不要发布您的代码文件。 – jeremy 2013-02-28 03:20:06

+2

'super_encrypt'?真?就像我们其他人一样使用SHA-1和AES。 – Patashu 2013-02-28 03:20:35

+3

mysql_ *函数已被弃用且存在安全风险。替换为PDO(http://php.net/PDO) – Cfreak 2013-02-28 03:20:36

回答

1

,首先它是容易受到SQL注射,因为你不逃避用户名。

其次,你应该发送散列密码到数据库,它应该返回任何用户的用户名和密码哈希匹配。这样,只要输入错误的密码,别人就无法强制数据库发送密码哈希。

第三,如果没有行从数据库中返回会发生什么?失败密码的操作应该与失败用户名的操作相同。

第四你应该一直在使用===比较密码(尽管你不应该使用这种方法)。您不希望空的密码匹配FALSE或类似的东西。另外它只是节省资源。