php - “无法处理请求”,处理基本的参数化查询
问题描述
我正在尝试我在网上找到的东西(对此非常新),但没有一个有效。这是我决定了解更多的一些随机科学项目,但我被困在“程序”的第 2 部分。https://www.sciencebuddies.org/science-fair-projects/project-ideas/Cyber_p008/cybersecurity/sql-injection#procedure
我观看了视频,但它们只包含一个用户 ID,而不是用户名和密码。注意:只有处理 login.php 的代码会导致问题。
<?php
include("global.php");
include("db.php");
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// username and password are sent in the form
$username = $_POST['username'];
$password = $_POST['password'];
// Check if the username and password exist in the database
$sql = "SELECT username FROM users WHERE username = '$username' AND password = '$password'";
$stmt = msqli_stmt_init($db);
if (!mysqli_stmt_prepare($stmt, $sql)) {
echo "SQL Statement Failed";
} else {
mysqli_stmt_bind_param($stmt, "ss", $username, $password );
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
$count = mysqli_num_rows($result);}
// If username and password matched then there is one row in the result
if ($count != 0) {
$_SESSION['login_user'] = strtolower($username);
header("location: search.php");
}
else {
$error = "Your Username or Password is invalid";
}
} ?>
它本应阻止基本的“'or''='”注入攻击,但它决定不完全工作。
解决方案
如果您使用查询参数(这绝对是个好主意),您必须在查询中保留占位符。用作?
占位符。
像这样:
$sql = "SELECT username FROM users WHERE username = ? AND password = ?";
您稍后将变量绑定到这些参数。您必须绑定与参数占位符数量相同数量的变量。
您收到了您描述的错误,因为您尝试将变量绑定到没有参数占位符的查询。
推荐阅读
- sql-server - SQL Server Service Broker 性能影响
- javascript - 我需要在 Redux 应用程序的代码中的这些地方写什么(remake pure react to redux)?
- android - 卡片视图不显示,我的 recyclerview 正在工作,但卡片视图在应用程序中不可见
- c++ - 如何在 debian:latest docker 上安装 gcc-9
- swift - 编写一个泛型函数以从 Swift 中的多个枚举中获取公共变量
- c# - 可以在 Worker 服务中使用 Task.Delay 长时间间隔吗
- c - C语言中%d和%.d的区别
- c++ - 使用枚举类编写工厂方法
- javascript - if 条件不会停止启用
- c - 匿名参数是什么意思?为什么需要它们?