【问题标题】:Custom function with MySQLi extension issue具有 MySQLi 扩展问题的自定义函数
【发布时间】:2014-07-21 00:26:31
【问题描述】:

我真的不知道下面写的查询应该有什么问题

$username是表单通过POST方式传递,$mysqli为连接变量,代码:

$mysqli = new mysqli("127.0.0.1", "root", "", "securelogin");

function usernameCheck($username, $mysqli) {
        $query = "SELECT username FROM user WHERE username = '$username'";
        $stmt = $mysqli->prepare($query)
        $stmt->execute();
        $stmt->store_result();
        if($stmt > 1) {
            $stmt->close();
            return FALSE;
        }
}

此函数检查用户名是否已存在于数据库中

~~~~

我已经用下面的代码解决了这个函数

function usernameCheck($username, $mysqli) {
    $query = "SELECT `username` FROM `user` WHERE `username` = '$username'";
    $result = $mysqli->query($query);
    if($result->num_rows != 0) {
        return FALSE;
    }
}

但是,正如您所说,SQL 注入易受攻击。我只是不明白如何将其编码为不可注射

【问题讨论】:

  • 把$mysqli放在函数里面,关键字global.global $mysqli;
  • 有什么问题?问题从哪一行开始?回显代码的每一行,看看问题出在哪里。

标签: php function mysqli


【解决方案1】:

您的查询容易受到 sql 注入的影响。请正确使用prepare语句。

$query = 'select username from user where username = ?';
$stmt = $mysqli->prepare($query);
$stmt->bind_param('s', $username);
$stmt->execute() or die('error: ' . $mysqli->error);
$stmt->bind_result($username);
return $stmt->fetch();

【讨论】:

    【解决方案2】:

    使用 mysqli 准备好的语句。

     function usernameCheck($username, $mysqli) {
    
         $query = "select username from user where username =?";
         $stmt = $mysqli->prepare($query);
         $stmt->bind_param('s', $username);
         $stmt->execute() or die('error: ' . $mysqli->error);
         $stmt->store_result();
         $num_of_rows = $stmt->num_rows;  
         $stmt->bind_result($username);
         $stmt->fetch();
    
         if ($num_of_rows == 0) {
            return false;
         }
       return true;
    }
    

    【讨论】:

    • 感谢您的解决方案! :) 但是 $stmt 总是给我 public 'num_rows => null'
    • 这就是我的成绩。 function usernameCheck($username, $mysqli) { $query = 'SELECT username FROM user WHERE username = "$username"'; if ($stmt = $mysqli->prepare($query)) { $stmt->bind_param('s', $username); if ($stmt->execute()) { $stmt->bind_result($id); $stmt->store_result(); $stmt->fetch(); if($stmt->num_rows > 0) { return FALSE; } return FALSE; } return FALSE; } return FALSE; } 功能很好。但它给出了一个错误 -> 变量数与准备好的语句中的参数数不匹配。我认为查询很糟糕,但我没有发现任何问题!
    • @bubalowski。您有 if 条件,如果存在匹配的行,则返回 false。如果只有一行,您将返回 true。检查你想要它喜欢还是正好相反..
    • 感谢编辑!现在它给出了零错误,但似乎您的更新版本没有检查数据库中是否已经存在用户名。我测试了几次,但只是通过了任何输入的用户名。顺便说一句,我正在使用以下代码检查函数:usernameCheck($username, $mysqli) === FALSE 这是“正确”的方式吗?
    • 是的,就是这样。请在返回真假条件时检查逻辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    相关资源
    最近更新 更多