PHPSQL注入失败

rvpgvaaj  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(384)

此问题已在此处找到答案

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上工作
有什么想法吗?

gmol1639

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注入并不是恶意用户故意进行的攻击。这只是一个语法错误。

$sql = "INSERT INTO users (name, email) VALUES ('O'Reilly', 'radar@4077mash.mil')";
                                                  ^

看到问题了吗?额外的报价将导致此插入失败。

相关问题