安全

以下指南包含在开发 Cordova 应用程序时应考虑的一些安全最佳实践。请注意,安全是一个非常复杂的主题,因此本指南并非详尽无遗。如果您认为可以为本指南做出贡献,请随时在 Cordova 的 cordova-docs 存储库中创建拉取请求。本指南旨在适用于一般的 Cordova 开发(所有平台),但会注明特定于平台的特殊注意事项。

本指南讨论以下主题

  • 允许列表
  • Iframe 和回调 ID 机制
  • 证书绑定
  • 自签名证书
  • 加密存储
  • 一般提示
  • 推荐的文章和其他资源

允许列表

默认情况下,应用程序的导航不受限制。建议将导航限制为仅信任的域。阅读允许列表指南了解更多信息。

Iframe 和回调 ID 机制

如果内容从允许列表中的域在 iframe 中提供,则该域将有权访问本机 Cordova 桥。这意味着如果您允许第三方广告网络并通过 iframe 提供这些广告,则恶意广告可能会突破 iframe 并执行恶意操作。因此,除非您控制托管 iframe 内容的服务器,否则通常不应使用 iframe。另请注意,有第三方插件可用于支持广告网络。请注意,此声明不适用于 iOS,它会拦截包括 iframe 连接在内的所有内容。

证书绑定

Cordova 不支持真正的证书绑定。主要障碍是 Android 中缺少用于拦截 SSL 连接以执行服务器证书检查的本机 API。(虽然可以使用 JSSE 在 Java 中在 Android 上进行证书绑定,但 Android 上的 webview 是用 C++ 编写的,服务器连接由 webview 为您处理,因此无法在那里使用 Java 和 JSSE。)由于 Apache Cordova 旨在跨多个平台提供一致的 API,因此在主要平台上不具备此功能会破坏这种一致性。

有一些方法可以近似证书绑定,例如在应用程序启动时或在应用程序生命周期中的其他各个时间检查服务器的公钥(指纹)是否为期望值。有第三方插件可用于 Cordova 来执行此操作。但是,这与真正的证书绑定不同,后者会在每次连接到服务器时自动验证期望值。

还有一些插件可以为某些平台进行真正的证书绑定,前提是您的应用程序能够使用插件执行其所有网络请求(即:没有传统的 XHR/AJAX 请求等)。

使用 TLS/SSL

如果您的应用与外部服务器通信,则应使用现代加密标准进行通信。尽可能使用 https 协议。

Let's Encrypt 是由非营利组织 互联网安全研究组 提供的免费、自动化和开放的证书颁发机构。Let's Encrypt 将提供免费的标准证书,这对于大多数开发人员来说已经足够了。企业组织可能仍然希望使用提供更多高级功能(例如 组织验证 证书)的传统证书颁发机构。

随着安全标准随时间变化,及时了解安全标准也很重要。今天可以接受的 SSL/TLS 配置在未来几年可能不再被接受。应定期使用工具测试您的证书和 SSL/TLS 配置。SSL Labs 是由 Qualys, Inc 提供的免费在线服务,用于测试您服务器的 SSL/TLS 配置和加密强度,以及受支持的平台。

自签名证书

不建议在您的服务器上使用自签名证书。如果您需要 SSL,则强烈建议您的服务器具有由知名的 CA(证书颁发机构)正确签名的证书。无法进行真正的证书绑定使得这一点很重要。

原因是接受自签名证书会绕过证书链验证,这使得设备可以认为任何服务器证书都是有效的。这会使通信容易受到中间人攻击。黑客不仅可以轻松拦截和读取设备与服务器之间的所有通信,还可以修改通信。设备永远不会知道正在发生这种情况,因为它不会验证服务器的证书是否由受信任的 CA 签名。设备没有证据表明服务器是它期望的对象。由于中间人攻击很容易进行,因此接受自签名证书仅比在不受信任的网络上运行 http 而不是 https 略好。是的,流量将被加密,但它可能会被中间人的密钥加密,因此中间人可以访问所有内容,因此除了被动观察者外,加密毫无用处。用户相信 SSL 是安全的,而这会故意使其不安全,因此 SSL 的使用会产生误导。

如果应用程序仅在受信任的网络(例如内部公司网络)中使用。使用自签名证书可能是可以接受的,但是应在将运行该应用程序的设备上预安装公共证书。受信任的第三方证书颁发机构始终是首选。

此处描述的原则并非 Apache Cordova 特有的,它们适用于所有客户端-服务器通信。

在 Android 上运行 Cordova 时,在应用程序清单中使用 android:debuggable="true" 将允许 SSL 错误,例如自签名证书上的证书链验证错误。因此,您可以在此配置中使用自签名证书,但是此配置不应在您的应用程序投入生产时使用。它仅用于应用程序开发期间。

加密存储

(待定)

一般提示

不要使用 Android Gingerbread!

  • 将您的最小目标 sdk 级别设置为高于 10。API 10 是 Gingerbread,而 Gingerbread 不再受 Google 或设备制造商的支持,因此 Cordova 团队不建议使用。
  • Gingerbread 已被证明是不安全的,并且是最受攻击的移动操作系统之一 https://www.mobilemag.com/2012/11/06/andriod-2-3-gingerbread-security/
  • Android 上的允许列表不适用于 Gingerbread 或更低版本。这意味着攻击者可以在 iframe 中加载恶意代码,然后该恶意代码将有权访问所有 Cordova API,并可以使用该访问权限窃取个人数据、向高价号码发送 SMS 消息并执行其他恶意操作。

使用 InAppBrowser 打开外部链接

  • 打开任何外部网站的链接时,请使用 InAppBrowser。这比允许列出域名并将内容直接包含在您的应用程序中要安全得多,因为 InAppBrowser 将使用本机浏览器的安全功能,并且不会让网站访问您的 Cordova 环境。即使您信任第三方网站并将其直接包含在您的应用程序中,该第三方网站也可能会链接到恶意网络内容。

验证所有用户输入

  • 始终验证您的应用程序接受的任何和所有输入。这包括用户名、密码、日期、上传的媒体等。由于攻击者可能会操纵您的 HTML 和 JS 资产(通过反编译您的应用程序或使用 chrome://inspect 等调试工具),因此也应在您的服务器上执行此验证,尤其是在将数据传递给任何后端服务之前。
  • 应验证数据的其他来源:用户文档、联系人、推送通知

不要缓存敏感数据

  • 如果缓存用户名、密码、地理位置信息和其他敏感数据,则未经授权的用户或应用程序可能会在以后检索到这些数据。

除非您知道自己在做什么,否则不要使用 eval()

  • JavaScript 函数 eval() 有着悠久的滥用历史。不正确地使用它可能会使您的代码容易受到注入攻击、调试困难和代码执行速度降低的影响。

不要假设您的源代码是安全的

  • 由于 Cordova 应用程序是由 HTML 和 JavaScript 资产构建的,这些资产被打包在原生容器中,因此您不应认为您的代码是安全的。可以对 Cordova 应用程序进行逆向工程。

推荐的文章和其他资源