【问题标题】:Redirect users to a view page based on form inputs and mySQL lookup根据表单输入和 mySQL 查找将用户重定向到视图页面
【发布时间】:2018-03-12 17:54:44
【问题描述】:

我正在尝试将用户重定向到查看页面(管理员或成员),具体取决于密码是否在数据库中匹配。这与我想要的完全相反,我没有看到错误。空白表单提交或不正确的用户名/密码将它们发送到管理页面,同时正确的输入将它们发送给成员。为什么这会倒退?

public function loginFunc()
    {
        $username = (string)$this->input->post('username');
        $password = (string)$this->input->post('password');

        if((strlen($username)<1)||(strlen($password)<1)){
            $blank = 1; 
        }

        $actualPass = (string)$this->db->query("SELECT password FROM usersas6 WHERE username = '$username' "); 



        if($actualPass == $password){
            header("Location: /CodeIgniter-3.1.7/index.php/admin");
        }else{
            header("Location: /CodeIgniter-3.1.7/index.php/members");
        }

    }

【问题讨论】:

  • 永远不要存储纯文本密码!请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用的 PHP 版本低于 5.5,您可以使用 password_hash() compatibility pack在散列之前不需要escape passwords 或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。
  • 根据您在此处发布的代码,除非$password 为空白且$actualPass 为空白,否则您不应看到该行为。当你回显这些变量时,你会得到什么?
  • 这可能是一个愚蠢的问题,但我将如何回显控制文件中的变量?我通常这样做的方式我什么也没看到
  • 你会使用echo,然后你可能需要exit。注释掉任何重定向。
  • 我也收到一个错误,无法将其转换为字符串 $actualPass = (string)$this->db->query("SELECT password FROM usersas6 WHERE username = '$username'" );

标签: php mysql codeigniter


【解决方案1】:

查询方法从数据库返回一个结果对象(就像大多数库一样)。在 CodeIgniter (CI) 中,没有直接的单个字段到文本的方法(当然,您可以编写一个),但是获取第一行字符串的最简单方法是从数组中获取第一行和字段:

public function loginFunc()
{
    $username = (string)$this->input->post('username');
    $password = (string)$this->input->post('password');

    $blank = (strlen(trim($username))<1)||(strlen(trim($password))<1);

    // Get the database result object
    // USE ESCAPE SYNTAX TO PREVENT SQL INJECTION ATTACK!
    $actualPassRes = $this->db->query(
        "SELECT password FROM usersas6 WHERE username = '?' ",
        [$username]
    );

    $actualPass = null;

    // If database return at lease 1 result, get the
    // password column of the first row.
    if($actualPassRes->num_rows() > 0) {
        // Get the password field from the first row
        $actualPass = (string) $actualPassRes->first_row()->password;
    }

    // Compare with strict type comparison (===) to be sure
    if( !$blank && $actualPass !== null && $actualPass === $password ) {
        header("Location: /CodeIgniter-3.1.7/index.php/admin");
    }else{
        header("Location: /CodeIgniter-3.1.7/index.php/members");
    }

}

您检查的方式是匹配布尔转换值(数据库结果对象产生“true”,非空、非零字符串返回“true”)。空字符串(无输入)与没有来自数据库的结果可能该对象也产生了错误值。

注意:正如@jay-blanchard 指出的那样,在生产系统中,您应该对密码进行哈希处理,然后比较存储的哈希值和用户输入的哈希值,而不是存储它们作为很容易被窃取的纯文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多