从模板创建的页面中的字符串替换

时间:2009-07-08 18:47:24

标签: c# asp.net templates string escaping

我有一些用户从模板创建的aspx页面。包含一些字符串替换(任意使用$ {fieldname}),因此模板的一部分如下所示:

<% 
  string title = @"${title}";
%>
<title><%=HttpUtility.HtmlEncode(title) %></title>

当从此模板创建aspx文件时,$ {title}将被用户输入的值替换。

但显然他们可以通过关闭输入字符串中的双引号来注入任意HTML。我该如何解决这个问题?我觉得它应该是显而易见的,但我无法想办法解决这个问题。

我无法控制模板实例化过程 - 我需要接受它作为给定的。

3 个答案:

答案 0 :(得分:1)

您可以将其值存储在另一个文件(可能是xml)或数据库中吗?这样他们的输入就不会编译到你的页面中。然后你只需将数据读入变量。然后你需要担心的是html,你的html编码会处理它。

答案 1 :(得分:0)

如果它们的字符串中包含双引号,则不会注入任意HTML,而是任意代码,这更糟糕。

您可以使用正则表达式来过滤输入字符串。我会使用包容性正则表达而不是试图排除危险的字符。只允许它们A-Za-z0-9和空格。

答案 2 :(得分:0)

我不确定我完全理解,但......

尝试使用正则表达式从标题中删除html而不是html编码:

public string StripHTML(string text)
{
    return Regex.Replace(text, @”<(.|\n)*?>”, string.Empty);
}

这可能吗?

<% 
  string title = Regex.Replace(@"${title}", @”<(.|\n)*?>”, string.Empty);
%>

<title><%=HttpUtility.HtmlEncode(System.Text.RegularExpressions.Regex.Replace(title, @"<(.|\n)*?>", string.Empty)) %></title>