各种 API(例如 Facebook 或 Amazon S3)需要密钥来验证对服务的访问。显然,如果源代码是公开的,那么密钥不应该在源代码中!闭源网站呢?
封闭源代码网站是否应该在其源代码中保留密钥?
我推荐的做法是不要将密钥放在源代码中。针对您的特定情况的最佳选择取决于一些细节。
通常,首选是将密钥保存在不存储在源代码存储库中的单独文件中。如果您愿意,您甚至可以拥有一个secrets目录并将密钥存储在那里。通常,您将密钥发布给适当的用户——那些需要进行最终构建或可以测试需要密钥的功能的构建的用户。
如果您的源代码工作人员不完全信任密钥(例如,如果外包程序员添加到您的代码中),您可以操纵代码以在没有密钥的情况下以回退模式运行。这可能适合也可能不适合您的情况。
我应该指出,如果您分发目标代码,确实没有很好的方法来保密密钥。这种方法真的应该只用在不仅是封闭源代码而且封闭分发的程序中。如果您必须进行一些混淆,不仅密钥而且混淆器应该在secrets目录中并且它的分发受到限制。
源代码生命周期和密钥管理可能会发生冲突。例如,您可以(应该)使用版本控制工具,例如Subversion存储您对源代码执行的连续修改;如果您将密钥放入其中,那么密钥也将被存储。基本上,如果您将密钥存储在网站源代码中,那么您需要使源代码与密钥完全一样保密;钥匙很小,因此被认为更容易保密(例如,可以在纸上写下钥匙并将纸保存在保险箱中,因为可以在几秒钟内完成输入),而源整个站点的代码要麻烦得多。如果将密钥存储在源代码中,那么突然间,获取网站源代码的副本就成为攻击者非常有价值的目标。
如果“在源代码中”是指作为文件中逻辑代码的一部分,我会同意其他人的观点:不要这样做。说到 PHP,你的代码片段可能会在调试报告中展示,甚至可能在网站上(至少在开发视图中)。
其他两个选项是 - 您用于项目的编程语言中的专用配置文件。然后,您可以将它包含在您需要的地方,或者更好地使用注册表设计模式之类的东西。优点是,文件在直接调用时被解释并且不会输出秘密。- 一个专用的纯文本 conif 文件。这必须防止直接调用,例如将其放置在 DocumentRoot 之外。
我主要使用后者,通常只在 DocRoot 中放置一个前端控制器,并让所有库、配置、大多数数据等与之平行。
我脑海中浮现的第一个答案是否定的,这不是正确的做法。
不过,有时人们应该遵循并非绝对完美但需要早期发布、客户封闭需求或其他一些 miSf(H)IT 的实践。
因此,如果在这种情况下,请尽量考虑以下几点:
不是 PLAINTEXT最重要的
- 编码,加盐.....尽你所能
不要将它嵌入到任何地方的源代码中
制作一个包含详细信息的配置文件,然后从中读取
将配置文件权限分配为“只读”并且仅由用户需要