【问题标题】:Restricting number of records allowed in a table in a way which can't be subverted以无法颠覆的方式限制表中允许的记录数
【发布时间】:2011-08-05 23:09:44
【问题描述】:

我们有一个 Web 应用程序 (Grails),我们将根据用户数量销售其许可证。数据库(Oracle 10g)中有一个保存用户的表。客户将拥有自己的软件和数据库副本。有人可以建议限制用户表中允许存在的记录数量的策略,这种方式不能被客户合理地颠覆吗?谢谢。

【问题讨论】:

    标签: oracle grails licensing oracle10g


    【解决方案1】:

    您至少应该考虑在这里避免所有技术手段,而是坚持让您的客户签署带有审计条款的 SLSA,然后在这里和那里进行审计。

    所有这些技术手段都会带来失败的风险,从彻底崩溃到神秘的性能问题。越隐蔽和狡猾,虫子就越隐蔽和狡猾。

    【讨论】:

    • 非常有趣的建议@bmargulies,绝对值得考虑。
    • 在协议中,确保您坚持定期 - 每年 - 审核以检查使用情况。这样做可以防止奇怪的副作用,它允许用户成长,什么对用户有益,对你有益,如果你有办法找到这个。审计将起作用。 Oracle 会这样做,它并不总是友好的,但它确实有效。
    【解决方案2】:

    这取决于您对“合理”的定义。如果他们托管数据库,他们将始终能够允许更多行。

    • 最简单的可能解决方案是使用 AFTER STATEMENT 触发器来计算行数,并在插入的行过多时引发异常。当然,他们可以删除或禁用该触发器。另一方面,您的应用程序还可以查询数据字典以验证触发器是否存在并已启用。
    • 您可以通过创建 DDL 触发器来查找影响此触发器或相关表并禁止它们的语句,从而使他们更难删除触发器。这将要求攻击者在删除表上的触发器之前找到并删除该触发器。
    • 您可以交付定期运行的数据库作业(DBMS_SCHEDULERDBMS_JOB),查找语句和 DDL 触发器,如果​​它们丢失,则重新创建它们。攻击者可能会发现有一个数据库作业正在重新创建对象并删除该作业,然后删除 DDL 触发器,然后删除语句触发器。在这项工作中,您可能会向您发送通知(通过电子邮件或 http 或其他方式)提醒您注意该问题,尽管从网络的角度来看这可能很棘手——您客户的防火墙可能不允许来自数据库的出站 HTTP 请求服务器返回到您的服务器。
    • 如果您有一个正在检查的许可证密钥,您可以在该许可证密钥中嵌入允许的用户数,并在登录表期间将其与表中的行数结合起来。

    【讨论】:

    • 谢谢贾斯汀!这些是一些很棒的想法。我将不得不对许可证密钥进行一些研究,您有什么建议的资源吗?
    【解决方案3】:

    如果客户无权修改表定义,您可以对表使用一组简单的约束:

    CREATE TABLE user_table
    (id   NUMBER PRIMARY KEY
    ,name VARCHAR2(100) NOT NULL
    ,rn   NUMBER NOT NULL
    ,CONSTRAINT rn_check CHECK (rn = TRUNC(rn) AND rn BETWEEN 1 AND 30)
    ,CONSTRAINT rn_uk    UNIQUE (rn)
    );
    

    现在,列 rn 必须取 1 到 30 之间的整数值,并且不允许重复:因此,最多可以添加 30 行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多