Как запретить User-Agent: Eureka/1 возвращать исходный код

Приложение ASP.NET Mono MVC 4 использует встроенную MVC4 для объединения и минимизации файлов css и js.

Если строка пользовательского агента в запросе изменена на Eureka/1 с помощью скрипача

User-Agent: Eureka/1

и запрос перевыпускается, клиенту отправляется весь исходный код со всеми комментариями.

Как предотвратить это, чтобы комментарии в исходном коде не могли быть проверены клиентом?

Источник: http://www.codeproject.com/Articles/728146/ASP-NET-MVC-bundles-internals

Я попытался добавить debug='false' к web.config, но проблема не устранена.


person Andrus    schedule 24.02.2014    source источник
comment
Объединение и минимизация — это методы оптимизации, а не меры безопасности. Комментарии действительно проблема для вас?   -  person Damien_The_Unbeliever    schedule 24.02.2014
comment
да. Я хочу никоим образом не разрешать просматривать комментарии в файлах css и js. Как это реализовать?   -  person Andrus    schedule 24.02.2014
comment
@ Андрус, я не знал об этой функции ... Интересно, почему они вообще это туда поместили?   -  person MikeSmithDev    schedule 24.02.2014
comment
Это связано с aspnetoptimization.codeplex.com/workitem/137 и aspnetoptimization.codeplex.com/workitem/136   -  person janv8000    schedule 02.02.2015


Ответы (2)


Мне удалось удалить комментарии, создав классы, наследуемые от IBundleBuilder. Это написано для Microsoft ASP.NET Web Optimization Framework 1.1.3 который был обновлен 20.02.2014:

public class ScriptBundleBuilder : IBundleBuilder
{
    public virtual string BuildBundleContent(Bundle bundle, BundleContext context, IEnumerable<BundleFile> files)
    {
        var content = new StringBuilder();
        foreach (var file in files)
        {
            FileInfo f = new FileInfo(HttpContext.Current.Server.MapPath(file.VirtualFile.VirtualPath));
            Microsoft.Ajax.Utilities.CodeSettings settings = new Microsoft.Ajax.Utilities.CodeSettings();
            settings.RemoveUnneededCode = true;
            settings.StripDebugStatements = true;
            settings.PreserveImportantComments = false;
            settings.TermSemicolons = true;
            var minifier = new Microsoft.Ajax.Utilities.Minifier();
            content.Append(minifier.MinifyJavaScript(Read(f), settings));
        }

        return content.ToString();
    }

    private string Read(FileInfo file)
    {
        using (var r = file.OpenText())
        {
            return r.ReadToEnd();
        }
    }
} 

public class StyleBundleBuilder : IBundleBuilder
{
    public virtual string BuildBundleContent(Bundle bundle, BundleContext context, IEnumerable<BundleFile> files)
    {
        var content = new StringBuilder();
        foreach (var file in files)
        {   
            FileInfo f = new FileInfo(HttpContext.Current.Server.MapPath(file.VirtualFile.VirtualPath));
            Microsoft.Ajax.Utilities.CssSettings settings = new Microsoft.Ajax.Utilities.CssSettings();
            settings.CommentMode = Microsoft.Ajax.Utilities.CssComment.None;
            var minifier = new Microsoft.Ajax.Utilities.Minifier();
            content.Append(minifier.MinifyStyleSheet(Read(f), settings));
        }

        return content.ToString();
    }

    private string Read(FileInfo file)
    {
        using (var r = file.OpenText())
        {
            return r.ReadToEnd();
        }
    }
} 

А затем говорите пакету использовать этот билдер. Этот пример для StyleBundle:

public static void RegisterBundles(BundleCollection bundles)
{
    var bundle = new StyleBundle("~/Content/themes/base/css");
    bundle.Builder = new StyleBundleBuilder();
    bundle.Include("~/Content/themes/base/jquery.ui.core.css",
        "~/Content/themes/base/jquery.ui.resizable.css",
        //etc
        );
    bundles.Add(bundle);

    var scriptBundle = new ScriptBundle("~/bundles/modernizr");
    scriptBundle.Builder = new ScriptBundleBuilder();
    scriptBundle.Include("~/Scripts/modernizr-*");
    bundles.Add(scriptBundle);

    BundleTable.EnableOptimizations = true; //for testing
}

Это было протестировано/подтверждено в Chrome путем изменения пользовательского агента на Eureka/1.0.

По крайней мере, для некоторых предыдущих версий фреймворка веб-оптимизации (я думаю, 1.0 и более ранние) единственным отличием был последний параметр. Таким образом, это будет выглядеть как public virtual string BuildBundleContent(Bundle bundle, BundleContext context, IEnumerable<FileInfo> files) и требует лишь незначительных изменений, чтобы заставить его работать... хотя вам, вероятно, лучше просто обновить.

Что касается этой проблемы, и одна из них возникла в другом недавнем сообщении SO о том, как информация о лицензировании удаляется во время минификации... Я сделал пакет NuGet для решения этих проблем.

person MikeSmithDev    schedule 24.02.2014
comment
Это выводит /* Minification failed. Returning unminified contents. (1,177643): run-time error CSS1062: Expected semicolon or closing curly-brace, found '/' */ для начала мини-файла css. Похоже, минификацию пробовали два раза. Как убрать эту ошибку из вывода? - person Andrus; 25.02.2014
comment
@ Андрус, разве ты не получаешь эту ошибку при обычной минимизации (без использования Builder)? Эта ошибка может произойти при нормальных обстоятельствах в зависимости от ваших таблиц стилей. - person MikeSmithDev; 25.02.2014
comment
Как заставить его работать и с файлами js? Я пробовал Microsoft.Ajax.Utilities.JsSettings settings, но свойство JsSettings не существует - person Andrus; 25.02.2014
comment
@Andrus Хорошо, дай мне секунду, я обновлю для JS, а также для новой версии 1.1.3. Я не смог воспроизвести вашу проблему даже после включения ранее минимизированных файлов. Это может быть проблема с вашими исходными файлами. Иногда обновление пакета оптимизации устраняет эти проблемы. - person MikeSmithDev; 25.02.2014
comment
@Андрус обновлен. Вам нужно будет обновить пакет, а также изменить третий параметр. - person MikeSmithDev; 25.02.2014
comment
Добавление content.Append(";") в конец цикла for исправляет мою ошибку. Ваш код объединяет файлы без добавления разделителя. Возможно, чтобы объединить оба класса в один двумя методами, есть дублирование кода - person Andrus; 25.02.2014
comment
@Andrus Андрус Вы правы насчет разделителя - извините, я не заметил. Я обновил ответ с помощью settings.TermSemicolons = true;, который также исправляет. Что касается дублирования кода, да, этот метод чтения предназначен как для того, чтобы сделать эту копию/вставку для кого-то для сценариев или стилей, так и для централизованного расположения. - person MikeSmithDev; 25.02.2014

Я знаю, что вопрос касается изменения поведения процесса сборки в MVC, но в качестве альтернативы вы можете создать сценарии сборки/развертывания, которые минимизируют ваш CSS/JS перед публикацией. Вы можете использовать некоторые из приложений в этом ответе

person CtrlDot    schedule 24.02.2014