我已阅读本:
将帮助你不反对注射。 Beause逃避只是一个字符串格式化功能,不防注入以任何方式。 去搞清楚。 然而,逃避有一些共同点和预处理语句:他们俩不一样,如果你使用的是它仅针对臭名昭著的“用户输入”,不作为建筑物的任何查询一条严格的规则,尽管数据源从注入你保证。 如果你需要插入不是数据,但标识或关键字。
在下面的帖子: 与SQL溢出就像准备好的语句作为安全动态的MySQL查询?
所以我的问题是,使用:
$Var = "UserInput Data Possible SQL Injection";
$mysqli->real_escape_string($Var);
不提供针对SQL注入防护?
我想用$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()
equlivant的prepared
,由于准备的语句发送数据作为原始报表,这将提供完整的SQL注入预防。
这种格式的第一个问题如下:
我使用的是查询为:
$GetCompletedQuery = $STD->query("SELECT Status FROM UserCompletion WHERE `UserID`=' ". $STD->real_escape_string($_SESSION['UID']) ."'");
$GetCompletedArray = $GetCompletedQuery->fetch_array(MYSQLI_ASSOC);
返回:
阵列([状态] => 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);
返回:
致命错误:调用一个成员函数fetch_row()一个非对象在/var/www/New/API/Constants.php第17行
当我尝试同样出现fetch_array()
我知道能不能用准备好的语句中使用。
那么,什么将是一个使用准备好的语句的选项?
第二个问题
如果我用我一贯的查询为:
$GetCompletedQuery = $STD->query("SELECT Status FROM UserCompletion WHERE `UserID`=' ". $STD->real_escape_string($_SESSION['UID']) ."'");
这使我使用fetch_array();
在数据正确地从SQL注入安全吗?
第三个问题:
我应该逃避/从SQL注入保护了$_SESSION['UID'];
因为这被分配在以下庄园:
$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阵列的结果,加入到每一个不同的密钥。
此块的问题是我应该甚至可以逃脱/从SQL注入保护当$_SESSION['UID'];
通过基于所述数据库中分配$_SESSION['real_name'];
谢谢你们的时间,阅读了这个巨大的块。