【问题标题】:SQL injection in stored procedures and JSON存储过程和 JSON 中的 SQL 注入
【发布时间】:2020-06-26 09:59:02
【问题描述】:

我正在使用 MySQL 数据库在 Node/JavaScript 中开发 API。我认为这是一个与 Node/JavaScript 无关的问题,只是 SQL,但我不确定。

这里我有一个最小的例子。假设我有一个创建用户的存储过程:

DROP PROCEDURE IF EXISTS users_create;
CREATE PROCEDURE users_create(
  IN user JSON
)
BEGIN
  -- Retrieve values from JSON
  SET @name = JSON_EXTRACT(user, '$.name');
  SET @email = JSON_EXTRACT(user, '$.email');
  SET @password = JSON_EXTRACT(user, '$.password');
  SET @uuid = uuid();

  -- Insert new user
  INSERT INTO user (`id`, `name`, `email`, `password`) VALUES (
    @uuid,
    JSON_UNQUOTE(@name),
    JSON_UNQUOTE(@email),
    JSON_UNQUOTE(@password)
  );

  -- Retrieve created user
  SELECT `id`, `name`, `email`, `status`, `createdAt` FROM user
  WHERE id = @uuid;

END

现在我有了一个新的用户对象——Javascript——:

const newUser = {
  name: "This is me",
  email: "me@example.com",
  password: "strong_password",
}

我把这个过程称为:

const createUserQuery = `CALL users_create('${JSON.stringify(newUser)}')`;

我的问题是:鉴于我使用 JSON 来传递数据,并且我使用的是 JSON_EXTRACTJSON_UNQUOTE,我是否容易在这里进行 SQL 注入?

【问题讨论】:

    标签: mysql sql sql-injection json-extract


    【解决方案1】:

    不,您不容易受到 SQL 注入的影响。您可能对代码有其他问题。如果——比如说——密码没有加密,你的代码可能是不安全的。

    但是,唯一会运行的 SQL 代码是存储过程中的 SQL。

    SQL 注入与动态 SQL 相关联。那是从字符串构造的 SQL。 SQL 注入帐户会更改(“增强”?)字符串来做危险的事情。您的代码只是在insert 中分配值。这些可能是错误的,但它们不会导致任何其他语句运行。

    【讨论】:

    • 有趣。阅读this 我刚刚发现,由于我的程序已格式化,因此无法删除用-- 将它们注释掉的右括号。所以我想SQL注入需要一个内联字符串来攻击SQL。还有,
    猜你喜欢
    • 2013-05-03
    • 2018-10-06
    • 1970-01-01
    • 2017-08-24
    • 2014-06-20
    • 1970-01-01
    • 2019-06-26
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多