SQL 存储过程中的注入和 JSON
SQL injection in stored procedures and JSON
我正在 Node/JavaScript 中使用 MySQL 数据库开发 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_EXTRACT
和 JSON_UNQUOTE
,我是否容易 SQL 注入这里?
不,您不容易 SQL 注射。您可能对代码有其他问题。如果密码未加密,您的代码可能不安全。
但是,唯一会 运行 的 SQL 代码是存储过程中的 SQL。
SQL 注入与 动态 SQL 关联。即 SQL 由字符串构成。 SQL 注入帐户改变(“增强”?)字符串来做危险的事情。您的代码只是在 insert
中赋值。这些可能是错误的,但它们不会导致任何其他语句 运行.
我正在 Node/JavaScript 中使用 MySQL 数据库开发 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_EXTRACT
和 JSON_UNQUOTE
,我是否容易 SQL 注入这里?
不,您不容易 SQL 注射。您可能对代码有其他问题。如果密码未加密,您的代码可能不安全。
但是,唯一会 运行 的 SQL 代码是存储过程中的 SQL。
SQL 注入与 动态 SQL 关联。即 SQL 由字符串构成。 SQL 注入帐户改变(“增强”?)字符串来做危险的事情。您的代码只是在 insert
中赋值。这些可能是错误的,但它们不会导致任何其他语句 运行.