答案是:这不安全。你的代码也不能保证安全。不要通过将用户提供的数据连接/插入语句来构建SQL。
另外,你不会为
LIKE
它本身也是不洁净的。
如果需要动态SQL,请使用预期数量的占位符和
然后
将用户提供的值绑定到这些占位符。
router.get('/search/:criteria', (req, res) => {
const ps = new sql.PreparedStatement();
const sqlConditions = [];
const escapedValues = {};
// set up escaped values, safe SQL bits, PS parameters
req.params.criteria.split(" ").forEach((v, i) => {
const paramName = 'val' + i;
escapedValues[paramName] = v.replace(/[\\%_]/g, '\\$&');
sqlConditions.push(`name LIKE '%' + @${paramName} + '%' ESCAPE '\'`);
ps.input(paramName, sql.VarChar);
});
// build safe SQL string, prepare statement
const sql = 'SELECT * FROM table WHERE ' + sqlConditions.join(' AND ');
ps.prepare(sql);
// connect, execute, return
ps.execute(escapedValues).then(result => {
res(result)
});
});
(免责声明:代码未经测试,因为我目前没有可用的SQL Server,但您可以理解。)