Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 这是创建审计跟踪的最佳方法吗?_Php_Mysql_Audit - Fatal编程技术网

Php 这是创建审计跟踪的最佳方法吗?

Php 这是创建审计跟踪的最佳方法吗?,php,mysql,audit,Php,Mysql,Audit,我正在尝试创建一些功能,以保持对给定用户表单中的数据如何随时间变化的审计跟踪,并在该页面的底部添加一个日期审计。例如: 02/04/09 21:49名字从“汤姆”改为“克里斯” 我这样做是通过在会话中以当前格式存储数据,然后在保存时检查所存储的数据是否存在任何差异。如果有的话,我将数据存储在一个名为history的表中,并将新值存储在当前用户表中 这是最好的方法吗?会话的参与让我有点担心(当两个用户同时处理同一数据时,你确定你处理得正确吗?),但一般来说,是的,保留历史记录表是正确的;这在数据库

我正在尝试创建一些功能,以保持对给定用户表单中的数据如何随时间变化的审计跟踪,并在该页面的底部添加一个日期审计。例如:

02/04/09 21:49名字从“汤姆”改为“克里斯”

我这样做是通过在会话中以当前格式存储数据,然后在保存时检查所存储的数据是否存在任何差异。如果有的话,我将数据存储在一个名为history的表中,并将新值存储在当前用户表中


这是最好的方法吗?

会话的参与让我有点担心(当两个用户同时处理同一数据时,你确定你处理得正确吗?),但一般来说,是的,保留历史记录表是正确的;这在数据库触发器中相对容易实现。在这种情况下,您将永远不必担心运行更新的代码是否记得添加历史记录。

我还将考虑在插入或更新时使用数据库触发器将更改详细信息(谁、何时、什么、之前的值、之后的值)记录到单独的审核表中。这样,您就知道,即使直接使用数据库在应用程序外更改数据,数据仍然会被提取


您可能还想做一些事情来检测数据是否在应用程序外更改,例如计算记录的哈希或crc并将其存储在某个字段中,然后在读取数据时进行检查。

我一直喜欢使用一个表,而不是将其拆分为“活动”表和“历史”表。我在这些表上放了4列,所有的时间戳:创建、删除、开始、结束。“已创建”和“已删除”是不言自明的。“开始”和“结束”时间戳用于记录实际为“活动”记录的时间。当前活动记录的“开始”时间将早于
now()
NULL
的“结束”时间。通过分离“创建”和“开始”时间,您可以安排将来发生的更改

这种设计与双表设计不同,它允许您轻松编写查询,自动对正确的数据进行操作。假设您的表存储了一段时间内的税率。。。您不希望所有在计算中使用税率的查询都具有额外的复杂性,例如,在处理旧发票时决定在历史记录表中查找内容。。。您只需在一个查询中查找创建发票时生效的税率,而不管它是否为当前税率

这个想法最初不是我的(尽管在阅读之前我自己重新发明了这个粗略的想法)。。。你可以在这里找到关于它的详细讨论。

我不确定是否有一个“最佳方法”,有这么多的变量需要考虑,包括你在发展道路上走了多远

通过基于代码和db触发器审计解决方案,我在下面列出了一些评论;我希望你能看到你现在的处境(在发展方面)可能会影响这些问题:

  • 如果需要映射更改数据的用户(通常是这样),则db触发器需要以某种方式获取此信息。这不是不可能的,但需要更多的工作和几种方法来实现这一点(db用户执行查询,每个表中的公共用户列,等等)
  • 如果您使用db触发器,并且依赖于查询返回的受影响行数,那么您的审核触发器需要将其关闭,或者修改现有代码以考虑它们
  • IMHO db触发器提供了更高的安全性,并为审计自动化提供了更简单的途径,但它们并非万无一失,因为任何具有适当访问权限的人都可以禁用触发器、修改数据,然后再次启用它们。换句话说,确保您的数据库安全访问权限是严格的
  • 为历史记录创建一个表不是一个坏方法,尽管如果要审核多个表的历史记录,您将有更多的工作要做(和要存储的数据),尤其是在重构审核跟踪时。如果有许多表试图写入一个审计表,您还必须考虑锁定问题。
  • 为每个表创建一个审核历史记录表是另一种选择。您只需要审计表中的每一列都可以为空,并存储操作的日期和时间(插入/更新/删除)以及与操作关联的用户
  • 如果您选择单表选项,除非您有很多时间花在这方面,否则不要太过幻想只对更新或删除进行审核,尽管避免插入可能很有诱惑力(因为大多数应用程序比更新或删除更频繁),但重建审核历史需要相当多的工作
  • 如果您的服务器或数据跨越多个时区,那么考虑使用适当的DATE时间类型来存储和重构时间线,即在UTC中存储审核事件日期以及包括时区偏移。
  • 这些审计表可能会变得庞大,因此,如果它们开始影响性能,就要有一个策略。选项包括将表分区到不同的光盘、存档等。基本上现在就考虑这一点,而不是在出现问题时:)

我认为您的建议将涉及编写大量代码/元数据,以便能够比较对象/记录,从而获得业务级别的审核

或者,数据库触发器可能不会为您提供足够高级别的发生情况视图。如果您很少使用审计,以至于重新创建业务含义的努力是可以接受的


这似乎也是AOP(Aspects)的一个很好的应用程序,您可以使用对象模型上的反射来转储一些有意义的内容,而不需要太多元数据。

我想是的,尽管我是个新手!怎么