Хорошая практика, чтобы получить блок скрипта JS из пользовательского ввода?

Мы работаем с MVC (4,5), и некоторые из наших клиентов требуют, чтобы мы внедрили некоторый код Google Analytics / Facebook пикселей. мы не разбираемся в SEO и поэтому просто берем JS-код, который предоставляют наши клиенты, и внедряем его на своем веб-сайте, который мы размещаем (после быстрого просмотра и проверки кода).

Теперь мы хотим автоматизировать поток, поэтому мы хотели бы создать своего рода CMS-страницу, чтобы администратор (наш клиент) мог опубликовать блок скрипта (свой собственный код аналитики) на наших серверах для автоматической проверки и внедрения в соответствующие представления (mvc)..сеть).

Я подумал о 2 разных способах: 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 ответ

У меня была похожая проблема с CMS, с которой я работал, и клиенты всегда заканчивали тем, что добавляли код JS, который (100%) нарушит ваш код, а затем они будут подавать отчеты об ошибках в вашей системе. Они будут добавлять библиотеки, которые будут мешать вашим библиотекам, фрагменты кода, которые будут напрямую мешать коду, поэтому я настоятельно рекомендую вам избегать этого.

Если вам действительно нужно, то я бы порекомендовал Google Tag Manager в качестве кого-то из уже упомянутых комментариев или удостоверился, что код JS добавлен в пространство имен и обернут чем-то другим, чтобы предотвратить конфликт переменных. Кроме того, добавьте сообщение рядом с областью ввода текста, в которую загружены библиотеки, чтобы они не добавляли их дважды.

Другие вопросы по тегам