3

在我们古老的 Classic ASP 环境中,我们利用 OWASP 从请求对象中获取密码并对非字母数字字符进行加密。这是防止sql注入的第一道防线。我们使用其他方法来预防完整的 sql 注入。

问题是,当我们收集数据以组合 HTTP 发布消息并从用户输入中获取密码时,OWASP 将其发送出去。因此密码不正确。

示例:密码 freddie$cougar 变为 freddie&36;cougar

我们最终做的是假设一个 50 个字符的文本字段没有足够的空间来进行大量的 sql 注入并更改了代码,所以我们没有 OWASP 输入密码。这感觉有点吓人。

他们是更好的方法吗?

代码是用 vbScript 编写的。

4

4 回答 4

4

更好的解决方案是将所有查询转换为参数化查询。

这是一篇12 年前的文章,解释了如何:)

于 2010-09-03T17:10:32.043 回答
3

为什么要以明文形式发送密码?计算密码的哈希值并发送该值。这将允许您防止 SQL 注入并避免中间人类型的攻击。

无论如何,您还必须清理服务器上的数据。即使您的 vbscripts 进行客户端验证,通过绕过您的脚本并手工制作包含恶意输入的数据包来攻击您的服务也是微不足道的。

于 2010-09-03T17:13:38.003 回答
2

考虑将您的 SQL 语句移动到存储过程,并确保您不在这些存储过程中使用动态 SQL。

Dim userPwd = Trim(Request.QueryString("userPwd"))
'--- Create and append parameter for Password
Set pwdParameter = cmd.CreateParameter("@UserPassword", ad_nVarChar, adParamInput, 50, userPwd)
cmd.Parameters.Append pwdParameter

另外,最好不要将 pwd 存储在数据库中,而是将其存储在盐渍哈希中。

无论您向数据库发送什么字符串,上述方法都是首选,因为它会避免直接作为临时语句执行,并且会避免 SQL 注入,只要您不使用带有动态 SQL 的参数存储过程。

于 2010-09-03T17:11:59.343 回答
1

许多网站限制了可在密码中使用的字符集 - 选择不会让您感到悲伤的字符集。这可能意味着字母数字和一些标点符号(逗号、句号、破折号)。建议后,这些网站让我很恼火——如果有机会,我会在密码中使用丰富的字符集,而在仅包含字母数字的网站上,我通常最终会使用诸如“IHateNoPunctSites”之类的废话作为密码。

将密码作为十六进制编码字符串或 base-64 编码字符串发送怎么样?然后,您可以在最后对字符串进行解码,并在不限制密码中使用的字符集的情况下尽可能小心地防止任何注入。当您需要检查密码时,您可以使用参数化查询确保您正确地执行此操作。或者,您可以在将查询发送到密码文件之前使用其盐对密码进行哈希处理。无论如何,您不应该对密码做太多事情。

于 2010-09-03T17:18:47.220 回答