php – 正确地逃避MySQLI |查询准备好的语句
我读过这个:
将帮助您不要注射. 在以下帖子: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注入的保护? 我想使用$mysqli-> query();所以我可以使用fetch_array(MYSQLI_ASSOC);因为坦率地说,我不知道如何在使用预准备语句后将结果作为数组获取. 所以如果我在我的数据库连接中有这个: $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 以上列表: 警告 链接到:http://php.net/manual/en/mysqli.set-charset.php 我的整体问题可以分为三个选项,第一个是为预备语句请求fetch_array()equlivant,这将提供完整的SQL注入预防,因为预处理语句将数据作为原始数据发送. 这种格式的第一个问题如下: 我使用的查询为: $GetCompletedQuery = $STD->query("SELECT Status FROM UserCompletion WHERE `UserID`=' ". $STD->real_escape_string($_SESSION['UID']) ."'"); $GetCompletedArray = $GetCompletedQuery->fetch_array(MYSQLI_ASSOC); 哪个回报:
但使用准备好的陈述: $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_array()时会出现同样的情况,我知道fetch_array()不能与预处理语句一起使用. 那么使用预准备语句的选项是什么? 第二个问题 如果我使用我的常用查询: $GetCompletedQuery = $STD->query("SELECT Status FROM UserCompletion WHERE `UserID`=' ". $STD->real_escape_string($_SESSION['UID']) ."'"); 这使我能够使用fetch_array();从SQL注入正确保护数据? 第三个问题: 我是否应该为$_SESSION [‘UID’]逃避/保护SQL注入;因为这是在以下庄园中分配的: $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 [‘UID’]时逃避/防止SQL注入;基于$_SESSION [‘real_name’]通过数据库分配; 谢谢你花时间阅读这个巨大的块. 解决方法
>
http://php.net/manual/en/mysqli-stmt.get-result.php
>是的,但实践非常糟糕: >在这种情况下,它会帮助你,但只有在这种情况下,并用其他任何东西欺骗 >是的,因为没有像SQL注入这样的东西,但只有不正确的格式化
我没有改变主意:当然,事实并非如此. 看,SQL注入不是必需的东西,它本身就存在,但它仅仅是一种后果.查询格式不正确的后果. 因此,变量的来源或它的价值永远不应该是您的关注点.但只有它在查询中的位置: >字符串必须用引号括起来并将这些引号转义. 当它用于查询的静态部分,在脚本中硬编码时,我们不使用这样严格的标准 – 比如说,我们没有将每个标识符都包含在反引号中. 顺便说一句,还有另一种格式化字符串和数字的方法 – 准备好的语句.它不是那么方便,但是因为它使用占位符来表示查询中的数据,所以建议使用过于愚蠢的手动格式化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |