【问题标题】:Parameterized queries in PHP with MySQL connection使用 MySQL 连接的 PHP 中的参数化查询
【发布时间】:2022-01-25 21:35:42
【问题描述】:

我已经阅读了有关 SQL 注入的信息,因此我在我的网站上进行了尝试,当然它确实有效。我知道解决方案是参数化查询,而且我也知道那里有很多示例,但没有一个提到我们连接到数据库的部分。 所以这是我登录页面的PHP代码的一部分:

$userName = $_POST["username"];
$userPass = $_POST["password"];

$query = "SELECT * FROM users WHERE username = '$userName' AND password = '$userPass'";

$result = mysqli_query($dbc, $query); //$dbc is for MySQL connection: $dbc = @mysqli_connect($dbhost, $dbuser, $dbpass, $db)

$row = mysqli_fetch_array($result);

if(!$row){
    echo "No existing user or wrong password.";
}

我一直在寻找解决方案很长时间,但我无法弄清楚如何以参数化的方式使其工作。您能否帮我完成我的代码以防止 SQL 注入?

【问题讨论】:

标签: php mysql sql-injection login-page


【解决方案1】:

使用:

$userPass = mysqli_real_escape_string($mysqli,$_POST["password"]);

这会阻止 '' 或 '=' 东西 :) 其中 $mysqli 是您的连接字符串 ofc。

【讨论】:

    【解决方案2】:

    给你

    $stmt = mysqli_prepare($dbc, "SELECT * FROM users WHERE username = ? AND password = ?");
    mysqli_stmt_bind_param($stmt, "s", $userName);
    mysqli_stmt_bind_param($stmt, "s", $userPass);
    mysqli_stmt_execute($stmt);
    $row = mysqli_stmt_fetch($stmt);
    

    Documentation

    作为旁注,我建议加密您的密码或更好地使用哈希来确保安全,将密码存储为纯文本是不好的

    【讨论】:

    • 感谢您的回答。我将它复制到我的代码中,现在它正在使用正确的数据,但它仍然接受 '' 或 '=' 的东西:/
    • @MárkVégh,当然它仍然接受它 - 它在输入中。但是,无法执行!这就是准备好的陈述的意义所在。占位符中的数据仅被视为文本。
    • 哦,我明白了,但是我能做些什么来防止这种注入?现在任何人只需在用户名和密码字段中输入即可登录:/
    • @MárkVégh,不,提供的用户名和密码必须与数据库中的记录匹配。将发生的情况是查询不会返回任何内容,因为提供的用户名和密码将不匹配任何记录。请记住,它们只是文本字符串,没有任何其他含义。关键是匹配记录的唯一方法是提供正确的用户名和密码。无法使用作为输入文本提供的任何内容来修改查询。
    • @MárkVégh,准备好的查询不是文本替换。会发生什么:1)prepare 步骤完全解析了 sql。以后无法更改。占位符标记稍后将给出保存文本值的变量的位置。 2)bind 告诉数据库在哪里查找值。 3) Execute 使用变量中的值运行查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2014-09-30
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多