如何验证用户字符串输入不包含 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 带有一个非常强大的 ormTypeOrm
,只需使用来自相同查询的字符串连接的查询构建器。这应该足以保护您的应用程序免受 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中的主要内容,如果未能解决你的问题,请参考以下文章