HTML Encode&网址

时间:2011-10-30 13:18:35

标签: .net regex escaping html-encode linkify

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

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

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

这似乎是一个鸡蛋问题,怎么解决这个?

示例:

输入字符串:

  

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;的模式将被解码,但不应该。

3 个答案:

答案 0 :(得分:0)

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

Test link to google.

我见过的将用户输入转换为HTML标记的大多数方法都使用某种“保留”的自定义非HTML序列来实现这一点,例如,上面的链接在Stack Overflow编辑器中实际上是这样的: / p>

[Test link to google.][1]    

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

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

答案 1 :(得分: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,具体取决于您的需求。

答案 2 :(得分:0)

使用正则表达式替换不能执行此操作。您需要通过urlencode运行href属性,并通过htmlencode运行链接文本。