Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net HTML编码&;网址_.net_Regex_Escaping_Html Encode_Linkify - Fatal编程技术网

.net HTML编码&;网址

.net HTML编码&;网址,.net,regex,escaping,html-encode,linkify,.net,Regex,Escaping,Html Encode,Linkify,我有一个必须从html代码中删除的输入字符串,因此我使用默认的.Net函数.HtmlEncode()来转义所有危险的字符 现在,我正试图替换输入字符串中的URL,通过正则表达式指向HREF锚 问题是,当我在调用.HtmlEncode()之前“链接”URL时,锚定标记丢失,这是合乎逻辑的。但是当我在调用.HtmlEncode()后执行linkify时,一些url会因为包含危险字符而出现格式错误 这似乎是一个鸡蛋问题,应该如何解决 例如: 输入字符串: 参见http://example.com/q=

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

现在,我正试图替换输入字符串中的URL,通过正则表达式指向HREF锚

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

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

例如:

输入字符串:

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

预期成果:

参见

首先执行HtmlEncode,然后调用Linkify:

参见

首先执行Linkify,然后调用HtmlEncode:

参见
href=”http://example.com/q=1&;x=2“http://example.com/q=1&x=2/a


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

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

我见过的大多数将用户输入转换为HTML标记的方法都使用某种“保留”的自定义非HTML序列来实现这一点,例如,上面的链接在堆栈溢出编辑器中看起来像这样:

[Test link to google.][1]    

  [1]: http://www.google.com
其他富UI界面也有类似的功能。它不是HTML,但被解析后输出为HTML。
我不确定这种方法是否适用于您的情况,但它可能是值得的。通常,除非您信任某人,否则您希望避免让某人将原始HTML输入到您的应用程序中(而且由于您的HTML编码了其中的一部分,看起来您并不真正信任他们)。

您必须以不同的方式对待普通文本和链接。因此,首先将输入分成几个部分:

如果你不相信我说的1<2,请参见http://example.com/q=1&x=2
成为具有两个成员的集合:

{ "If you don't believe me that 1 < 2, see ", "http://example.com/q=1&x=2" }
{“如果你不相信我,请看”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>"
}
{
“如果你不相信我的话12,看”,
""
}
然后将结果合并到最终结果中


但如果您使用用于生成HTML的库,可能会更好。或ASP.NET,具体取决于您的需要。

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

可能包括一个简单的示例?现在还不清楚链接化过程到底需要什么。这个“linkify”regex实用程序是什么?@JeremyStein就是这样一个正则表达式:@Joshua这个例子没有替换部分。这是一个很好的匹配方式,但不足以替换。我将发布一个答案…Linkify函数是一个单一的正则表达式,如果我想使用你的工作,我必须自己编写一个非常复杂的函数来进行链接检测。我不生成HTML,它是来自表单的用户输入,所以我不能使用任何库来生成HTML。我不明白,为什么不能使用库?库是用于解析HTML输入的,所以我不能使用它,因为我的输入是纯文本的,它不应该包含任何HTML。我唯一需要做的就是将(纯文本)链接转换为html锚。我已经允许通过ubb代码使用字体样式和换行符,例如[b]表示粗体,[br]表示换行符,因此我可以只添加[url]作为url的要求,但这只会有助于在纯文本中查找url,而不会阻止HtmlEncode()把事情搞砸;)我可以暂时用Base64之类的代码对它们进行编码,然后执行HtmlEncode,然后将它们反编码回来,但这似乎不是一个合适的解决方案。我在读Drupal的书时发现,有一个伪标准,我称之为“保留的自定义非HTML序列”——BBCode。我快速搜索了.NET BBCode,并得出以下结论:该页面上还有一个标题为“更好的替代方案”的链接,看起来与您正在寻找的解决方案相符。我当前的解决方案是在字符串上运行HtmlEncode(),在HREF上运行RegEx.Replace(),然后在HREF上运行HtmlDecode。这适用于99%的情况,但从理论上讲,有效链接可能包含HTML编码的参数,这些参数不应该被解码。但我以前从未见过这样的URL;)我不理解您如何能够编写代码来识别要调用HtmlDecode的href属性,但您无法编写代码来识别链接并正确处理它们。如果您向我们展示您正在使用的代码,我可能会理解。