如何正确使用 UNNEST 而不会受到 sql 注入的影响
How to properly use UNNEST without being vulnerable to sql injections
我正在尝试使用 Express.js 和 postgresql 在多对多关系 table 中一次插入多行。下面的解决方案有效,但是,我知道因为我没有使用它容易受到 sql 注入的值来传递 homeType。
创建家庭控制器
const {
title,
description,
rules,
telephone,
homeType, // Array of ids example [1,2]
} = req.body;
try {
const results = await db.query(
'WITH step_one AS (INSERT INTO home (home_title, home_description, rules, telephone, user_account_id, created_on) VALUES (, , , , , NOW()) RETURNING home_id) INSERT INTO home_category (home_id, home_category_id) SELECT home_id, UNNEST(ARRAY' +
JSON.stringify(homeType) +
') FROM step_one',
[title, description, rules, telephone, req.user]
);
} catch (err) {
console.error(err.message);
return res.status(500).send('Server Error');
}
res.status(201).json({ message: 'Home created successfully' });
如何以正确的方式从数组中插入多行?
通过将值和 converting/casting 参数输入传递到查询语句中的实际数组来防止 SQL 注入。
要在 postgresql 中将对象转换为整数数组,请使用 $6::integer[]
完整查询如下:
const results = await db.query(
'WITH step_one AS (INSERT INTO home (home_title, home_description, rules, telephone, user_account_id, created_on) VALUES (, , , , , NOW()) RETURNING home_id) INSERT INTO home_category (home_id, home_category_id) SELECT home_id, UNNEST(::integer[]) FROM step_one',
[title, description, rules, telephone, req.user, homeType]
);
我正在尝试使用 Express.js 和 postgresql 在多对多关系 table 中一次插入多行。下面的解决方案有效,但是,我知道因为我没有使用它容易受到 sql 注入的值来传递 homeType。
创建家庭控制器
const {
title,
description,
rules,
telephone,
homeType, // Array of ids example [1,2]
} = req.body;
try {
const results = await db.query(
'WITH step_one AS (INSERT INTO home (home_title, home_description, rules, telephone, user_account_id, created_on) VALUES (, , , , , NOW()) RETURNING home_id) INSERT INTO home_category (home_id, home_category_id) SELECT home_id, UNNEST(ARRAY' +
JSON.stringify(homeType) +
') FROM step_one',
[title, description, rules, telephone, req.user]
);
} catch (err) {
console.error(err.message);
return res.status(500).send('Server Error');
}
res.status(201).json({ message: 'Home created successfully' });
如何以正确的方式从数组中插入多行?
通过将值和 converting/casting 参数输入传递到查询语句中的实际数组来防止 SQL 注入。
要在 postgresql 中将对象转换为整数数组,请使用 $6::integer[]
完整查询如下:
const results = await db.query(
'WITH step_one AS (INSERT INTO home (home_title, home_description, rules, telephone, user_account_id, created_on) VALUES (, , , , , NOW()) RETURNING home_id) INSERT INTO home_category (home_id, home_category_id) SELECT home_id, UNNEST(::integer[]) FROM step_one',
[title, description, rules, telephone, req.user, homeType]
);