我很困惑或者说我很喜欢,soooooooooo与pdo预备语句相混淆。我知道准备好的声明是保护数据免受黑客攻击的最佳方式。
来自:How can prepared statements protect from SQL injection attacks?
我们首先将程序发送到服务器
$ db-> prepare(“SELECT * FROM users where id =?”);数据在哪里 由一些名为“占位符”的变量代替。
请注意,发送到服务器的查询完全相同,没有任何查询 数据在里面!然后我们用第二个请求发送数据, 完全与查询本身分开:
$ DB->执行($数据);
查询 -
$query=$db->prepare("SELECT * FROM USERS WHERE username=?");
$query->execute(array($tex));
$tex=blah; DROP TABLE users;--
那么它就像 - SELECT * FROM USERS WHERE username = blah; DROP TABLE用户; -
准备语句如何帮助我完成上面这个例子?
如果这个问题含糊不清,我真的很抱歉。任何帮助,将不胜感激。提前谢谢。
答案 0 :(得分:0)
预准备语句处理程序将确保绑定值始终用作有效的SQL值/文字(即SQL字符串或数字),从不作为'原始SQL文本' 1 。
这就是占位符值不能用作列名或表名等标识符或充当其他SQL关键字的原因;并且无法生成虚假的易受攻击的查询。相反,它被视为以下内容:
WHERE username='blah; DROP TABLE users;--'
--^ placeholder ensures valid SQL string value is used
-- (note automatic/implicit addition of SQL quotes)
即使绑定“更棘手”的数据:
$tex = "blah'; DROP TABLE users;--"; // embedded SQL quote character
它仍然是安全的:
WHERE username='blah''; DROP TABLE users;--'
--^ placeholder STILL ensures valid SQL string value is used
因此,在使用占位符时,不可能生成易受攻击的SQL(以这种方式)。
对于SQL Injection,查询的“形状”(包括关键字和标识符,但排除值)本身必须由输入更改。
1 技术上占位符值也可以通过单独的数据通道发送(取决于适配器/驱动程序),因此可能甚至不会出现在原始SQL查询本身中。
然而,一个简单的方法来思考为什么占位符是安全的,或者它们是如何工作的:
使用占位符时,适配器确保“sql真正安全转义”的等价物和适用的引用始终用于每个绑定的文本值 - 因此不可能意外忘记。