我遇到了一个问题。写了以下代码片段:
teksti = teksti.Trim()
teksti = Replace(teksti, "<", "& lt;")
teksti = Replace(teksti, ">", "& gt;")
teksti = Replace(teksti, """", "& quot;")
teksti = Replace(teksti, "'", "& #8217;")
teksti = Replace(teksti, "%", "& #37;")
teksti = Replace(teksti, "&", "& amp;")
teksti = Replace(teksti, "#", "& #35;")
teksti = Replace(teksti, "@", "& #64;")
写完这篇文章后,我意识到它成为了自己的问题。该函数应该使HTML和SQL注入的信息安全(还有其他方法,参数化查询等,但这不是重点)。然而,会发生的是,它首先用<
替换& lt;
,然后再次替换新写入的字符串,因为每个替换字符串都有&amp;,#和;签到它。
任何提示?我考虑过使用正则表达式,但我找不到任何简单的Visual Basic示例。
编辑:感谢您的提示。我确信会有一个“聪明”的简单方法来做到这一点,但我想毕竟没有可用的常用方法。首先重新安排问题案例是明显的解决方案,谢谢你。我想工作日太长了,我无法注意到。 :d
至于参数化查询,请回来查看我看到我的英语不符合预期。我的意思是说我已经在使用它们了,这里的问题是特定的,以防止所有方式的html注入和可能的sql注入后使用相同的字符串。再次感谢您的帮助。
答案 0 :(得分:6)
如果这是.NET,您可能会改为System.Web.HttpServerUtility.HtmlEncode
。
如果你正在使用VBScript / VB6,只需将&符号和井号注册到此列表的顶部,并且不依赖此函数来保护您免受sql注入。您仍然需要参数化查询。
答案 1 :(得分:3)
如果您使用的是VB.NET,那么您正在寻找System.Web.HttpUtility.HtmlEncode(string)。
否则,我会一次遍历字符串中的一个字符并构建一个新的编码字符串,随时替换。这样,你只需要一个字符串传递和每个字符的case语句,你就不会重新编码一个编码字符。
答案 2 :(得分:2)
您可以重新排序以将问题案例放在第一位。 或者你可以遍历字符串并通过依次分析每个字符来构建一个新的字符串,并附加它或者它是所需的替换。 否则你可以使用现成的库/功能,虽然我不熟悉这种语言所以不能命名。
答案 3 :(得分:2)
更换&amp;首先是字符,然后是#字符。之后,其他人可以安全地更换。
但是, 这是防止SQL注入的好方法。这应该优选使用参数化查询来完成。您的代码中有些字符不需要HTML编码,如果您对它们进行编码以防止SQL注入,那么您就处于危险的路径上。它会使SQL注入更难完成,但这不是一种安全的方法。
此外,如果您在将文本放入数据库之前对文本进行编码,则稍后可能会遇到问题。最好将文本保存在数据库中,并在显示文本时处理HTML编码。
答案 4 :(得分:1)
按其他人的建议重新排序。如果您发现两个案例相互冲突且无法通过重新排序解决,请添加如下额外替换:
teksti = teksti.Trim()
teksti = Replace(teksti, "&", "THISISANAMP")
teksti = Replace(teksti, ";", "& #59;")
teksti = Replace(teksti, "#", "& #35;")
teksti = Replace(teksti, "THISISANAMP", "&") ''newly added
teksti = Replace(teksti, "<", "& lt;")
teksti = Replace(teksti, ">", "& gt;")
teksti = Replace(teksti, """", "& quot;")
teksti = Replace(teksti, "'", "& #8217;")
teksti = Replace(teksti, "%", "& #37;")
teksti = Replace(teksti, "@", "& #64;")
这是更改代码的最简单方法。
答案 5 :(得分:1)
像以前的帖子中提到的那样,重新排序“替换”应该可以快速解决您的具体问题,并且建议您同时查看参数化查询。
另一个建议是让你研究用于编码的内置.net库,特别是 Microsoft.Security.Application.AntiXss 库,我发现它比System.Web更好。 HttpUtility.HtmlEncode因为它使用“白名单”方法而不是“黑名单”方法。
您可以找到有关它的更多信息here:
希望这有帮助。
答案 6 :(得分:0)
这对我来说很好:
yourString = HttpUtility.HtmlDecode(yourString)
请确保导入System.Web