此问题已在此处找到答案:
pdo对多个查询的支持(pdo_mysql、pdo_mysqlnd)(7个答案)
昨天关门了。
我是一名编码学校的导师,我正在向我的学生介绍php和概念,如pdo和准备好的语句。为了向他们展示预先准备好的语句(除其他外)在防止sql注入方面是如何有用,我尝试在我自己的表单上进行一些sql注入。我试过几十种不同的a DELETE FROM users
即使这些查询在phpmyadmin上运行时给出了预期的结果,查询也不会成功。这就引出了一个问题:php最近是否引入了一些额外的安全措施来防止sql注入?或者我做错了什么?
下面是我用来插入新用户的代码:
try {
$sql = "INSERT INTO users (name, email) VALUES ('$name', '$email')";
$this->conn->exec($sql);
echo "New record created successfully";
} catch (PDOException $exception) {
echo $exception;
}
无论何时我尝试任何输入,如 Bob'); DELETE FROM users where ('1' = '1
它给了我
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM users where ('1' = '1')' at line 1
即使相同的查询在phpmyadmin上工作
有什么想法吗?
1条答案
按热度按时间gmol16391#
编辑答案:
如上所述,try-at-sql注入实际上是一个错误,因为您没有向values子句传递两个值,即使insert需要两个值。
pdo在默认情况下确实支持多查询,但这对于mysql查询接口来说并不常见。mysql c api需要一个特殊的连接选项来启用多查询,而大多数连接器都没有设置该选项。看见https://dev.mysql.com/doc/c-api/8.0/en/c-api-multiple-queries.html
这不是一个pdo是否已经成熟以防止它的问题;pdo通过设计支持多查询。这是不幸的,因为它支持一整套sql注入攻击,而且没有必要。最好将multi-query选项保留为禁用状态,而一次只运行一个查询。正如mysql工程的前主管曾经告诉我的那样,“没有充分的理由让多查询功能存在。”
但由于这对于mysql连接器来说是不寻常的,所以它可能不是sql注入的一个好例子。
试着用一支钢笔
$name
“o'reilly”的价值。在大多数查询API中,运行多个以分号分隔的语句不起作用。因此,受人尊敬的《小鲍比桌》动画片在大多数情况下都不起作用。
但是sql注入可能更微妙。注入的语法可能会导致其他影响,即使它仅限于一条语句。例如,在这种情况下,insert语句可以输入多行。
但大多数情况下,sql注入并不是恶意用户故意进行的攻击。这只是一个语法错误。
看到问题了吗?额外的报价将导致此插入失败。