首页 > 解决方案 > “无法处理请求”,处理基本的参数化查询

问题描述

我正在尝试我在网上找到的东西(对此非常新),但没有一个有效。这是我决定了解更多的一些随机科学项目,但我被困在“程序”的第 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''='”注入攻击,但它决定不完全工作。

标签: phpsql-injectionparameterized-query

解决方案


如果您使用查询参数(这绝对是个好主意),您必须在查询中保留占位符。用作?占位符。

像这样:

$sql = "SELECT username FROM users WHERE username = ? AND password = ?";

您稍后将变量绑定到这些参数。您必须绑定与参数占位符数量相同数量的变量。

您收到了您描述的错误,因为您尝试将变量绑定到没有参数占位符的查询。


推荐阅读