从用户输入获取JS脚本块的好习惯?

时间:2016-07-24 12:19:47

标签: javascript c# asp.net-mvc request-validation dangerous-request

我们与MVC(4,5)合作,我们的一些客户要求我们实施一些谷歌分析/ facebook像素代码。 我们不是搜索引擎优化的专家,所以我们只需要我们客户提供的JS代码,并在我们托管的网站上实现它(在快速查看和检查代码之后)。

现在我们想要自动化流程,所以我们想要创建一种CMS页面,管理员(我们的客户)可以将脚本块(他自己的分析代码)发布到我们的服务器上,以便在相关的情况下进行自动检查和实施观点(mvc .net)。

我想到了两种不同的方式: 1.使用txt / js的文件上传,并使用HttpPostedFileBase和BinaryReader将其解析为字符串。 2.从输入表单中获取脚本作为文本。

商业明智,我们更喜欢方法2.但这似乎更危险。 我将不得不绕过MVC的请求验证,以便让用户将“潜在危险代码”传递给控制器​​。

我还有另一种方法吗? 什么被认为是最终用户获得此类输入的最佳实践? 我确信之前已经完成了。

这是方法#1的代码:

[HttpPost]
public ActionResult AnalitycsCMS(HttpPostedFileBase scriptFile)
{
    if (scriptFile != null && scriptFile.ContentLength > 0)
    {
        // Validate through List of valid extentions and type (strings)
        bool isValidExtention = extentions.Any(item => scriptFile.FileName.EndsWith(item, StringComparison.OrdinalIgnoreCase));
        bool isValidType = types.Any(item => scriptFile.ContentType.EndsWith(item, StringComparison.OrdinalIgnoreCase));

        if (isValidExtention && isValidType)
        {
            // Read bytes from http input stream
            BinaryReader br = new BinaryReader(scriptFile.InputStream);
            byte[] data = br.ReadBytes(scriptFile.ContentLength);

            string result = System.Text.Encoding.UTF8.GetString(data);
            ViewBag.ScriptFile = result;
        }
    }
    return View();
}

1 个答案:

答案 0 :(得分:0)

我遇到过与我合作过的CMS类似的问题,客户总是最终添加JS代码,它会(100%)破坏您的代码,然后他们会针对您的系统提交错误报告。他们将添加会干扰您的库的库,代码片段将直接干扰代码,因此我强烈建议您避免这样做。

如果你真的需要,那么我会建议谷歌标记管理器作为已经提到的评论中的某人,或者确保将JS代码添加到命名空间并用其他东西包装以防止变量冲突。此外,在已加载库的文本输入区域附近添加一条消息,以便他们不会再次添加它们。