【问题标题】:NodeJS and MariaDB. Avoid queries for every columnNodeJS 和 MariaDB。避免查询每一列
【发布时间】:2019-04-18 20:46:08
【问题描述】:

我正在使用 NodeJS 和 MariaDB。我有很多表,其中一些用户可以通过请求更改值。我不想为用户想要更新的每一列准备查询,例如:

module.exports.updateName = (name,id) =>{
    return pool.query("UPDATE Users SET name=? WHERE user_id=?;", [name,id])
}
module.exports.updateAge = (name,id) =>{
    return pool.query("UPDATE Users SET age=? WHERE user_id=?;", [age,id])
}

我想建造 s.th。就像一个需要表格、列和值的模板。 为了防止 SQL 注入攻击,我已经在使用?值的占位符。不幸的是,MariaDB 不支持 ?? 等标识符的占位符。 将表名或列连接到查询字符串,我觉得不安全,例如:

"SELECT INTO " + tablename +"(" + columns + ")" ...

我的想法是在每次服务器启动时查询我的数据库中存在哪些表名和列名,并将它们存储在一个列表中。然后我可以检查传递的表和列字符串是否有效。

这个想法是否有意义或者是一种常见的方式?将如何处理这个问题? 感谢您的每一个建议!

问候

【问题讨论】:

  • 使用最终用户需要的尽可能多(或很少)子句构建查询。在应用程序代码中执行此操作,而不是 SQL。
  • 你能举个例子吗?我不明白你的意思

标签: mysql node.js mariadb sql-injection handle


【解决方案1】:

好吧,我要做的是创建一个包含参数、用户、列、值的存储过程,并在其中决定使用什么更新语句,如下所示:

create procedure updateValues (in uid int, in columnid int, in value int)...
begin
    if columnid = 0 then
       update users set name = value;
    else if columnid = 1 then
       update users set age = value;
    end if
end

【讨论】:

  • 但是如果用户想用不同的值更新 4 列怎么办。我将不得不调用该程序 4 次。这不是很有效,不是吗?
  • 嗯,你打算连续调用 SP 几次吗?否则可能意义不大。另一方面,您可以通过删除 SQL 语句和符号来组装 SQL 字符串并过滤攻击……老实说,这与保留有效列的列表一样多,而且可能不安全。 getter/setter 的封装方式是对值进行分离,但也可以通过 sp 中的可选参数对它们进行分组
  • 忘了我刚刚意识到 MySQL 不支持可选项...好吧,所以另一种选择是让 sp 按顺序列出所有可能的参数,然后检查列表
  • 另外,调用 sp 提供了一些防止 sql 注入的保护,因为您必须准备它并在 ? 中传递参数,因此额外的 sql 代码可能会导致错误。不过,寻找过滤库,可能会有一些有用的东西
猜你喜欢
  • 1970-01-01
  • 2013-01-02
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
相关资源
最近更新 更多