如何验证用户字符串输入不包含 sql 注入?在Javascript中

Posted

技术标签:

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

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

【问题讨论】:

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

以上是关于如何验证用户字符串输入不包含 sql 注入?在Javascript中的主要内容,如果未能解决你的问题,请参考以下文章

如何防止sql注入

SQL 注入输入验证

如何防范SQL注入漏洞及检测

轻松理解啥是 SQL 注入

SQL注入求指点

教你ASP.NET中如何防止注入攻击