我继承的遗留网络应用程序是在经典ASP中为新西兰乐施会定制的,在用户提交的输入上运行字符串替换,删除字符串'cast',大概是因为强制转换功能。
但是,这意味着我们的参与者都不能拥有包含该字符串的名称或电子邮件地址。这给姓Hardcastle的人造成了问题。
这似乎完全超出了最高安全性 - 或者至少必须有一种方法可以确保用户输入是安全的,而无需更改名称或电子邮件地址中“强制转换”的人的输入。
实际替换完成:
strString = (Replace(strString, "cast", "", 1, -1, vbTextCompare))
我正在考虑评论那条线路,这样做会安全吗?
答案 0 :(得分:2)
遗留应用程序做错了。
不是在源处过滤内容,而是应该在使用它的任何地方对内容进行属性编码。换句话说,如果它在查询中使用,则在将值添加到SQL语句之前对该值进行编码,或者更好地将其放入存储过程参数中。
是的,你可以删除该代码,但要确保strString
在其他地方安全使用。
答案 1 :(得分:0)
我可以将其改为
strString = (Replace(strString, "cast(", "", 1, -1, vbTextCompare))
这样,您仍然可以获得逃避SQL的“安全”,但不会使用名称中的强制转换加剧用户
答案 2 :(得分:0)
这实际上是防止SQL注入攻击的极其无效的方法。您需要替换其他100个单词。接受的答案是不正确的,因为这不保留此代码的安全性,因为开始时没有安全性。如果黑客只是在CAST和(。
之间添加了空格),则带有“(”字符的行将永远不会执行在parameterized queries in classic asp上查看此问题。您永远不想连接用户提供的数据来生成sql字符串。有些方法可以在没有正确连接的情况下执行此操作,但是您目前拥有的代码是无用的。您也可以删除该行。