ruby-on-rails - 如何安全地管理一次性脚本以修复数据?

标签 ruby-on-rails ruby security debugging

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

7年前关闭。




Improve this question




有时,软件会出错。当出现问题时,可能发生的最糟糕的事情之一是系统使某些数据处于不一致或无效的状态。当然,我们试图减少这些情况,但它们确实发生了。

当它们发生时,我们通常必须以一些数据清理的形式采取纠正措施。 (除了强化允许不一致的代码。)我见过的一些用于清理的技术包括

  • 直接编辑生产数据库
  • 使用像 Rails 的 REPL rails console通过代码编辑生产数据
  • 编写脚本然后运行它
  • 编写 Rails 迁移然后运行它

  • 与直接访问版本相比,脚本和迁移版本有几个优点:
  • 团队可以使用拉取请求或其他代码审查技术来确保脚本按预期运行
  • 脚本留下来作为团队所做的记录
  • 该脚本可以在非生产环境或“试运行”模式下运行

  • 不幸的是,如果 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!
    

    对于这种风险,我可以想到几个解决方案:
  • 更喜欢脚本中的不透明标识符。我支持这个,但是 (a) 这并不总是可能的,并且 (b) 它也混淆了正在发生的事情,降低了审计日志的值(value)。
  • 将所有源代码控制移到防火墙内。这绝对更安全,但意味着团队无法利用许多基于云的工具(例如 Code Climate、TravisCI)
  • 将脚本与种子数据分开。以参数化的方式编写脚本,即使它们只会被使用一次。这使敏感数据不受源代码控制,但这意味着已完成操作的记录更难拼凑起来。

  • 有人有经过验证的技术吗?

    最佳答案

    我首先要说的是,我在工作期间必须采取的纠正措施从未如此频繁或复杂,以至于需要编写专门的脚本;所以我总是停在你说的 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! }
    

    优点是脚本基于逻辑,涵盖一般情况; (大)缺点是,您并不总是拥有可用于查找要编辑的数据的状态,并且对于这些情况(“广告人”情况),此解决方案不适用。
  • 通过参数/环境变量/git-ignored 文件传递​​合理的数据

    当我必须存储每个应用程序的信息时,这就是我使用的,比如 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/

    相关文章:

    ruby-on-rails - 值未存储在 ruby​​ on rails 数组中

    ruby-on-rails - 如何获得 "+hh:mm"格式的本地时区偏移量?

    带有 OAuth 的 Java 安全框架

    ruby - 为什么 "puts"输出在 Ruby 中缩进?

    javascript - Django 中不安全的用户输入文本有哪些危险?

    iphone - 如何检测我的 iOS 应用程序是否启用了 PIE/ASLR?

    ruby-on-rails - 使用 RVM 升级到 Ruby 2.1.2 后出现 PaperTrail (paper_trail) 错误。未初始化常量 PaperTrail::Rails::Engine

    ruby-on-rails - 为什么我不能在 Rails 中更改 DateTime 的偏移量?

    ruby-on-rails - 在 Heroku 部署后触发 Travis 运行

    html - 将 HAML 代码转换为普通 HTML 和代码