【问题标题】:string replacement in page created from template从模板创建的页面中的字符串替换
【发布时间】:2009-07-08 18:47:23
【问题描述】:

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

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

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

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

我无法控制模板实例化过程——我需要接受这一点。

【问题讨论】:

    标签: c# asp.net templates string escaping


    【解决方案1】:

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

    【讨论】:

    • 这似乎是唯一可行的方法——值被放入某种保存区域,然后一个单独的进程读取并将其注入到 aspx 模板中。
    【解决方案2】:

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

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

    【讨论】:

    • 你说得对,他们可以插入代码或 html,任一个。正如我对另一个答案的评论一样,我一开始就无法将其放入变量中,因此事后很难处理它。此操作将由登录用户完成,而不是公众,所以它可能只是我可以忍受的事情。但我希望有办法解决这个问题,以避免 IT 人员一蹶不振。
    • 你不控制将变量应用到模板的代码吗?
    【解决方案3】:

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

    尝试使用正则表达式从标题中去除 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>
    

    【讨论】:

    • 我如何安全地将模板替换的文本放入变量“文本”中?这就是问题的全部!
    • 最终用户如何创建模板?为什么你可以在保存而不是显示时过滤内容?
    • 我正在创建模板——我的问题中的代码是我可以控制的代码。他们正在按下一个按钮,上面写着“从模板创建一个新文件”,然后他们会得到一个可以填写“标题”的表格。创建的文件获取模板文件的副本,其中所有 ${} 标记都已替换。
    • 我仍然会处理表单提交,如果可能的话,每次呈现页面时都会这样做。
    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2021-01-05
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多