我有一个必须从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&x=2</a>
首先执行HtmlEncode,然后调用Linkify:
See <a href="http://example.com/q=1&x=2">http://example.com/q=1&x=2</a>
首先进行Linkify,然后调用HtmlEncode:
See <a href="http://example.com/q=1&x=2">http://example.com/q=1&x=2</a>
我目前使用的解决方案是在正则表达式(linkify)找到的所有匹配项上调用.HtmlDecode(),但它不是100%万无一失,因为有效的URL理论上可以包含类似&
的模式将被解码,但不应该。
答案 0 :(得分:0)
这似乎是一个等待发生的跨站点脚本攻击。
我见过的将用户输入转换为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 < 2, see ",
"<a href=\"http://example.com/q=1&x=2\">http://example.com/q=1&x=2</a>"
}
然后将结果加入到最终结果中。
但是如果您使用用于生成HTML的库,那也许会更好。 Html Agility Pack或ASP.NET,具体取决于您的需求。
答案 2 :(得分:0)
使用正则表达式替换不能执行此操作。您需要通过urlencode运行href属性,并通过htmlencode运行链接文本。