Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PDO准备的语句如何帮助防止SQL易受攻击的语句?_Sql_Pdo - Fatal编程技术网

PDO准备的语句如何帮助防止SQL易受攻击的语句?

PDO准备的语句如何帮助防止SQL易受攻击的语句?,sql,pdo,Sql,Pdo,我很困惑,或者更确切地说,我对pdo准备的声明很困惑。我知道,事先准备好的声明是保护数据免受黑客攻击的最佳方式 发件人: 我们首先将程序发送到服务器 $db->prepareSELECT*从id=?”的用户处?;数据在哪里 被称为占位符的变量替换 请注意,相同的查询被发送到服务器,没有任何 数据在里面!然后我们在第二个请求中发送数据, 与查询本身完全分离: $db->执行$data 质疑- $query=$db->prepare("SELECT * FROM USERS WHERE use

我很困惑,或者更确切地说,我对pdo准备的声明很困惑。我知道,事先准备好的声明是保护数据免受黑客攻击的最佳方式

发件人:

我们首先将程序发送到服务器

$db->prepareSELECT*从id=?”的用户处?;数据在哪里 被称为占位符的变量替换

请注意,相同的查询被发送到服务器,没有任何 数据在里面!然后我们在第二个请求中发送数据, 与查询本身完全分离:

$db->执行$data

质疑-

$query=$db->prepare("SELECT * FROM USERS WHERE username=?");
$query->execute(array($tex));
$tex=blah; DROP TABLE users;--
然后它会像-从username=blah的用户中选择*;删除表用户-

prepare语句如何帮助我完成上面的示例


如果这个问题理解不清楚,我真的很抱歉。任何帮助都将不胜感激。提前感谢。

准备好的语句处理程序将确保绑定值始终用作有效的SQL值/文字,即SQL字符串或数字,而不是“原始SQL文本”1

这就是占位符值不能用作列名或表名等标识符或用作其他SQL关键字的原因;并且无法生成假设的易受攻击查询。相反,它被视为以下内容:

什么地方;删除表用户;-' -^占位符确保使用有效的SQL字符串值 -注意自动/隐式添加SQL引号 即使在绑定“更棘手”的数据时:

$tex=blah';删除表用户;-;//嵌入式SQL引号字符 它仍然是安全的:

什么地方;删除表用户;-' -^占位符仍然确保使用有效的SQL字符串值 因此,在使用占位符时,不可能以这种方式生成易受攻击的SQL

对于包含关键字和标识符但不包含值的查询的“形状”,输入必须更改其本身

1根据适配器/驱动程序的不同,占位符值也可以通过单独的数据通道发送,因此甚至可能不会出现在原始SQL查询本身中

但是,思考占位符为何安全或如何“工作”的简单方法是:


使用占位符时,适配器确保每个绑定文本值始终使用与“sql really safe escape”(sql真正安全转义)和适用的引号等效的值,因此不可能意外忘记。

您是说,在使用占位符时,不可能生成易受攻击的sql。但我想知道占位符是怎么做的?我的意思是-htmlspecialchars函数将一些预定义字符&、、、转换为HTML实体,addslashes函数返回一个在预定义字符前面带有反斜杠的字符串。与这些函数类似,占位符如何检测值的格式不正确或值不适合查询?停止。它不做这种事。占位符确保值作为有效的SQL值提供。它与HTML、实体或斜杠无关。占位符只能确保数据正确传输,而不存在SQL注入的机会。占位符永远不会改变实际值。在上面的例子中,我展示了如何用正确的ANSI SQL语法在SQL查询中表示这一点。假设占位符构建了实际的SQL查询,那么该方法将使用mysqli\u real\u escape\u string或等效的方法。