2011-10-30 62 views
0

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

现在我试图通过正则表达式将输入字符串中的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;

我目前使用的解决方案是在所有地方调用.HtmlDecode()由正则表达式(linkify)发现的ches,但它不是100%万无一失的,因为一个有效的URL理论上可以包含像&amp;这样的模式,它将被解码,但不应该。

+1

也许包含一个简单的例子?目前尚不清楚链接过程究竟需要什么。 – mikey

+0

@mikey我加了一个 – Muis

+0

什么是“linkify”正则表达式工具? –

回答

0

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

Test link to google.

我见过的大多数方法其将用户输入到HTML标记使用某种形式的“保留”定做非HTML序列来实现这一点,例如,上面竟链接看起来是这样的堆栈溢出编辑器:

[Test link to google.][1]  

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

其他丰富的UI界面做类似的事情。它不是HTML,而是被解析并随后以HTML格式输出。 我不确定这种方法是否适用于您的情况,但这可能是值得的。除非你信任它们,否则你通常希望避免给予某人输入原始HTML到你的应用程序的能力(并且因为你的HtmlEncoding有一些,看起来你并不真正相信它们)。

+0

我已经允许通过ubb代码的字体样式和换行符,比如[b]代表粗体,[br]代表中断,所以我可以添加[url]作为URL的要求,但它只会帮助找到纯文本中的URL,而不是用来防止HtmlEncode()将事情搞砸;)我可以暂时使用Base64之类的代码对它们进行编码,执行HtmlEncode,然后将它们解码回去,但它似乎不是一个合适的解决方案。 – Muis

+0

我正在阅读Drupal的书,发现我称之为“保留的自定义非HTML序列” - BBCode存在伪标准。我做了一个.NET BBCode的快速搜索,并提出了以下内容:http://eksith.wordpress.com/2009/01/14/aspnet-bbcode-c/该页面上还有一个链接,标题为“更好的替代方案“看起来正在寻找您正在寻找的解决方案。 – mikey

+0

感谢您的链接! – Muis

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。

+0

Linkify函数是一个RegEx表达式,如果我想使用你的解决方法,我必须为链接检测自己编写一个非常复杂的函数。而且我不生产HTML,它是来自表单的用户输入,所以我不能使用任何库来生成HTML。 – Muis

+0

我不明白,为什么你不能使用图书馆? – svick

+0

该库是用于解析html输入,所以我不能使用它,因为我的输入是纯文本,它不应该包含任何HTML。我需要做的唯一事情就是将(纯文本)链接转换为html锚点。 – Muis

0

你不能用正则表达式替换。您需要通过urlencode和链接文本通过htmlencode运行href属性。

+0

我目前的解决方案是在字符串上运行HtmlEncode(),执行RegEx.Replace(),并在HREF上运行HtmlDecode。这适用于99%的情况,但理论上有可能有效的链接包含HTML编码参数,这些参数不应解码。但我从来没有看到过这样的URL;) – Muis

+0

我不明白你如何编写代码来识别href属性来调用HtmlDecode,但是你无法编写代码来识别链接并正确处理它们。 –

+0

我不认为你明白这个问题... – Muis