您在哪里存储密钥,邮件密码,数据库密码等凭据?
我在https://security.stackexchange.com/questions/19785/security-concerns-about-my-webapp/19786#19786
上发了帖子似乎存储凭据的最佳方式是在外部服务器上。
但是play2使用application.conf来做到这一点。
更新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找不到变量测试,因为它在heroku上。但后来我也在我的本地windows环境中添加了它 - >仍然是同样的错误。
知道出了什么问题吗?
UPDATE2:
好的它可以工作,我只需要在添加env变量后重新启动。
上一个问题:
每次在我的本地机器上添加系统变量都有点烦人。是否有开发模式?
答案 0 :(得分:3)
application.conf
支持环境变量,例如db.default.user=${DB_USER}
。您可以将其作为控制台参数传递(由于它出现在ps
中,因此不安全),或者更安全地将其设置为环境变量。
在Heroku上,通过heroku config
设置环境变量,例如heroku config:add DB_USER=MyDBAdmin
。
在本地,您可以通过export DB_USER=MyDBAdmin
进行设置,或将其添加到~/.bash_profile
(如果您使用bash)。
答案 1 :(得分:3)
广告。 3:在游戏中application.conf
无法通过任何route
或其他类型path
访问,因此不能将其视为“置于webroot中”。特里的建议在PHP中是正确的,但不适合Play(他警告说,他当然不知道框架)。他给出了一个PHP脚本示例,但请相信我,访问http://somdomain.tld/config.php
和Play conf/application.conf
之间的差异很大。它们无法直接比较。
在application.conf
中存储凭据是目前最安全(也是最快)的方式,我无法想象一种在浏览器中反编译文件的方法,即使解析器会死掉(这是不可能的,因为它不是PHP )。如果你决定在一些遥远的地方存储凭证,你将获得新的风险,因为你需要另外检查客户是否有权获得配置,应用程序启动所需的时间会增加等等。
更新1:
使用环境变量并不是一种安全的方式 - 正如Marius指出的那样,它会显示在进程列表中,因此您将向每个管理员显示您的凭据,我很确定您不希望这样做。你的邮件。
在Heroku当然,它是传递他们的数据库连接URL的一种方式,但其他凭据应该存储在配置文件中。最后请记住Procfile command length is limited到255个字符,因此将所有凭据放入其中会导致您的应用程序有一天无法启动。
这种情况下的解决方案是使用alernative configuration files,场景非常简单
application.conf
中保留生产数据库的URL如果它的Heroku很可能db.default.user
和db.default.password
应该被注释为普通的heroku URL包含凭据。conf/local_postgres.conf
在开头包含application.conf,并覆盖/添加所有必需的配置密钥,如凭据到本地Postgres DB。此外,您可以设置其他内容,更改日志记录级别,启用smtp.mock
等等。使用此conf在本地运行您的应用。 (注意,我在使用-Dconfig.resource
时遇到了一些问题,所以我不得不使用-Dconfig.file
语法,你必须找到哪种方法在你的系统中运行良好)即。
play -Dconfig.resource=local_postgres.conf "~run 9123"
提示:使用非默认端口是“演示”您正在使用本地配置的最简单方法。如果您忘记自己拥有备用配置并使用常见的play ~run
命令启动应用,则位于http://localhost:9123
的应用将无法使用。
在Windows中创建bash脚本run-local
(或run-local.bat
文件)并从上一点开始执行命令。在.gitignore
文件中忽略它。
从现在开始,您将使用第4点的脚本运行本地开发应用程序。在推送到Heroku时,它将使用application.conf
的值部署您的应用,因为您没有在Procfile中设置备用配置。还有一些其他组合,您可以使用Heroku的SQL在本地运行您的应用程序,以执行演进而无需将其推送到部署,或检查最新的修订包。当然,您必须始终确保在本地版本的数据库上进行开发,否则您可能会意外更改/破坏您的生活数据。
更新2:
最后使用*.conf
文件比将其存储在单独的类中更好,以防您必须更改不同位置的配置(如前所述,团队处理相同的代码,开发/生产环境等)< / p>
当然可以缩短为:
import play.Configuration;
import play.Play;
// ...
Configuration cfg = Play.application().configuration();
cfg.getString("smtp.password");
cfg.getBoolean("smtp.mock");
cfg.getInt("smtp.port");