2009-07-08 54 views
2

我有一些由用户从模板创建的aspx页面。包括一些字符串替换(点儿用$ {字段名}),所以模板的部分看起来像这样:从模板创建的页面中的字符串替换

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

当从该模板创建一个aspx文件时,$ {标题}得到由取代为用户输入的值。

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

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

回答

1

你可以存储他们的价值观在另一个文件(XML也许)或数据库?这样他们的输入就不会被编译到你的页面中。然后你只需将数据读入变量。然后,所有你必须担心的是你的html编码会处理的html。

0

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

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

+0

你说得对,他们可以插入任一代码或html。 正如我在对其他答案的评论中所说的,我无法将它变成一个变量,所以很难在事后处理它。 此操作将由登录用户完成,而不是公众,因此它可能只是我可以生活的东西。但我希望有一种解决方法,以避免IT员工喋喋不休。 – Clyde 2009-07-08 19:26:38

+0

你不控制将变量应用于模板的代码吗? – 2009-07-09 03:57:09

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> 
+0

我该如何安全地将模板替换文本放入变量“文本”中?这是整个问题! – Clyde 2009-07-08 19:24:01