4

这是场景。目前,我们将 Razor 模板存储在磁盘上,用于多租户 CMS 系统。我们需要多租户系统中的管理员能够上传他们自己的网站模板布局),但在这样做时,我们需要确保它们不会包含任何可能有害的 Razor 标记。

实际上,我们希望能够对可能包含在客户端模板中的任何 Razor 语法进行编码。

提议:允许管理员使用安全的模板系统(如dotliquid
)上传带有批准标签的模板。 上传时,首先将所有“@”符号替换为“@@”,以避开任何潜在的 Razor 语法。接下来,用适当的 Razor 标记替换已批准的标签,并将模板保存在数据库中。 加载页面将使用自定义VirtualPathProvider - 超出此问题的范围......

问题

  1. 如果我简单地将所有“@”符号替换为“@@”,是否会有效地“编码”模板中可能存在的所有剃刀标记?
  2. 如果模板包含合法的“@”符号,例如在电子邮件地址或 Twitter 句柄中,是否有任何顾虑?我最初的测试表明双重转义有效。

更新

我的测试表明,用另一个“@”符号转义所有“@”符号将通过转义任何 Razor 语法来清理模板。但我很想听听可能对该主题有更深入了解的人的来信。

4

1 回答 1

-1

1)编写一个函数来用@注入剃刀代码以防止剃刀注入是一种hacky解决方案。这就像在烧焦的布朗尼上添加糖霜以使其味道更好。为什么不首先阻止它呢?

相反,请在相应的视图中尝试:

<%=Html.Encode(feedback.Message)%>

或添加

<text> ... </text> 

在输入成为过程之前。

2)如果你能保证它是一个合法的电子邮件地址,那就没问题了。但这很难保证。因此,我建议您使用 JavaScript 正则表达式进行简单但有效的电子邮件验证。这是一个布尔函数,您可以将其放入 JavaScript 以验证电子邮件(此正则表达式的成功率约为 95%):

function isValidEmailAddress(emailAddress) 
{    
    var emailPattern = new RegExp(/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i);
    return emailPattern.test(emailAddress);
}
于 2013-07-10T21:01:18.637 回答