我有一些用户从模板创建的aspx页面。包含一些字符串替换(任意使用$ {fieldname}),因此模板的一部分如下所示:
<%
string title = @"${title}";
%>
<title><%=HttpUtility.HtmlEncode(title) %></title>
当从此模板创建aspx文件时,$ {title}将被用户输入的值替换。
但显然他们可以通过关闭输入字符串中的双引号来注入任意HTML。我该如何解决这个问题?我觉得它应该是显而易见的,但我无法想办法解决这个问题。
我无法控制模板实例化过程 - 我需要接受它作为给定的。
答案 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>