Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。
想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
7年前关闭。
Improve this question
有时,软件会出问题。当出现问题时,可能发生的最糟糕的事情之一是系统使某些数据处于不一致或无效状态。当然,我们尝试减少这些情况,但是确实会发生。
当它们发生时,我们通常必须采取一些数据清除的形式采取纠正措施。 (除了强化允许不一致的代码。)我所见过的一些清理技术包括:
直接编辑生产数据库 使用类似于Rails的 编辑生产数据编写脚本,然后运行它 编写Rails迁移,然后运行它
与直接访问版本相比,脚本和迁移版本具有两个优点:
团队可以使用请求请求或其他代码审查技术来确保脚本按预期的方式运行 该脚本会保留下来,以记录团队所做的工作 该脚本可以在非生产环境中运行,也可以在“空运行”模式下运行。
不幸的是,如果将这些脚本检入,它们也具有明显的安全缺陷:它们会将PII或其他敏感数据从数据库泄漏到源代码管理中。例如,
我可以想到一些解决此风险的方法:
在脚本中更喜欢不透明的标识符。我是为此目的,但是(a)并非总是可能的,并且(b)它也混淆了正在发生的事情,从而降低了审核日志的值(value)。 将所有源代码控制移入防火墙。这绝对是更安全的方法,但是这意味着团队无法利用许多基于云的工具(例如Code Climate,TravisCI) 将脚本与种子数据分开。即使仅使用一次,也要以参数化方式编写脚本。这使敏感数据不受源代码控制,但是这意味着完成的记录更难组合在一起。
有人有经过验证的技术吗? 使脚本具有通用性,因此它无需指定“ad personam”数据即可覆盖您要修复的情况。在这种情况下,您的示例(为完整性起见,请在此处报告):
变成这样的东西:
优点是该脚本基于逻辑并涵盖一般情况; (最大的)缺点是,并非总是具有可用于查找要编辑的数据的状态,并且对于这些情况(“ad personam”情况),此解决方案不适用。 通过参数/环境变量/忽略git的文件传递敏感数据
这是我必须存储每个应用程序信息(例如f.e.)时使用的方式。 Rails key :我将其放入gitt-code文件
但是忽略git的文件是用于持久数据的;因为您正在处理一次性脚本,所以我认为参数是一个很好的解决方案:
然后运行
如果您还必须存储所做编辑的信息,则此解决方案不太适合。但是我不认为这是您的情况,无论如何,日志文件应包含有关您所做的工作的信息。如果您有此需求,最好使用一些数据库版本控制逻辑(here有关此资源,如果您对此感兴趣的话)更好。
想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
7年前关闭。
Improve this question
有时,软件会出问题。当出现问题时,可能发生的最糟糕的事情之一是系统使某些数据处于不一致或无效状态。当然,我们尝试减少这些情况,但是确实会发生。
当它们发生时,我们通常必须采取一些数据清除的形式采取纠正措施。 (除了强化允许不一致的代码。)我所见过的一些清理技术包括:
rails console
的REPL通过代码与直接访问版本相比,脚本和迁移版本具有两个优点:
不幸的是,如果将这些脚本检入,它们也具有明显的安全缺陷:它们会将PII或其他敏感数据从数据库泄漏到源代码管理中。例如,
# 2013-07-05: delete all of Susan Yee's OAuth tokens because she's locked out
User.find_by_email('susan.yee@example.com').oauth_tokens.delete_all!
我可以想到一些解决此风险的方法:
有人有经过验证的技术吗?
最佳答案
我首先要说的是,我在工作中必须采取的纠正措施从未如此频繁或复杂,以至于不需要编写专门的脚本。因此,我总是停在您说的第1点和第2点(直接编辑数据库或使用rails console
)。
无论如何,这是我想到的几个解决方案:
# Delete all of Susan Yee's OAuth tokens because she's locked out
User.find_by_email('susan.yee@example.com').oauth_tokens.delete_all!
变成这样的东西:
# Delete locked out people OAuth tokens
User.locked_out.each{ |u| u.oauth_tokens.delete_all! }
优点是该脚本基于逻辑并涵盖一般情况; (最大的)缺点是,并非总是具有可用于查找要编辑的数据的状态,并且对于这些情况(“ad personam”情况),此解决方案不适用。
这是我必须存储每个应用程序信息(例如f.e.)时使用的方式。 Rails key :我将其放入gitt-code文件
config/.secret_key
中,该文件被git忽略,然后将应用程序 secret key 放在该文件中。但是忽略git的文件是用于持久数据的;因为您正在处理一次性脚本,所以我认为参数是一个很好的解决方案:
# Delete all OAuth tokens of the specified user
User.find_by_email(ARGV[0]).oauth_tokens.delete_all!
然后运行
history -c
,这样即使有人设法泄露了您的历史记录也可以确保您的安全(尽管在这种情况下,您可能会遇到更大的问题:P)如果您还必须存储所做编辑的信息,则此解决方案不太适合。但是我不认为这是您的情况,无论如何,日志文件应包含有关您所做的工作的信息。如果您有此需求,最好使用一些数据库版本控制逻辑(here有关此资源,如果您对此感兴趣的话)更好。