1

我遇到了一个问题。编写了以下代码片段:

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;& lt; ,然后再次替换新写入的字符串,因为每个替换字符串都有 &、# 和 ; 签到。

有什么提示吗?我考虑过为此使用正则表达式,但我找不到任何足够简单的像样的 Visual Basic 示例。

编辑:感谢您的提示。我确信会有一种“聪明”的简单方法来做到这一点,但我想毕竟没有可用的通用方法。首先重新安排问题案例是这里明显的解决方案,谢谢。我想工作日太长了,我没有注意到。:D

至于参数化查询,回头看看我发现我的英语没有按预期出现。我的意思是说我已经在使用它们,这里的这个问题是为了防止以后在其他地方使用相同的字符串进行各种 html 注入和可能的 sql 注入。再次感谢您的帮助。

4

7 回答 7

6

如果这是 .NET,您可能会System.Web.HttpServerUtility.HtmlEncode改为查看。

如果您使用的是 VBScript/VB6,只需将 & 和磅符号移到此列表的顶部,并且不要依赖此功能来保护您免受 sql 注入。您仍然需要参数化查询。

于 2009-04-02T13:28:59.460 回答
3

如果您使用的是 VB.NET,您正在寻找System.Web.HttpUtility.HtmlEncode(string)

否则,我将一次遍历字符串一个字符并构建一个新的编码字符串,并在你去的时候替换。这样,您只需要遍历字符串和每个字符的 case 语句,并且您不会重新编码已编码的字符。

于 2009-04-02T13:32:16.910 回答
2

您可以重新排序以将问题案例放在首位。或者您可以遍历字符串并通过依次分析每个字符并附加它或它是所需的替换来构建一个新字符串。否则,您可以为此使用现成的库/函数,尽管我不精通这种语言,所以无法命名。

于 2009-04-02T13:34:16.017 回答
2

先替换 & 字符,然后替换 # 字符。之后,可以安全地更换其他人。

但是,这不是防止 SQL 注入的好方法。最好使用参数化查询来完成。您的代码中有一些字符不需要对 HTML 进行编码,如果您对它们进行编码以防止 SQL 注入,那么您将处于危险的道路上。这将使 SQL 注入更难完成,但这不是一种安全的方法。

此外,如果您在将文本放入数据库之前对其进行编码,则以后可能会遇到问题。最好将文本原封不动地存储在数据库中,并在显示文本时注意 HTML 编码。

于 2009-04-02T13:37:34.477 回答
1

按照其他人的建议重新排序。如果您发现两个相互冲突且无法通过重新排序解决的情况,请添加一个额外的替换,如下所示:

teksti = teksti.Trim()
teksti = Replace(teksti, "&", "THISISANAMP")
teksti = Replace(teksti, ";", "& #59;")
teksti = Replace(teksti, "#", "& #35;")
teksti = Replace(teksti, "THISISANAMP", "&amp;") ''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;")

这是更改代码的最简单方法。

于 2009-04-02T13:36:49.440 回答
1

就像之前的帖子中提到的那样,重新排序“替换”应该可以快速解决您的特定问题,并且非常建议您也查看参数化查询。

另一个建议是让您查看用于编码的内置 .net 库,特别是Microsoft.Security.Application.AntiXss库,我发现它比 System.Web.HttpUtility.HtmlEncode 更好,因为它使用“白名单”方法而不是“黑名单”方法。

您可以在此处找到有关它的更多信息:

希望这可以帮助。

于 2009-04-02T15:02:29.843 回答
0

这对我来说很好:

yourString = HttpUtility.HtmlDecode(yourString)

确保导入System.Web

html字符代码表

于 2018-06-26T11:02:32.923 回答