对基于客户端的应用程序执行 SaaS 订阅要求

Enforcing Saas subscription requirements for client based apps

我想为 chrome 创建 SaaS 扩展。

当他们的订阅不再有效时,我如何确保他们不能使用我的扩展程序的功能?

我的基本想法是,每当他们想使用我的 chrome 扩展程序的功能时,该扩展程序都会向我的服务器发出 ajax 请求,以检查今天的日期是否早于订阅的结束日期在我的数据库中。

扩展显然是基于客户端的,所以即使我在客户端有代码,只有在我的 ajax 请求 returns 他们有当前订阅时才执行,不能有进取心的人只需查看我的代码并通过控制台 运行 以超过我的 ajax 请求要求的方式?

有没有办法强制订阅?

编辑:

这主要是一个概念性问题,但我会尽量说得更清楚。

我的应用运行所需的所有 javascript 代码都在他们的本地机器上,在他们的源文件中(运行它不需要访问我的数据库)。

所以你可以认为我在他们本地机器上的代码是这样的:

if (usersSubscriptionIsCurrent) {
  runFeature()
}

如果 Ajax 向我的服务器 returns 请求他们的订阅是最新的,则 usersSubscriptionIsCurrent 为真。

有人仍然可以 运行 我的功能,只需查看源代码,然后在他们的控制台中输入 runFeature() 即可。

我想阻止这种情况。

我的扩展程序依赖于将数据从扩展程序发送到相关的 chrome 应用程序,所以我想到我也可以将数据发送到我的服务器,然后服务器可以将数据转发到用户的 chrome 应用程序,如果他们有当前订阅。但是哎呀。

我想得越多,就越觉得我无法预防,但我想我会问问以防万一有人有好主意。

也许最好的解决方案是在扩展开始后立即检查他们的订阅是否最新,然后在订阅结束时使用 chrome management API 卸载或禁用它。

不过,我很想听听更好的想法。

您可以从服务器端获取所需的部分代码。因此,如果用户的订阅结束,他将不会接受 运行 您的功能,因为缺少部分代码。我的想法的概念:

var subscriptionStatusResponse = makeAjaxCall();
if(subscriptionStatusResponse.usersSubscriptionIsCurrent) {
   runFeature_localCode();                  // only part of functional
   subscriptionStatusResponse.remoteCode(); // second part
}

我认为您对什么是 SaaS 有点困惑。 Wikipedia:

Software as a service is a software licensing and delivery model in which software is licensed on a subscription basis and is centrally hosted. SaaS is typically accessed by users using a thin client via a web browser.

强调我的。

如果您的应用程序/扩展程序包含所需的所有逻辑,则它不符合 SaaS 的条件。此外,由于总是可以 copy/dissect 您的应用程序,取消所有许可证检查,您无法保护它免受坚定的攻击者。

有一些方法可以在某种程度上保护您的代码,通过混淆、将逻辑卸载到 (P)NaCl modules, native host modules, or, as Alex Belozerov 、在运行时加载代码。同样,所有这些都可以被坚定的攻击者破坏。

但如果您真正考虑 SaaS(而不仅仅是基于订阅的许可),您的客户端应用程序应该是 瘦客户端:也就是说,您的应用程序逻辑应该是在服务器上处理,代码安全地远离客户端。这是保护它的唯一 "sure" 方式,但会给您带来处理成本,但这正是订阅首先应该涵盖的内容。