0

我有一个必须从 html 代码中删除的输入字符串,所以我使用默认的 .Net 函数 .HtmlEncode() 来转义所有危险字符。

现在我正在尝试通过正则表达式将输入字符串中的 URL 替换为 HREF 锚点。

问题是,当我在调用 .HtmlEncode() 之前“链接”URL 时,锚标记会丢失,这是合乎逻辑的。但是当我在调用 .HtmlEncode() 之后进行链接时,某些 url 会因为包含危险字符而格式错误?

这似乎是一个鸡蛋问题,应该如何解决这个问题?

例子:

输入字符串:

See http://example.com/q=1&x=2

预期结果:

See <a href="http://example.com/q=1&x=2">http://example.com/q=1&amp;x=2</a>

先做HtmlEncode,之后调用Linkify:

See <a href="http://example.com/q=1&amp;x=2">http://example.com/q=1&amp;x=2</a>

先做Linkify,之后调用HtmlEncode:

See &lt;a href=&quot;http://example.com/q=1&amp;x=2&quot;&gt;http://example.com/q=1&amp;x=2&lt;/a&gt;

我目前使用的解决方案是对正则表达式 (linkify) 找到的所有匹配项调用 .HtmlDecode(),但这不是 100% 万无一失的,因为理论上有效的 URL 可以包含&amp;将被解码的模式,但不应该.

4

3 回答 3

0

你不能用正则表达式替换来做到这一点。您需要通过 urlencode 运行 href 属性,并通过 htmlencode 运行链接文本。

于 2011-11-10T18:49:29.953 回答
0

这似乎是等待发生的跨站点脚本攻击。

测试链接到谷歌。

我见过的将用户输入转换为 HTML 标记的大多数方法都使用某种“保留”的自定义非 HTML 序列来完成此操作,例如,上面的链接在 Stack Overflow 编辑器中实际上如下所示:

[Test link to google.][1]    

  [1]: http://www.google.com

其他丰富的 UI 界面也做类似的事情。它不是 HTML,但会被解析并稍后输出为 HTML。我不确定这种方法是否适用于您的情况,但它可能是值得的。您通常希望避免让某人能够将原始 HTML 输入到您的应用程序中,除非您信任他们(并且由于您的 HtmlEncoding 其中一些,看起来您并不真正信任他们)。

于 2011-10-30T13:23:36.397 回答
0

您必须区别对待普通文本和链接。因此,首先将输入分成几部分:

If you don't believe me that 1 < 2, see http://example.com/q=1&x=2

变成一个有两个成员的集合:

{ "If you don't believe me that 1 < 2, see ", "http://example.com/q=1&x=2" }

您对第一个进行编码并从第二个创建链接,仅对链接的文本进行编码:

{
    "If you don't believe me that 1 &lt; 2, see ",
    "<a href=\"http://example.com/q=1&x=2\">http://example.com/q=1&amp;x=2</a>"
}

然后,您将结果加入到最终结果中。

但是,如果您使用用于生成 HTML 的库,也许会更好。Html Agility Pack或 ASP.NET,取决于您的需要。

于 2011-10-30T13:54:14.413 回答