- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我读过这个:
将帮助您避免注入(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'];
感谢您花时间阅读这一大块内容。
最佳答案
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/
这个问题已经有答案了: php, mysql - Too many connections to database error (6 个回答) 已关闭 8 年前。 伙计们,我的 opencart 网站
这是我想要的,但不能让它与新的 MySQLi 一起工作,只是因为我的主机没有所有新的 php 等... 但是一定有某种解决方案,或者这就是 MYSQLI 能做的? 请不要谈论 PDO,因为即使是丑陋的
这个问题在这里已经有了答案: Is there a way to see a prepared query as it will be executed on the database? [dupli
Warning: mysqli::query(): Couldn't fetch mysqli in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\
Warning: mysqli::query(): Couldn't fetch mysqli in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\
Warning: mysqli::query(): Couldn't fetch mysqli in C:\Program Files (x86)\EasyPHP-DevServer-13.1VC9\
如何在扩展类中实现 mysqli? 我正在上传图像并将其存储在 MySQL 数据库中,但出现此错误: Notice: Undefined variable: mysqli in ...ecc/ecc/
我终于切换到 mysqli 了。 但是我发现了显着的性能差异。 我有一个脚本,可以进行大约 25.000 个查询。该脚本使用 mysqli 和 mysqlnd 作为驱动程序需要 15 秒10 秒使用
这个问题已经有答案了: Why can't I run two mysqli queries? The second one fails [duplicate] (2 个回答) 已关闭 4 年前。 我
这个问题已经有答案了: mysqli::query(): Couldn't fetch mysqli (4 个答案) 已关闭 6 年前。 这是我当前的代码: query("SELECT * FROM
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我正在尝试连接到我的数据库,但当我使用 127.0.0.1 而不是本地主机时出现错误。 Warning: mysqli::mysqli(): (HY000/2002): A connection at
使用 WHM 更新 mysql 后我的网站面临这个问题。 Warning: mysqli::mysqli(): Headers and client library minor version mis
我试图通过 MySQLi 将简单数据插入到我的 MySQL 表中,但是它拒绝插入,并且没有报告任何错误消息。 我想强调的是,当直接输入 PhpMyAdmin 时,此查询功能正常(当然,替换了变量) r
我正在使用用户断言函数,例如: debug_assert ( gettype($ob)=='object', "Not an object " .print_r($ob
我有一个每天只有大约 100 人访问的站点,但是当我以用户身份登录时收到此错误消息: Warning: mysqli::mysqli() [mysqli.mysqli]: (42000/1203):
我创建了一个 foreach 循环来将数据添加到 MySQL 数据库,但在将第一行添加到数据库后,我收到错误“mysqli::query(): Couldn't fetch mysqli”。 PHP
我正在使用 mysqli 实现一些基本的 getter 函数,并且正在考虑一种在错误检查中变得懒惰但仍然正确的方法。 所以我写了这种类型的代码段 if(!mysqli_stmt_bind_param(
我已经阅读了在线 php 手册,但我仍然不确定这两个函数的工作方式:mysqli::commit 和 mysqli::rollback。 我要做的第一件事是: $mysqli->autocommit(
这个问题在这里已经有了答案: What is the difference between single-quoted and double-quoted strings in PHP? (7 个答
我是一名优秀的程序员,十分优秀!