关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。
想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。
7年前关闭。
Improve this question
有时,软件会出错。当出现问题时,可能发生的最糟糕的事情之一是系统使某些数据处于不一致或无效的状态。当然,我们试图减少这些情况,但它们确实发生了。
当它们发生时,我们通常必须以一些数据清理的形式采取纠正措施。 (除了强化允许不一致的代码。)我见过的一些用于清理的技术包括
rails console
通过代码编辑生产数据与直接访问版本相比,脚本和迁移版本有几个优点:
不幸的是,如果 checkin ,这些脚本也有一个重大的安全缺点:它们会将 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! }
优点是脚本基于逻辑,涵盖一般情况; (大)缺点是,您并不总是拥有可用于查找要编辑的数据的状态,并且对于这些情况(“广告人”情况),此解决方案不适用。
当我必须存储每个应用程序的信息时,这就是我使用的,比如 f.e. Rails 秘钥:我把它放到一个文件中
config/.secret_key
,像这样)这是 git-ignored,我把应用程序 key 放在那里。但是 git-ignored 文件是用于持久化数据的;由于您正在处理一次性脚本,因此我认为参数是一个很好的解决方案:
# Delete all OAuth tokens of the specified user
User.find_by_email(ARGV[0]).oauth_tokens.delete_all!
然后运行
history -c
所以即使有人设法泄露您的历史记录,您也是安全的(尽管在这种情况下您可能会遇到更大的问题:P)如果您还必须存储所做编辑的信息,则此解决方案不太适合;但我不认为这是你的情况,无论如何日志文件应该包含关于你所做的事情的信息。如果您有此需求,最好使用一些数据库版本控制逻辑(here 一些关于此的资源,如果您对此感兴趣)
关于ruby-on-rails - 如何安全地管理一次性脚本以修复数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20079299/