在我们古老的经典ASP环境中,我们利用OWASP从请求对象获取密码并加密非字母数字字符。这是防止sql注入的第一道防线。我们使用其他方法来完全防止SQL注入。
问题是,当我们收集数据以组合HTTP帖子消息并从用户输入中获取密码时,OWASP并将其发送出去。因此密码不正确。
示例:密码freddie $ cougar成为freddie& 36;美洲狮
我们最终做的是假设50个字符的文本字段没有足够的空间来进行大量sql注入并更改了代码,因此我们没有OWASP密码进入。这感觉有点可怕。
他们是更好的方式吗?
代码是用vbScript编写的。
答案 0 :(得分:4)
更好的解决方案是将所有查询转换为参数化查询。
答案 1 :(得分:3)
为什么要以明文形式发送密码?计算密码的哈希值并发送该密码。这将允许您阻止SQL注入并避免中间人类型攻击。
在任何情况下,您还必须清理服务器上的数据。即使您的vbscripts进行客户端验证,通过绕过您的脚本并手工制作带有恶意输入的数据包来攻击您的服务也是微不足道的。
答案 2 :(得分: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 存储在数据库中,而是一个盐渍哈希。
上面的方法是首选,无论你发送到数据库的是什么字符串,因为它将避免直接作为adhoc语句执行,并且将避免SQL注入,只要你不使用参数存储过程中的动态SQL。
答案 3 :(得分:1)
许多网站限制了可以在密码中使用的字符集 - 选择一个不会让您感到悲伤的集合。这可能意味着字母数字,以及一些标点符号(逗号,句号,短划线)。建议说,那些网站让我烦恼 - 我有机会在我的密码中使用一组丰富的字符,而在仅限字母数字的网站上,我通常最后使用像“IHateNoPunctSites”这样的废话作为密码。
如何将密码作为十六进制编码的字符串或base-64编码的字符串传送?然后,您可以在最后解码字符串,尽可能小心防止任何注入,而不限制密码中使用的字符集。当您需要检查密码时,可以确保使用参数化查询干净地完成密码。或者,您可以在将查询发送到密码文件之前使用其哈希值对密码进行哈希处理。无论如何,你不应该使用密码。