4

您在哪里存储您的凭据,如密钥、邮件密码、数据库密码?

我在https://security.stackexchange.com/questions/19785/security-concerns-about-my-webapp/19786#19786上发了一个帖子

似乎存储凭据的最佳方式是在外部服务器上。

但是 play2 使用 application.conf 来执行此操作。

  • 那么你如何以及在哪里存储你的凭证在 play2 中?

更新1:

好的,我正在使用heroku。

我像这样设置我的环境变量:

heroku config:add test=ITWORKS

在 application.conf 我添加

sometest=${test}

我试图像这样访问它:

Logger.info(Play.application().configuration().getString("sometest"));

但我收到以下错误:

UnresolvedSubstitution: conf\application.conf: 54: Could not resolve substitution to a value: ${test}

所以我猜 play2 没有找到变量 test 因为它在 heroku 上。但后来我也在我的本地 Windows 环境中添加了它 -> 仍然是同样的错误。

知道有什么问题吗?

更新2:

好的,我只需要在添加环境变量后重新启动。

最后一个问题:

每次在我的本地机器上添加系统变量有点烦人。有开发模式吗?

4

2 回答 2

4

application.conf支持环境变量,例如db.default.user=${DB_USER}. 您可以将其作为控制台参数传递(由于它出现在 中,因此不安全ps),或者更安全地将其设置为环境变量。

在 Heroku 上,通过设置环境变量heroku config,例如heroku config:add DB_USER=MyDBAdmin.

在本地,您可以通过 设置它们export DB_USER=MyDBAdmin,或将它们添加到您的~/.bash_profile(如果您使用 bash)。

于 2012-09-05T21:06:05.520 回答
3

广告。3: In Playapplication.conf无法通过任何route或其他方式访问,path因此不能视为“放置在 webroot 中”。Terry 的建议在 PHP 中是合适的,但不适合 Play(他警告说,他当然不了解框架)。他提供了一个 PHP 脚本示例,但相信我,访问http://somdomain.tld/config.php和 Play之间的差异conf/application.conf是巨大的。它们不能直接比较。

存储凭据application.conf是目前最安全(也是最快)的方式,我无法想象有一种方法可以在浏览器中反编译文件,即使解析器会死(这是不可能的,因为它不是 PHP)。如果您决定将凭据存储在某个遥远的位置,您将面临新的风险,因为您需要额外检查客户端是否有权获取配置,应用程序启动所需的时间会增加等。

更新1:

使用环境变量不是一种安全的方式——正如 Marius 所指出的,它会出现在进程列表中,所以你会向每个管理员显示你的凭据,我很确定你不想用 ie 这样做。你的邮件。

当然,在 Heroku 中,这是一种传递数据库连接 URL方法,但其他凭据应存储在配置文件中。最后请记住,Procfile 命令长度限制为255 个字符,因此将所有凭据放入其中会导致您的应用程序有一天无法启动。

这种情况下的解决方法是使用替代配置文件,场景非常简单

  1. 在您application.conf保留生产数据库的 URL 如果它最有可能是 Herokudb.default.user并且db.default.password应该注释为 common heroku URL 在其中包含凭据。
  2. 对于您的本地版本,创建一个文件,即:conf/local_postgres.conf在开头包含 application.conf 并将所有必需的配置密钥(如凭据)覆盖/添加到本地 Postgres DB。此外,您还可以设置其他内容、更改日志记录级别、启用smtp.mock等。
  3. 使用此配置在本地运行您的应用程序。(注意,我遇到了一些问题,-Dconfig.resource所以我不得不改用-Dconfig.file语法,你必须找到哪种方法在你的系统中运行良好)即。

    play -Dconfig.resource=local_postgres.conf "~run 9123"
    

    提示:使用非默认端口是“证明”您正在使用本地配置的最简单方法。如果您忘记了您有替代配置并且将使用通用play ~run命令启动您的应用程序,那么您所在位置的应用程序http://localhost:9123将不可用。

  4. 创建一个 bash 脚本run-local(或run-local.batWindows 中的文件)并将前一点的命令放在那里。.gitignore在文件中忽略它。

从现在开始,您将使用第 4 点中的脚本运行应用程序以进行本地开发。在推送到 Heroku 时,它将使用来自的值部署您的应用程序,application.conf因为您没有在 Procfile 中设置替代配置。更重要的是,您可以使用 Heroku 的 SQL 在本地运行您的应用程序以执行演进,而无需将其推送到部署,或检查最新的修复包。当然,您必须始终确保您在本地版本的数据库上进行开发,否则您可能会意外更改/破坏您的生活数据。

更新 2:

最后,使用*.conf文件比将其存储在单独的类中要好,以防您必须更改不同位置的配置(如前所述,团队处理相同的代码、开发/生产环境等)

当然可以简写为:

import play.Configuration;
import play.Play;

// ...
Configuration cfg = Play.application().configuration();

cfg.getString("smtp.password");
cfg.getBoolean("smtp.mock");
cfg.getInt("smtp.port");
于 2012-09-05T22:01:11.527 回答