gpt4 book ai didi

php - 正确使用 MySQLI 进行转义 |查询准备好的语句

转载 作者:可可西里 更新时间:2023-10-31 22:56:27 24 4
gpt4 key购买 nike

我读过这个:

将帮助您避免注入(inject)。因为转义只是一种字符串格式化工具,而不是任何方式的注入(inject)防护。去搞清楚。但是,转义与准备好的语句有一些共同点:他们都不能保证你不会注入(inject),如果您仅将它用于臭名昭著的“用户输入”,而不是作为构建任何查询的严格规则,尽管有数据源。如果您需要插入的不是数据而是标识符或关键字。

在以下帖子中:Are dynamic mysql queries with sql escaping just as secure as prepared statements?

所以我的问题是使用:

$Var = "UserInput Data Possible SQL Injection";
$mysqli->real_escape_string($Var);

不提供针对 SQL 注入(inject)的保护?

我想使用 $mysqli->query(); 所以我可以使用 fetch_array(MYSQLI_ASSOC); 因为坦率地说,我不知道如何获取使用 prepared 语句后的结果作为数组。

所以如果我的数据库连接中有这个:

$STD = new mysqli('localhost', 'root', 'xx', 'xx');
$STD->set_charset('utf8');

if ($STD->connect_error) {
die("Standard Access Has Been Revoked. Please Contact Administration");
}elseif (!$STD){
die ("Other problem With Connecting To Database, Please Contact Administration");
}

real_escape_string 手册中所述

http://php.net/manual/en/mysqli.real-escape-string.php

以上列表:

警告安全性:默认字符集字符集必须在服务器级别设置,或者使用 API 函数 mysqli_set_charset() 来影响 mysqli_real_escape_string()。有关详细信息,请参阅有关字符集的概念部分。

链接到:http://php.net/manual/en/mysqli.set-charset.php


我的总体问题可以分为三个选项,第一个是要求 fetch_array() 等价于 prepared 语句,这将提供完整的 SQL 注入(inject)预防,因为准备好的语句将数据作为原始数据发送。


此格式的第一个问题如下:

我将查询用作:

$GetCompletedQuery = $STD->query("SELECT Status FROM UserCompletion WHERE `UserID`=' ". $STD->real_escape_string($_SESSION['UID']) ."'");
$GetCompletedArray = $GetCompletedQuery->fetch_array(MYSQLI_ASSOC);

返回:

Array ( [Status] => 1 )

但是使用准备好的语句:

$GetCompletedQuery = $STD->prepare("SELECT Status FROM UserCompletion WHERE `UserID`=?");
$GetCompletedQuery->bind_param('i', $_SESSION['UID']);
$GetCompletedQuery->execute();

$GetCompletedArray = $GetCompletedQuery->fetch_row;

print_r($GetCompletedArray);

返回:

Fatal error: Call to a member function fetch_row() on a non-object in /var/www/New/API/Constants.php on line 17

当我尝试 fetch_array() 时出现同样的情况,我知道它不能与准备好的语句一起使用。

那么使用预处理语句的选项是什么?


第二个问题

如果我将我的常用查询用作:

$GetCompletedQuery = $STD->query("SELECT Status FROM UserCompletion WHERE `UserID`=' ". $STD->real_escape_string($_SESSION['UID']) ."'");

这使我能够使用 fetch_array(); 数据是否已妥善保护免受 SQL 注入(inject)攻击?


第三个问题:

我是否应该为 $_SESSION['UID']; 转义/保护免受 SQL 注入(inject),因为这是在以下庄园中分配的:

$InnerJoinQuery = $STD->query("
SELECT Users.ID, Users.Username, Users.Password, UserInformation.LastName, UserInformation.Firstname, UserInformation.DOB
FROM Users
INNER JOIN UserInformation
ON Users.ID = UserInformation.UserID WHERE Users.Username = '".$_SESSION['real_name']."'");
$InnerJoinArray = $InnerJoinQuery->fetch_array(MYSQLI_ASSOC);

$_SESSION['UID'] = $InnerJoinArray['ID'];
$_SESSION['Password'] = $InnerJoinArray['Password'];
$_SESSION['Firstname'] = $InnerJoinArray['Firstname'];
$_SESSION['LastName'] = $InnerJoinArray['LastName'];
$_SESSION['DOB'] = $InnerJoinArray['DOB'];

此片段解释:

用户使用用户名和密码登录,文件根据$_SESSION['real_name'];从数据库中获取信息并将结果添加到 $_SESSION 数组,将每个结果添加到不同的键中。

这个 block 的问题是,当 $_SESSION['UID']; 是基于 $_SESSION[' 通过数据库分配时,我是否应该逃避/保护免受 SQL 注入(inject)real_name'];

感谢您花时间阅读这一大块内容。

最佳答案

  1. http://php.net/manual/en/mysqli-stmt.get-result.php
  2. 是的,但这是非常糟糕的做法:
    • 它会在这种情况下帮助您,但在这种情况下并且用其他任何方式欺骗
    • 手动转义很傻,最好让驱动程序帮你完成
  3. 是的,因为没有 SQL 注入(inject)之类的东西,只有格式不正确

is that using $mysqli->real_escape_string($Var); does not provide protection against SQL Injection?

我没有改变主意:当然没有。
仅当您将结果值括在引号中(并使用 mysqli_set_charset() 严格设置正确的编码)时,它才会执行。

你看,SQL 注入(inject)不是必不可少的东西,它本身就存在,但它只是一个结果。查询格式不正确的结果。
创建查询时,您必须正确设置查询的每个部分的格式。不是因为任何“注入(inject)”,而是为了它。当你要在查询中插入一个字符串时,你必须把它放在引号中,否则你会得到一个语法错误。当你要在查询中插入一个字符串时,你必须转义这些用于分隔这个字符串的引号,否则你会得到一个语法错误。等等。您应该关心的是正确的格式化,而不是有关注入(inject)的吓人故事。并且只要您根据每个动态查询部分的类型对其进行正确格式化 - 就不可能进行注入(inject)

因此,变量的来源或其值永远不应该是您关心的问题。但只有它在查询中的位置:

  • 字符串必须用引号引起来并转义这些引号。
  • 数字必须转换为它的类型。
  • 标识符必须包含在反引号中,并且这些反引号加倍

当查询的静态部分在脚本中硬编码时,我们不会使用如此严格的标准——比如说,我们不会将每个标识符括在反引号中。
但是当它用于查询的动态部分时,应用格式化规则应该是严格的规则,因为我们无法确定地知道变量内容。

顺便说一句,还有另一种格式化字符串和数字的方法——准备好的语句。它并不像它应该的那样方便,但是因为它使用占位符来表示查询中的数据,所以它建议使用愚蠢的手动格式。

关于php - 正确使用 MySQLI 进行转义 |查询准备好的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14311686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com