【问题标题】:How to verify that a a user string input doesn't contain sql injection? in Javascript如何验证用户字符串输入不包含 sql 注入?在Javascript中
【发布时间】:2021-04-06 20:48:16
【问题描述】:

我试图挖掘 sanitize 函数但我没有找到我想要的答案,问题是如何检查用户输入是否不包含任何 sql 注入?我正在使用 Nest JS(类似于 node),如果您知道我该怎么做,这将对我有很大帮助!

【问题讨论】:

  • 您应该编写代码,使用户输入永远不会被视为 SQL,通常使用 SQL 参数而不是将用户输入连接到 SQL 命令中。如果您已经这样做了,请添加一个可能存在问题的具体示例。
  • NestJs 带有一个非常强大的 orm TypeOrm,只需使用来自相同查询的字符串连接的查询构建器。这应该足以保护您的应用程序免受 sql 注入。

标签: javascript node.js nestjs sql-injection


【解决方案1】:

一般来说:你不能。可以想象,任何可能是 SQL 注入的输入也可能是真正的输入(至少在某些狭隘的情况下)。

不要尝试检测 SQL 注入。相反,在可能的情况下使用占位符,在不适当的情况下使用适当的转义。

【讨论】:

    【解决方案2】:

    问题不在于 NestJS 方面,而在于您如何构建 SQL 查询以执行。 您可以使用@nearform/sql 表示:

    一个简单的 SQL 注入保护模块,允许您将 ES6 模板字符串用于转义语句。适用于 pg、mysql 和 mysql2 库。

    它将保护您免受恶意用户输入的侵害。 此模块经过实战考验,already in production 用于 Covid Government Tracker。

    【讨论】:

      【解决方案3】:

      可以使用prepared statements来避免sql注入攻击 这个blog post 解释得很好。供参考帖子中的sn-p。

      function authenticate(req, res, next){
          const username = req.query.username,
                password = req.query.password
          let preparedStatement = new sql.PreparedStatment(),
              sqlQuery = "select * from users where (username = @username and password = @password)"
          
          preparedStatement.input('username', sqlVarChar(50))
          preparedStatement.input('password', sqlVarChar(50))
          preparedStatement.prepare(sqlQuery)
          .then(function(){
              return preparedStatement.execute({username: username, password: password})
                  .then(function(recordset){
                      if(recordset.length == 1){
                          loggedIn = true
                          //successful log in
                      } else {
                          //authentication failed
                      }
                  })
              })
          .catch(next)
      }
      
      

      【讨论】:

      • 是的,但是它并没有验证用户名和密码里面是否有sql,或者是吗?
      • 即使它确实说用户名是;select * from users。准备好的语句将阻止它执行。这将是一个奇怪的用户名,但不是 sql 注入。
      猜你喜欢
      • 2015-01-27
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2017-05-01
      相关资源
      最近更新 更多