2014-01-23 348 views
0

道歉我知道这将是一个很简单的答案,但寻找答案我认为它让我感到困惑的不仅仅是问这个问题,因为有太多这样的问题,令人困惑或者有时候相互矛盾的答案。PHP/MySQLi /登录脚本

我的登录脚本正在连接到数据库,提交$ POST usr/pass得到正确的响应。

我现在需要使用这些结果来验证用户。所以..以前我会用mysql_num_rows来计算数据库响应,如果是1则认证。但是我很欣赏mysql_num_rows被贬损,我发现另一篇文章说这也是一种现在做事情的弱方法,应该避免。

那我该用什么呢?

<form id='login' action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method='post' accept-charset='UTF-8'> 
     <fieldset > 
     <legend>Login</legend> 
     <input type='hidden' name='submitted' id='submitted' value='1'/> 

     <label for='username' >UserName*:</label> 
     <input type='text' name='username' id='username' value="" maxlength="50" /> 

     <BR /> 

     <label for='password' >Password*:</label> 
     <input type='password' name='password' id='password' value="" maxlength="50" /> 
     <BR /> 
     <input type='submit' name='Submit' value='Submit' /> 

     </fieldset> 
</form> 

<?php 

if(isset($_POST['submitted'])) 
{ 
    $postname = $_POST['username']; 
    $postpass = $_POST['password']; 
    $postpassMD5 = md5 ($postpass); 

    $query = $dbcnx->query("SELECT uid, username, password, ulevel FROM members WHERE  username = '$postname' AND password = '$postpassMD5' "); 
    $result = $query->fetch_object(); 

    $dbcnx->close(); 

} 
?> 
+0

哦,即时通讯也知道,MD5是弱,将改变这一点。 – ablueman

+0

@aneesh http://security.stackexchange.com/questions/19906/is-md5-considered-insecure –

+0

嗨使用mysql真正的转义字符串来执行查询之前检查用户的用户名和密码。 –

回答

2

尝试计算你的结果数组。

if(count($result) > 0) 
{ 
    // your code 
} 
+0

这看起来不错,会测试..... – ablueman

+0

这工程,如果你添加美元$结果 – ablueman

+0

对不起typo haha​​h – KBeckers

2

你也可以做到这一点从MySQL注射保护:

$username = stripslashes($username); 
$password = stripslashes($password); 
$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 

还要检查

$count = mysql_num_rows($result); 
if($count==1) 
    { 
     session_start(); 
     session_register('user_id'); 
     header("location:user_page.php"); // put your mugallym page name here 
    } 
+1

mysql_real_escape_string已被弃用,并且OP已经标记了mysqli,所以我建议你改为'$ username = $ mysqli-> real_escape_string($ username);'[reference](http://us2.php.net/mysqli_real_escape_string) –

+0

那些扩展名已弃用,并会很快删除。而不是使用准备好的语句,** PDO **或** mysqli **。还可以使用** PHP过滤器清理**来代替旧的,不健康的扩展,如@candle状态。 – datelligence

+0

谢谢我欣赏的答案,但如前所述,现在大部分已折旧。不过谢谢。 – ablueman