以下是该方案。目前,我们正在将磁盘上的Razor模板存储为多租户CMS系统。我们需要多租户系统中的管理员能够上传他们自己的网站模板( layouts ),但这样做我们需要确保他们不会包含任何可能有害的剃刀标记。
实际上,我们希望能够编码任何可能包含在客户端模板中的Razor语法。
提案:
允许管理员使用安全模板系统上传使用已批准的代码修饰的模板,例如dotliquid。
在上传时,首先用“@@”替换所有“@”符号,以逃避任何潜在的Razor语法。接下来,将已批准的标签替换为相应的Razor标记,并将模板保存在数据库中。
加载页面将使用自定义 VirtualPathProvider - 超出此问题的范围......
问题
我的测试显示,使用另一个“@”符号转义所有“@”符号将通过转义任何Razor语法来清理模板。但我很想听听那些可能对这个主题有更深入了解的人。
答案 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);
}