在模板中清理Razor语法以用作布局

时间:2013-06-10 14:11:54

标签: asp.net-mvc razor content-management-system code-injection

以下是该方案。目前,我们正在将磁盘上的Razor模板存储为多租户CMS系统。我们需要多租户系统中的管理员能够上传他们自己的网站模板 layouts ),但这样做我们需要确保他们不会包含任何可能有害的剃刀标记。

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

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

问题

  1. 如果我只是用“@@”替换所有“@”符号,那么这会有效地“编码”模板中可能存在的所有剃刀标记吗?
  2. 如果模板包含合法的“@”符号,如电子邮件地址或推文句柄,是否有任何疑虑?我的初步测试显示双逃生有效。
  3. 更新

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

1 个答案:

答案 0 :(得分:-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);
}