假设我正在构建一个“安全”的离线 HTML5 应用程序,它必须在 Web 浏览器中本地运行,而无需从服务器下载更多文件。假设我最初使用 Web 浏览器通过 HTTPS (TLS) 连接到服务器,并下载本地运行所需的 HTML、JavaScript 和 CSS。我可以合理地假设我第一次下载文件是安全的,因为它是一个全新的服务器,其他人还不知道。所有文件都存储在HTML5 Offline Application Cache中。现在我拥有了在本地运行应用程序所需的一切,并且不应该依赖服务器来处理其他任何事情。
现在每次我运行应用程序时,应用程序都会使用 HTML5 Offline Web Application Manifest 查看服务器是否有任何更新以供下载应用程序。这可能是一个问题。如果攻击者现在以我的服务器为目标并对连接进行 MITM 攻击,他们可能会更改应用程序清单,从而触发更新,从而使客户端下载新的 JavaScript 和 HTML。这很容易危及应用程序的安全性,因为应用程序依赖于这些文件的完整性。
有哪些可能的选择来防止这种情况发生?我们可以做任何这些:
1)下载所有文件后,完全禁用或阻止来自服务器的更新。然后,如果在服务器上更改了清单,或者攻击者提供了新的清单,那么客户端会忽略新的清单并继续使用它的本地文件副本。
2)检测清单是否已更改,是否触发了更新事件,或者浏览器是否正在下载新文件。因此通知用户这已经发生。如果用户不期望它,那么它表明攻击。我了解规范中列出了“正在下载”或“更新就绪”或“检查”事件。JavaScript 有没有办法检测到这些事件已被触发?
3)在浏览器的本地存储中存储文件的版本值或加密哈希。然后在页面启动时,如果文件意外更改,我们可以向 Web 浏览器发出警报,通知用户它们已被意外更改。
4)也许使用某种缓存头,迫使浏览器无限期地缓存文件。换句话说,一种使其忽略服务器发送的新清单文件的技巧。这听起来可能会起作用,因为有很多问题会导致应用程序即使在清单文件更改时也不会更新。
先感谢您。