2016-11-19 50 views
-2
public function verify_login($email, $password) { 
    $this->Connect(); 

`email`=`$email` AND `password`=`$password` "; 

    $sql = "SELECT email,password FROM `users_details` WHERE 

    `email`='$email' AND `password`='$password' "; 

    if ($this->res=mysqli_query($this->ind_connect, $qry)) { 


     $num_row = mysqli_num_rows($this->res); 

     $row = mysqli_fetch_assoc($this->res); 

     if ($num_row == 1) { 
      echo 'true'; 

      $_SESSION['email'] = $row['email']; 
      $_SESSION['password'] = $row['password']; 
     } 

    } else { 

     echo 'errr'; 
    } 

    $this->Disconnect(); 

} 

你好,我试图做简单的查询和功能“mysqli_query($这个 - > ind_connect,$ QRY)”还给我假所有的时间 1.连接返回“真” 2.我试图将查询更改为最简单的查询,如“SELECT * from users_details and the mysqli_query return to me false again。”mysqli_query返回布尔(假)的所有时间

+0

我不知道从哪里开始。你必须改变你的变量的引号,以便它们可以被解析。单引号不会被php解析。然后,将您的sql保存在'sql'-var中,但是在查询中使用'qry'-var。 –

+0

**警告**:编写您自己的访问控制层并不容易,并且有很多机会使其严重错误。请不要在[Laravel](http://laravel.com/)等任何现代开发框架(http://codegeekz.com/best-php-frameworks-for-developers/)上编写自己的认证系统,内置了强大的[认证系统](https://laravel.com/docs/5.2/authentication)。绝对不要遵循[推荐的安全最佳实践](http://www.phptherightway.com/#security)和**从不将密码存储为纯文本**。 – tadman

+0

**警告**:使用'mysqli'时,您应该使用[参数化查询](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询中。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **绝不**将'$ _POST'或'$ _GET'数据直接放入查询中,如果有人试图利用您的错误,这会非常有害。 – tadman

回答

0

您在此有很多问题,但这里是我会尝试什么:

public function verify_login($email, $password) { 
    $conn = $this->Connect(); //Make sure $this->Connect(); returns the connection. (Where mysqli_connect(host,user,pass,dbname); is called) 
    //Never inject variables into SQL without escaping the information first for SQL security reasons. 
    $email = mysqli_real_escape_string($conn, $email); 
    $password = mysqli_real_escape_string($conn, $password); 

    $query = "`email`='$email' AND `password`='$password';"; 

    $sql = "SELECT `email`, `password` FROM `users_details` WHERE $query"; 
    if ($this->res=mysqli_query($this->ind_connect, $qry)) { 
     $num_row = mysqli_num_rows($this->res); 
     $row = mysqli_fetch_assoc($this->res); 

     if ($num_row == 1) { 
      echo 'true'; 

      $_SESSION['email'] = $row['email']; 
      $_SESSION['password'] = $row['password']; 
     } 

    } else { 

     echo 'errr'; 
    } 

    $this->Disconnect(); 

} 

我没有请在使用电子邮件和密码值检查时,使用``而不是正确的''单引号括起来。该名称应该在``内,并且该值应该始终在''内,除非处理另一种数据类型。

我强烈建议修复安全问题,因为SQL注入是可能的。

我建议你切换到一些更现代和安全的东西,例如PDO用于数据库连接。

+0

尽管您已尝试解决转义问题,但使用带有占位符值的预准备语句而不是手动转义。它的代码更少,并且通过忘记逃脱避免了潜在的漏洞风险。 – tadman

+0

我同意,这也是为什么我建议只使用PDO,因为它提供了一种非常简单的准备报表方式。 –

+1

'mysqli'中的方式更笨重,但并不困难。原理是一样的,只需要调用'bind_param'和'execute'就可以创建关联数组。 – tadman