代码之家  ›  专栏  ›  技术社区  ›  teedyay

ASP.NET应用程序中需要定时炸弹

  •  17
  • teedyay  · 技术社区  · 15 年前

    我们开发了一个定制的ASP.NET应用程序,用于客户的内部网。 看来他们不太可能付钱,所以我们的老板希望我们引进定时炸弹。

    [编辑:]对于ceooverflow.com来说,这是一个好的(还是合法的)想法是一个问题 ;-)

    应用程序中的所有页面都继承了一个名为applicationbasepage的类,并且具有一致的错误处理,因此我认为在applicationbasepage生命周期的早期抛出异常是使应用程序不可用的一种简单方法。不过,我愿意接受你可能有的其他想法。

    我的问题是: 我们应该如何以及在何处存储应用程序过期的日期?

    需要注意的几点:

    • 应用程序安装在客户办公室的单个服务器上。
    • 应用程序数据保存在同一服务器上的SQL Server 2005数据库中。这个数据库是我们设计的,不用于任何其他用途。
    • 应用程序只能在其内部网上访问:无法通过Internet访问应用程序。
    • 我们目前对他们的服务器有远程桌面访问,但如果事情变得糟糕,我们会失去这一点。
    • 应用程序是用.NET 2.0编写的。
    • 安全性由FormsAuthentication处理。
    • 我们需要能够很容易地关闭定时炸弹或改变它的触发日期(假设我们仍然有远程桌面访问来完成这项工作)。
    • 服务器通常可以访问Internet,但最好不要依赖它。
    • 定时炸弹只能锁定用户:它不会破坏任何数据。
    • 除非触发,否则客户决不能意识到定时炸弹的存在。
    • 他们的IT人员会很高兴地在web.config或数据库中四处搜索。他不是一个程序员,但他不害怕改变事情“只是为了看看会发生什么”。反编译或逆向工程的应用程序将超出他的能力。

    对于额外的信贷,您认为在这种情况下,通过默默无闻来依赖安全性可以有多大?

    [ 编辑: ]

    • 这个应用程序做了很多与业务相关的数据相关的工作,所以我们可以确保他们不会更改服务器上的时钟,因为这会使应用程序变得比无用更糟糕。
    23 回复  |  直到 15 年前
        1
  •  45
  •   nailitdown    15 年前

    “他们看起来不太可能付钱,所以我们的老板希望我们引进定时炸弹。”

    一个不称职的商人要求你为一个商业问题实施一个技术解决方案。如果你的客户不愿意付钱,你的老板应该像个成年人一样处理这种情况,而不是像高中黑客那样胡乱摆弄逻辑炸弹。

    这是不道德的,可能是非法的,但大部分都是愚蠢的。

        2
  •  14
  •   Rune Grimstad    15 年前

    我同意将其称为试用版并让其过期的意见。在我们的一个产品Web发布系统中,我们有一个公共页面类,用于检查用户许可证密钥,如果它无效,我们将在所有页面的顶部打印一条消息。消息非常可见,但不会影响程序的工作方式。

    为了进行检查,我们在web.config文件中存储了一个“注册密钥”。我们将其与我们计算的密钥进行比较,计算密钥的算法存储在单独的程序集中。如果密钥匹配,我们假设产品已获得许可。

    对于我们的使用,我们只向注册密钥计算算法提供客户名称,但您可能需要添加版本号或其他日期。然后,通过计算所提供名称的MD5散列值和一个secred代码(数组中的一些随机字节)来生成注册密钥。

    这绝不是简单的,也不是非常可靠的,但它很简单,已经足够我们使用了。

        3
  •  9
  •   Nikhil    15 年前

    这是我能想到的一些事情

    1. 设置一个逻辑炸弹,它取决于您的一个登录人员,所以在最后一个登录应用程序关闭的特定天数内。
    2. 使用基于日期的锁定并将日期存储在SQL Server的表中。但是使用标准算法加密存储的值,该算法使用代码中隐藏的salt。这样可以避免向系统管理员公开日期。
    3. 使用上面的方法,存储一个大的整数值,应用程序加载到IIS后立即从中倒计时-一旦达到零,请删除数据库中的值并锁定应用程序-您必须使用加密重置该值,才能使其再次工作。
    4. 默默无闻的安全是可以的,如果这个应用程序,但如果你想把它作为一个产品上市,那么你需要某种加密。

    但这些都不是万无一失的…
    免责声明:我不是任何类型的法律专家-我只是从技术角度回答这个问题。我个人不会这么做,因为我认为这在道德上是模棱两可的。

        4
  •  6
  •   Alex Zuroff    15 年前

    我真的看不出任何结局会好起来的情况。如果你担心被支付(而且他们可能担心在应用交付之前支付),那么建立某种契约怎么样?他们把这笔钱和双方同意的释放这笔钱的条款放在第三方,然后你继续工作,知道这笔钱已经被留出,直到你完成。

        5
  •  6
  •   blowdart    15 年前

    抛开道德问题不谈,如果您担心序列号实现被黑客攻击,为什么不使用X509证书?例如,如果安装了证书服务器的Windows设备,则可以在Internet上显示证书吊销列表。

    向每个客户机颁发一个客户机标识证书(如果您向中央服务器提供更新检查,则会有额外的好处—现在您可以使用客户机/服务器HTTPS而不必担心密码)。

    如果客户不付款,则吊销证书。在应用程序启动中,只需加载证书并检查其有效性…

        6
  •  6
  •   teedyay    15 年前

    谢谢你的回复!

    我们并没有完全按照任何一个人的建议去做,而是使用了你们中的一些人的想法。

    首先,我们不再称之为定时炸弹,而是称之为执照。由于软件目前(可以说)不完整,而且客户还没有支付费用,我们可以称之为过期的测试版本。这(很可能)使我们越过了大部分合法的雷区,并且(正如zsharp指出的那样)如果他们声称产品不合格,如果他们不能使用它,他们就不能真正抱怨。

    无论如何,技术实现是这样的:

    我们希望有效期隐藏在不会被偶然发现的地方,如果被发现的话,它的形式是不容易修改的。它也必须在某个我们可以确定不会无意中受到影响的地方,即使它在一个我们无法完全控制的服务器上。

    因此,我们对到期日期进行了加密,并将其放在应用程序使用的数据库的扩展属性中,给它起了一个适当的误导性名称。

    应用程序在启动时检查密钥,如果应用程序未过期,则将静态布尔标志设置为true。站点中的每个页面都会检查此标志,如果该标志为假,则会将用户跳转到错误页面。

    我们对这个解决方案很满意,原因如下:

    • 我们很容易更改申请的有效期。
    • 不依赖于互联网的可访问性,也不依赖于服务器之外的任何其他功能。
    • 保护将在备份和还原或将应用程序移动到另一个框后继续存在。

    当争论停止时,他们已经付钱给我们,我们又是朋友了,他们的应用程序的下一次升级根本没有签入,确保这个被遗忘的代码不会在几年后意外触发(谢谢,克里斯汀!).

        7
  •  5
  •   Coxy    15 年前

    他们的网络服务器可以访问互联网吗?除了其他方法外,您可能还希望使用Web服务触发定时炸弹,因为狡猾的系统管理员可能愿意将服务器上的时钟设置回几年后。

        8
  •  5
  •   Dscoduc    15 年前

    需要考虑的几点:

    这是否合法?假设你不打算透露这个复活节彩蛋, 除非触发,否则客户决不能知道定时炸弹的存在 “,你可能会遇到一些法律问题……

    如果客户有权访问源代码,那么我无法想象您如何包括他们无法雇佣开发人员删除的任何内容。即使IT人员不是开发人员,也不超出他们雇佣其他开发人员对代码进行反向工程的能力。

    最后,坏业…如果你真的在和一个你认为不值得信任的客户合作,那为什么还要和他们合作呢?我希望你能把所有事情都摆在桌面上,在执行工作之前得到客户的充分承诺。如果客户不肯承诺付款,我就走了。

        9
  •  5
  •   Michael Stum    15 年前

    如果客户拥有所有的软件,您就不能完全阻止它。

    唯一正确的方法是使应用程序依赖于您所拥有的某个组件,例如,它可能需要在一段时间后激活,或者对Web服务器执行ping操作。

    这可以通过获取安装日期并将其用作某种salt/加密密钥并用它加密所有数据来实现。然后您可以将其与安装日期进行比较。如果客户使用它(设置时钟),您将注意到它,因为您有原始安装日期。如果更改日期,也会更改加密密钥,因此无法再解密数据。

    还有一种方法可以解决这个问题,但是对于任何基于时间的解决方案,您无论如何都需要将安装日期作为比较的基础,并且您需要确保这个修补程序的安全性,因此可以使用某种加密来保护所有数据。

        10
  •  4
  •   unbeknown    15 年前

    这听起来像是律师的工作。

    除此之外,我将使用一个包含到期日期的简单配置文件。然后在配置文件中存储该日期的RSA加密哈希。如果更新到期日期,则只需更新 加密的哈希也是。应用程序定期读取日期,并使用公共RSA密钥解密哈希,然后检查哈希。如果他们修补日期、加密哈希或公钥,那么应用程序将停止工作。

        11
  •  4
  •   Kristen    15 年前

    两个想法:

    1)我会在他们付钱之前或者在他们把钱存入托管账户之前,在他们的非现场托管他们的申请。如果他们说它不起作用,也不付钱,那么他们不会介意你在整理协议时关闭访问,是吗?!

    2)我们以前也做过类似的工作。我们花了更多的时间来考虑任何可能的“定时炸弹”是如何100%防弹的,这样它就不会在截止日期前或在“断开保险丝”后的某个时间意外爆炸。例如,实际删除代码可能更好,而不是将标志从“试用”更改为“无限使用”

        12
  •  3
  •   Robert    15 年前

    不要把你的名字放在你做的任何事情的周围,删除所有已有的注释中有你的名字。如果它是合法的,而且你的名字在程序中,你的老板可以很容易地把你扔到车下,说他与此无关。我会认真考虑遵循这个方向。我知道这是管理层的决定,但如果你做的工作很容易回来咬你。

        13
  •  3
  •   zsharp    15 年前

    我不是律师,但我的观点是: 如果他们声称这个程序不起作用,而且不能使用,那么他们以后就不能说它“起作用更小”,并要求你承担损害赔偿责任,除非他们已经为所起的作用支付了部分款项。

    在你尝试这里的任何建议之前,我会收到他们的书面投诉。(我想补充一下,“免费试用”路线似乎最安全)

        14
  •  2
  •   maayank    15 年前

    如果你想把日期放在服务器上而不是互联网上,那么看起来只有暗箱操作才能保证安全。 不过,这是明智的——您不希望应用程序每次启动时都在互联网上进行检查,当互联网连接不好时就会死掉。

    最简单的方法是将程序集中的日期保存为变量。 如果您害怕简单的反编译,请加密它并将密钥存储在程序集中。 如果您想在将来更改日期,请将其存储在db/web.config中(当然是加密的)。 对于加密,您可以使用从base64到公钥加密的任何方法。 显然,这不会妨碍代码的严重反编译…但这对初学者来说是好事。

    旁注,“逻辑炸弹”也会提醒你剑鱼吗?

        15
  •  2
  •   Tequila Jinx    15 年前

    故意引入这样的“定时炸弹”当然是违法的。你的老板不是第一个考虑此事的人,也不会是最后一个。他最好的办法是在付款之前停止生产实施。

        16
  •  2
  •   Ken White    15 年前

    你可能想警告你的老板,如果他的客户遭受任何金钱损失(包括客户损失),你的公司将承担损失,可能还会受到惩罚,再加上你公司的法律费用。而且,如果公司在诉讼和和解中未能幸免,你将失业。

    如果我是你,我会三思而后行。

        17
  •  1
  •   paul    15 年前

    像这里的很多人一样,我会说不要这样做。我不知道这是不是非法的,但感觉不太对劲。业务必须以信任为基础,公开讨论必须优先于此类计划。

    如果必要的话,谈谈你的顾虑,冻结开发——我想他们毕竟想要这个产品!

        18
  •  1
  •   DevinB    15 年前

    这是相当粗心大意的,但您可以编写一个执行一个程序的计划任务,该程序会盐化所有密码。 它不会破坏任何数据,只要您有权限,就可以禁用计划任务。 另外,如果你想把信息反馈给他们的地方发生了什么事情,那就跟不说一样简单……脱盐…密码。

    和其他许多人一样,我对实际执行这一点持保留意见。

        19
  •  1
  •   Astra    15 年前

    我将在您存储在bin目录中的编译dll中实现某种方法。称之为 timebomb.dll .

    然后,您应该在该dll中有一个返回true或false的方法:

    public bool hasTimeExpired() {
      //Pseudocode
      DateTime expires = new DateTime(Janurary 10, 2009);
      return ( DateTime.Now() >= expires );
    }
    

    只需在应用程序启动时检查hastimeexpired()方法(global.ascx??)或在某些代码页上,取决于您希望如何处理过期消息。

    当您想关闭定时炸弹或延长时间时,bin目录中的dll很容易替换为新的编译版本。它必须进行反编译,才能确定到期日期,如果他们发现它是如何工作的,就很容易绕过它,但是正如您所说,有问题的管理员可能不会这样做。

    除此之外,你真的需要和律师一起工作,但是有时候像这样一个借来的软件的锁比律师更有效,更便宜。

        20
  •  1
  •   Don Branson marios    15 年前

    我不能谈法律问题。

    从技术上讲,我想你能做到。制作一个密钥对,并使用私钥加密一个有过期日期的文件。您的应用程序将使用一个公钥来解密到期日期为的文件。每次程序运行时,都会突出显示“许可证到期前还剩57天”。这样,他们就会不断地发出警告,说应用程序会停止工作。

    至于在到期后破坏任何数据,我不会这样做。我想我会加密数据中需要应用程序解密的一些密钥项。

    但是,要绕过一个系统管理员来设置时钟是很困难的。但是,如果它有一个网络连接,你可以让它“打电话回家”,以获得钥匙,如果它不能得到它根本不工作。

        21
  •  0
  •   Stefan    15 年前

    将一些逻辑移动到您自己服务器上的WebService。 让客户应用程序依赖于该Web服务。 有一个很好的理由来改变这种逻辑,比如“它是我们的核心业务,所以我们需要控制它”,把这种改变作为程序“新版本”的一部分。

    用一个新的部分与客户续签合同,该部分告诉他们如果不付款,您的Web服务将断开连接。

    如果他们不想签署合同,他们不想和你做生意,你可以为他们断开网络服务,如果他们签署,他们同意新的条款。

    这确实是唯一的方法,如果你想确保他们不能使用它,如果没有支付。否则你就得继续起诉他们或那样的威胁。

        22
  •  0
  •   annakata    15 年前

    技术问题由程序员处理,业务问题由律师处理。你的老板需要使用合适的工具来完成这项工作。

        23
  •  0
  •   Peter Mortensen Sumit Kumar    15 年前

    执行防病毒路由,拨打外部电话进行“更新”。如果你没有得到更新,如果他们不付费,应用程序就停止工作,停止给他们更新。

    我认为这是解决这个问题的错误方法,但我理解你的工作是按照别人的要求去做。