【问题标题】:Does pg (node-postgres) automatically sanitize datapg(node-postgres)是否自动清理数据
【发布时间】:2017-05-18 06:11:31
【问题描述】:

我将node-postgres 用于生产应用程序,我想知道是否有什么我应该关注的? node-postgres会自动清理数据吗?

我在 github 页面上找不到任何关于它的信息:https://github.com/brianc/node-postgres

【问题讨论】:

    标签: node.js pg node-postgres


    【解决方案1】:

    绝对! node-postgres 中的参数化查询支持是一流的。所有转义都由 postgresql 服务器完成,确保跨方言、编码等的正确行为......例如,这不会注入 sql:

    client.query("INSERT INTO user(name) VALUES($1)", ["'; DROP TABLE user;"], function (err, result) {
      // ...
    });
    

    这是来自他们的documentation

    【讨论】:

      【解决方案2】:

      这基本上取决于您如何执行@vitaly-t 描述的查询

      假设您将在字符串中定义查询并执行如下:

      var query = `SELECT * FROM table where username='${username}' and password='${password}`;
              
      pool.query(query, (error, results) => {
      });
      

      这种情况如果我会通过 username=' ' 或 1=1; --密码=' ' 或 1=1; --

      然后它将返回表中的所有记录(意味着 SQL 注入有效)

      但是如果我要执行以下查询

      pool.query('SELECT * FROM table where username=$1 and password=$2', [username, password], (error, results) => {
      });
      

      那么 SQL 注入将永远无法工作,因为 pg 会清理数据。

      所以这取决于你如何执行查询。

      【讨论】:

      • 不应该是query = "SELECT * FROM table where username='${username}' and password='${password}'" 吗? PS:无法添加`
      【解决方案3】:

      这取决于您如何执行查询:

      通过Prepared Statements 格式化是由服务器执行的,这反过来又会清除您的查询,使其免受任何 SQL 注入的影响。但它还有其他限制,例如一次不能执行多个查询,并且不能在需要时提供经过清理的实体名称。

      客户端查询格式化,如 pg-promise 实现的格式化,净化值,并提供格式化实体名称和多个查询的灵活性。

      【讨论】:

      • 愚蠢的问题 - 如果将格式化的字符串查询传递给 .query,是否可以将其视为准备好的语句?这方面的文档在哪里?
      • 还是必须是这种语法? var queryText = 'INSERT INTO users(password_hash, email) VALUES($1, $2) RETURNING id' client.query(queryText, ['841l14yah', 'test@te.st'
      • @VincentBuscarello 当查询作为{name, text, values} 传递到查询方法时,查询以Prepared Statement 执行。
      猜你喜欢
      • 2014-12-20
      • 2012-05-12
      • 2021-11-02
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      相关资源
      最近更新 更多