10

您将如何隐藏敏感信息以防止进入日志文件?是的,您可以有意识地选择不首先记录敏感信息,但在一般情况下,您可能会在调查问题时盲目地记录错误消息或跟踪消息等,最终导致敏感信息进入您的日志文件。

例如,您可能尝试将包含客户信用卡号的订单记录插入数据库。在数据库发生故障时,您可能希望记录刚刚执行的 SQL 语句。然后,您最终会在日志文件中获得客户的信用卡号。

是否有一种设计范式可用于将某些信息“标记”为敏感信息,以便通用日志管道可以将它们过滤掉?

4

7 回答 7

7

我目前针对该案例的做法是记录此类敏感信息的哈希值。这使我们能够识别属于特定声明(例如特定信用卡号)的日志记录,但不会赋予任何人获取日志并将敏感信息用于其邪恶目的的权力。

当然,这样做始终涉及良好的编码实践。我通常选择使用它们的重载(在 Java 或 .NET 中)记录所有对象,这些重载会序列化标记有应用于它们toString的属性的字段的值的哈希值。Sensitive

当然,SQL 字符串的问题更大,但我们更多地依赖我们的 ORM 来进行数据持久化,并在各个阶段记录系统的状态,然后记录 SQL 查询,因此它成为一个问题。

于 2010-01-02T14:50:32.677 回答
5

我个人会将日志文件本身视为敏感信息,并确保限制对它们的访问。

于 2009-09-23T15:56:51.193 回答
2

记录信用卡号可能违反 PCI。如果您不符合 PCI 标准,您将被收取更高的卡处理费用。要么不记录敏感信息,要么加密整个日志文件。

您“标记”敏感信息的想法很有趣。你可以有一个特殊的Sensitive信息数据类型,它包装了真实的底层数据类型。每当此对象呈现为字符串时,它只会返回"***"或其他任何内容。

但是,这可能需要进行广泛的编码更改,并且需要一定程度的有意识的警惕性,类似于首先避免记录敏感信息所需的警惕性。

于 2009-09-23T15:59:23.363 回答
1

在您的示例中,您应该加密信用卡号,或者更好的是,甚至不首先存储它。

例如,如果您正在记录其他内容,例如登录,您可能希望用 ***** 显式替换密码。

但是,这可以巧妙地避免回答您首先提出的问题。通常,在处理敏感信息时,应在将其传输到任何形式的永久存储(无论是数据库文件还是日志文件)的过程中对其进行加密。假设一个坏人将能够得到他们的手,并相应地保护信息。

于 2009-09-23T15:56:54.383 回答
1

如果您知道要过滤的内容,则可以在记录之前通过正则表达式清理表达式运行记录输出。

于 2009-09-23T15:57:24.203 回答
1

特别是关于 SQL 语句,如果您的语言支持它,您应该使用参数而不是在语句本身中放置值。换句话说:

select * from customers where credit_card = ?

然后将参数设置为信用卡号。

当然,如果你打算用填充参数来记录 SQL 语句,你就需要一些其他的方法来过滤掉敏感数据。

于 2009-09-23T16:03:28.237 回答
0

请参阅此工具,该工具正是为此用例创建的。

如果您只想屏蔽选定的字段,请在记录期间保持其他字段值不变。你可以试试这个。

https://github.com/senthilaru/sp-util

<dependency>
    <groupId>com.immibytes</groupId>
    <artifactId>sp-utils</artifactId>
    <version>1.0.0-RELEASE</version>
</dependency>
于 2016-02-23T19:45:27.367 回答