发现缓存SSL页面,捆绑和缩小

我们有一个MVC应用程序,使用IBM应用程序扫描由第三方公司扫描安全问题。 问题是,例如,由于捆绑和缩小导致出现多个问题

在这里输入图像描述

整个观点是捆绑和缩小会缓存你的样式表和JavaScript文件。 不幸的是,如果不解决这些问题,我们不会签字。 有关我们如何克服这个问题的想法?


不幸的是,客户端不会接受他的CSS和JavaScript文件被缓存的事实,并要求禁用所有缓存,从而解决了所有问题。

为了达到这个目的,我在Global.asax文件中添加了以下方法,以禁止对服务器发出的每个请求进行缓存。

protected void Application_BeginRequest()
{
    HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Cache.SetNoStore();
    Response.Cache.SetExpires(DateTime.Now);
    Response.Cache.SetValidUntilExpires(true);
}

这将在响应标题中添加Cache-Control: no-storePragma: no-cache 。 以下是使用Fidler的标题图片

请注意,捆绑和缩小仍然使用,但文件不会被缓存。 请谨慎使用此路线,因为上述缓存将针对整个应用程序关闭。


您可以查看包变换。 这不是一个复杂的过程,并且不需要为整个应用程序禁用浏览器缓存。 缺点是它不会给你太多的响应控制,尽管它可以让你选择禁用浏览器缓存。

请注意,使用这种方法,您只能将缓存控制设置为no-cache并且不能将其设置为no-store 。 所以我不确定你的客户是否会接受! (如果这没有帮助,可能值得关注捆绑转换的新功能,因为他们打算根据此SO响应提供对缓存标头的更多控制)

如果您认为这足够了,那么首先创建一个实现IBundleTransform的新变换DisableCacheOverHttpsTransform 。 该转换将检查当前请求是否通过安全连接,在这种情况下,它将禁用该软件包的浏览器缓存:

public class DisableCacheOverHttpsTransform : IBundleTransform
{
    public void Process(BundleContext context, BundleResponse response)
    {
        if (context.HttpContext.Request.IsSecureConnection)
        {
            //disable cache on https
            response.Cacheability = HttpCacheability.NoCache;
        }
    }
}

现在,您只需确保您的脚本和CSS捆绑包使用此转换。 您可以使用此代码将此转换添加到所有包(这应该在RegisterBundles(BundleCollection bundles)方法的末尾):

public static void RegisterBundles(BundleCollection bundles)
{
    ...

    //Discomment to try bundling in debug
    //BundleTable.EnableOptimizations = true;

    var transform = new DisableCacheOverHttpsTransform();
    foreach (var bundle in bundles)
    {
        bundle.Transforms.Add(transform);
    }
}

通过这些更改,当您的应用程序通过https运行时,脚本和css捆绑包的响应将包括标头Cache-Control:no-cachePragma:no-cache

希望能帮助到你!


我使用了类似的方法。 但是,这些细微差别允许客户端和服务器缓存,同时停止任何代理缓存。 这似乎是AppScan和Developer的中间立场。

    Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
    Response.Cache.SetRevalidation(HttpCacheRevalidation.ProxyCaches);
    Response.Cache.SetExpires(DateTime.Now);
    Response.Cache.SetNoStore();
    Response.Cache.SetMaxAge(new TimeSpan(0, 0, 30));
    Response.AppendHeader("Pragma", "no-cache");
链接地址: http://www.djcxy.com/p/22111.html

上一篇: Cacheable SSL page found, Bundling and Minification

下一篇: Text input box not accepting input in modal from Angular UI Bootstrap