【问题标题】:Is there any reason I shouldn't precompile JSP pages?有什么理由我不应该预编译 JSP 页面?
【发布时间】:2016-02-20 16:30:55
【问题描述】:

我对 JSP 技术的理解是,服务器必须将 JSP 翻译成 servlet,并在第一次请求 JSP 时对其进行编译。我正在使用的服务器(IBM Websphere)在部署期间有一个选项可以“预编译 JSP 页面”。默认情况下,此选项处于禁用状态。

由于无论如何都必须在某个时候执行此 JSP 编译,因此在部署时执行此操作似乎无疑更好,因为它不会影响用户交互(由于页面加载时间较长)。当然,这种编译只会发生在第一个用户访问该页面,但仍然......

有什么理由我不应该在 Websphere(或任何 Java 服务器)上预编译 JSP?为什么会默认禁用?

【问题讨论】:

  • 它很可能在默认情况下被禁用,因为在开发过程中,每次部署以测试小的更改时,都需要花费太多时间来预编译每个 JSP。对于生产来说,预编译确实是个好主意。如果其中一个 JSP 无法编译,这也将允许快速失败,而不是等待第一个用户最终出现在页面上并抱怨。
  • 部署需要更长的时间...
  • 而且你有时可以在部署前预编译:chaitpress.com/2010/10/28/how-to-pre-complie-jsps-in-weblogic

标签: java jsp server websphere


【解决方案1】:

由于这已经持续了三年没有人提及安全,请允许我提及安全。

预编译您的 JSP,将类文件放入 JAR,对所有 JAR 进行签名,并制定安全策略,要求对应用程序逻辑进行代码签名。

按需编译 JSP 的 Web 服务器容易受到代码注入攻击。如果攻击者可以将 JSP 放到服务器上,服务器将对其进行编译并将其逻辑添加到应用程序中。预编译 JSP 并在生产服务器上禁用按需编译可以防止有人这样做。它还允许您拥有一个更安全的服务器,因为该服务器不需要编译 Java,只需运行它即可。您没有将开发工具放在您的服务器上。

现在,在有人插嘴说“嘿,如果您可以将 JSP 放在目标服务器上,那么是什么阻止您将恶意编译代码放在那里?”让我来解决这个问题。

使用 JSP 作为攻击媒介的一个好处是,通常有一种直接的方法可以触发 JSP 中任何逻辑的执行。也可以将代码添加到现有 JSP 以将其用作执行挂钩。使用 JAR 中的代码更难(但并非不可能)。

使恶意 JAR不可能执行的是 JAR 签名。如果您的 JVM 配置为仅运行已签名的 JAR(就应用程序代码而言),则上传的类和 JAR 文件将不会在 JVM 中执行。

解决安全问题的最佳时间是在部署应用程序之前,而不是在泄露 1.43 亿人的个人数据之后。只是说说而已。

* 至少从 2003 年开始,我就一直在指出这一点,到目前为止,没有人真正听取过这个建议。我仍然把它放在那里**。

** 自 2011 年以来,我的所有应用程序都没有使用过 JSP,所以这对我来说已经有一段时间了。

【讨论】:

    【解决方案2】:

    对此我不确定。到目前为止,我还不是 JBOSS 大师,但我认为如果您考虑其中的原因,这可能是一个权衡问题。我想如果你预编译你的页面,这个过程将需要一些时间。而如果你只是在点击页面时编译它们,那么随着时间的推移,这将分散工作,因为每个页面只有在它被调用时才会被编译。

    不同之处在于,并非所有页面都需要在一种情况下进行编译,以便应用程序更快地启动,但您需要的页面必须在生成响应之前进行编译。

    这可能产生最大差异的地方在于开发,因为您只编译按需编译时实际要访问的页面。这样,您的应用程序编译速度更快,部署速度更快,您的编译调试重构周期加快。

    在现实世界中,对于生产部署,您可能总是希望预编译所有 jsp 文件。

    【讨论】:

    • 成为 JBoss 大师并没有多大帮助,因为问题是关于 Websphere :-)
    【解决方案3】:

    我提前预编译所有 JSP 页面的原因是为了捕捉任何编译错误。通常,您的 IDE 会告诉您页面中的错误,但包含无数 sn-ps 的大型项目可能会混淆或减慢 IDE,从而导致您关闭 JSP 验证。

    我宁愿稍微增加编译时间,只是为了进行错误检查。如果您使用 Maven,我建议使用 jspc-maven-plugin 之类的东西;如果您更喜欢 Ant,我建议使用 jspc 任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 2018-03-22
      • 2016-08-31
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多