问题标签 [auditing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2374 浏览

sql-server-2005 - 审计触发器:使用 INSERTED 或 DELETED 系统表

最近在我们的讨论中出现了如何审计表的话题……所以我喜欢你对解决这个问题的最佳方法的看法。我们在我们的数据库中混合了这两种方法(这并不好),因为每个以前的 DBA 都做了他/她认为正确的方法。所以我们需要改变它们以遵循任何一种模型。

方法 1:仅在审计表中存储那些从主表中替换/删除的记录(使用系统表 DELETED)。因此,对于主表中的每个 UPDATE 和 DELETE,被替换的记录被插入到审计表中,其中 'Audit_Type' 列作为枯萎的 'U' (用于 UPDATE )或 'D' (用于 DELETE)

INSERT 未经审计。对于任何记录的当前版本,您总是查询主表。对于历史,您可以查询审计表。

优点:看起来很直观,可以存储以前版本的记录缺点:如果您需要了解特定记录的历史记录,则需要将审计表与主表连接起来。

方法 2:在审计表中存储进入主表的每条记录(使用系统表 INSERTED)。

在主表中插入/更新/删除的每条记录也存储在审计表中。因此,当您插入一条新记录时,它也会插入到审计表中。更新后,新版本(来自 INSERTED)表存储在 Audit 表中。删除时,旧版本(来自 DELETED)表存储在审计表中。

优点:如果您需要了解特定记录的历史,您可以将所有内容集中在一个位置。

虽然我没有在这里列出所有方法,但每种方法都有其优点和缺点?

0 投票
1 回答
1058 浏览

c# - 如何在 NHibernate 中进行通用字段和组件级别的更改跟踪?

在我的应用程序中,我需要对几种不同类型的实体进行字段级更改跟踪。我已经对此进行了谷歌搜索,只能提出关于执行简单的“插入日期”和“更新日期”审计跟踪的示例,您只需修改已经持久化的实体上的字段。我的要求更复杂,因为:

  1. 我需要创建表示更改的新实体,而不仅仅是修改正在保存的实体上的字段(与我发现的插入日期、更新日期示例一样)
  2. 我需要在更新跟踪实体的同一事务中将这些新实体保存到数据库
  3. 我需要跟踪附加到被跟踪实体的 ValueObjects 集合的更改
  4. 我不想为每个被跟踪的实体编写单独的日志记录代码

示例代码:

每当帐户或计算机对象的任何值发生更改或与计算机对象关联的 IPAddresses 列表发生更改时,我都需要创建并保存这些实体更改记录:

每个被跟踪实体都实现了 ITrackChanges 标记接口,并且每个值对象都继承自 ValueObject 基类。值对象被映射为 NHibernate 中的组件。

作为我希望得到的最终结果的示例,如果我使用 Id 1 更新计算机对象并将 AssetTag 从“ABC123”更改为“ABC124”并将 IP 地址列表从 {“1.2.3.4 " } 到 { "1.2.3.4" , "1.2.3.5" },我应该得到 2 EntityChange 记录:

关于实现这一点的最佳方法的任何想法?从我对文档的阅读来看,我似乎需要编写一个拦截器和/或事件侦听器,但除了仅修改正在更新的实体的示例之外,我无法找到任何示例。任何答案都绝对欢迎示例代码。

假设这应该是 NHibernate 支持的东西,我错了吗?我能够在以前使用 LLBLGen 作为 ORM 的应用程序中实现这一点,但这是我第一次不得不在使用 NHibernate 的应用程序中实现这一点。

0 投票
3 回答
2916 浏览

sql - SQL Server 用户名函数

考虑这个 T-SQL:

我正在考虑将这些帐户WITHOUT LOGIN用于审计目的。基本上,我的“获取数据库连接”代码返回一个EXECUTE AS USER...WITH NO REVERT已经执行的连接。

问题是我无法从任何这些用户名函数中获得一致的结果。两行输出是:

这些USER函数在 之后产生正确的输出'EXECUTE AS',但事先它们显示的是 dbo 而不是用户名SUSER函数正好相反——它们最初是正确的,但在模拟之后它们显示了某种 ID

SUSER_SNAME的 MSDN 文档明确给出了一个应该起作用的示例。

更新:我正在寻找的是一个函数,它将在第一种情况下产生“original_user”,在第二种情况下产生“my_test_user”。

0 投票
1 回答
406 浏览

ruby-on-rails - 审计和建模实例及其关联的生命周期管理?

我正在尝试编写一个应用程序来跟踪法律案件请求。主要模型是 Case,其中包含has_manySubjects、Keywords、Notes 和 Evidences(反过来又是has_manyCustodyLogs)。由于该应用程序与法律相关,因此有一些不同寻常的要求:

  • 必须记录 CRUD 操作,包括操作是什么、参与者是谁以及操作发生的时间
  • 需要有某种方法来验证数据(即记录记录的 MD5 校验和)
  • 一些数据应该是一次性写入的(即应用程序可以创建一个审计日志条目,但此后不能在应用程序内编辑或删除该日志)
  • 可能应该在整个嵌套过程中记录对关联对象的更改。例如,将 CustodyLog 添加到一个 Evidence 应该有一个日志用于它自己,一个日志用于它的 Evidence,一个日志用于父案例。这是为了确保 Case 的上次更新时间戳准确地反映了真实的上次更新,而不仅仅是 Case 模型数据本身更改的上次时间。

我有一些这样的工作,但我遇到了一个问题。身份验证由外部 Web 单点登录服务处理,因此登录用户 ID 的唯一可见性是在请求变量中。例如,如果我通过回调将审计日志记录在模型中,我可以相当确定所有数据修改都已记录,但模型对请求变量不可见,因此我无法记录用户 ID。这也确保了对状态机(当前使用 state_machine 插件)的更改被记录下来。

另一方面,如果我将审计日志记录放在应用程序控制器中,我将无法确保记录所有 CRUD 操作(例如,调用 Subject.create 的案例模型中的代码不会被记录) . 我也认为我会失去状态变化。

有没有办法确保在整个关联树中记录所有 CRUD 操作,以便记录登录用户的用户 ID?

0 投票
1 回答
766 浏览

sql-server - SQLServer 2008 - 在实例之间配置 Service Broker

我一直在使用这个网站上的脚本来帮助配置基于 Service Broker 的审计。第一阶段 - 在同一实例上的数据库之间设置 SB 工作正常。

但是,当我尝试在实例之间应用 Service Broker 时,我陷入了悲伤。

我正在使用命令行工具 ssbdiagnose 来帮助我查找配置错误:

这是报告

发生内部异常:输入字符串的格式不正确。

现在这只是检查配置,我什至还没有到发送消息的地步,所以“输入字符串”必须是配置的一部分,但错误消息没有说明错误发生在哪里而且我在网上找不到任何关于诊断 ssbdiagnose 错误的信息。

任何有 ssbdiagnose 经验的人都可以帮助我了解错误在哪里,以及我需要做些什么来修复它?

克里斯

0 投票
1 回答
326 浏览

asp.net - 具有域上下文的休眠拦截器

是否可以(以干净的方式)在休眠 2.1 中创建一个审计拦截器并将域上下文传递给它?

我想要实现的是设置一个日期时间(可以很容易地完成 - 在快速谷歌之后找到加载文章),但是设置一个对象,例如创建项目的用户,或者更改我还没有找到任何东西的实体这涵盖了这一点。

由于我在应用程序请求/启动时不知道对象(这是我必须注册 nhibernate 拦截器的地方),有没有人知道合适的解决方法?

在此先感谢,马克 H

0 投票
8 回答
29058 浏览

c# - 查找两个 C# 对象之间的属性差异

当用户更改他们的电子邮件、帐单地址等时,我正在处理的项目需要一些简单的审计日志记录。我们正在使用的对象来自不同的来源,一个是 WCF 服务,另一个是 Web 服务。

我使用反射实现了以下方法来查找两个不同对象的属性的更改。这会生成具有差异的属性及其旧值和新值的列表。

我正在寻找 System.IComparable,因为“所有数字类型(例如 Int32 和 Double)都实现了 IComparable,String、Char 和 DateTime 也是如此。” 这似乎是查找任何不是自定义类的属性的最佳方式。

利用 WCF 或 Web 服务代理代码生成的 PropertyChanged 事件听起来不错,但没有为我的审计日志(旧值和新值)提供足够的信息。

寻找有关是否有更好的方法来执行此操作的输入,谢谢!

@Aaronaught,这是一些示例代码,它基于执行 object.Equals 生成正匹配:

“[地址] StateProvince 从 'MyAccountService.StateProvince' 更改为 'MyAccountService.StateProvince'”

它是 StateProvince 类的两个不同实例,但属性的值是相同的(在本例中均为 null)。我们没有覆盖 equals 方法。

0 投票
1 回答
989 浏览

nhibernate - 休眠审计

我有一个关于审计的问题。大多数审计示例使用一个审计表来跟踪更改。但是,每个“常规”表都需要一个审计表。换句话说,tblCustomer 也会有 tblCustomer_History。我不知道如何使用监听器,并且在更新时也填充历史表。有任何想法吗?我不想依赖 SQL Server 触发器。

0 投票
1 回答
492 浏览

.net - Web 应用程序审计

当应用程序作为系统帐户连接到数据库时,如何审计 Web 应用程序特别是数据库更改?

我想使用一个简单的数据库触发器来写入审计表,但我不确定如何添加已登录的用户而不是实际执行工作的帐户。

我已经阅读了一些关于身份流的文章,但我并不完全理解这个概念。

0 投票
1 回答
147 浏览

nhibernate - NHibernate 和 SetSessionAuth 审计列

我们有触发器设置的审计列。由于在我任职之前和我无法控制的模糊安全原因,我们使用通用用户登录,并执行“设置会话授权”以将用户更改为登录用户的 db 用户。

当我们转换为 NHibernate 时,它​​会创建一个全新的会话并在我们尝试执行 set session auth 时将所有内容都插入,因此我们关闭了 set session auth ...

现在我们正在尝试找到一种方法让 NHibernate 让我们在不回收会话的情况下进行“设置会话授权”,这样我们就可以将现有的基于触发器的审计列内容用于旧应用程序和新的 NHibernate 应用程序。

这不是一个理想的解决方案,也不是最好的方法,但有可能吗?

我希望有一个允许这种访问的备用界面。

有谁知道怎么做,或者你能指出我的方向和好的提示吗?

谢谢,

埃里克-