我对在自己的应用程序之外为另一个应用程序存储一个API密钥的安全性好处感到困惑。
如果有人可以阅读您的应用程序文件,为什么他们无法读取您的php.ini,服务器配置文件等文件?
有人可以解释以下目录结构(仅用于说明):
内幕申请:
root/.../html/application/keys/somekeyfile.php with API keys defined as constant variables, e.g., define('API_key', 'xxxx');
外部申请
root/../php/php.ini //with API keys defined as environment variables, e.g., $_ENV['API_key']
答案 0 :(得分:2)
假设我们有一个webserver - linux,在这种情况下(我将这个文件结构基于Amazon EC2“Amazon Linux”实例)。
服务器:
在此处安装和配置Web服务(Apache,php等):
/etc
了解linux文件结构在很大程度上超出了范围,但您可以根据自己的时间进行研究。 Web实例(html文件,文档根等)在httpd.conf中配置:
/etc/httpd/httpd.conf`
默认情况下,文档根目录配置为指向完全不同的目录树(在某些情况下甚至可能是卷):
/var/www
您当然可以更改此行为,但开箱即用,Web文档根文件存在于与服务器配置不同的目录树中。
安全模型:
Web文档根本身就是安全的,因为它们不允许您在文档树中进一步遍历。例如,如果您在此处拥有vhost的文档根(并且已正确配置):
/var/www/html/example.com
当您访问http://example.com时,网络文档根目录(/
)指向该文件夹。如果您在控制台中浏览,则无法从Web服务器向后遍历../html
。
此规则当然有例外,因为您可以在php中使用file_get_contents()
在其他位置打开文件,或者您可以错误地配置您的虚拟主机,但再次,开箱即用,就是这样。
<强>入侵:强>
黑客在文档根级别恶意获取对您网站的控制权。假设他们现在可以访问index.php
,甚至includes/api_keys.php
。如果您将API密钥存储在那里 - 它们现在掌握在攻击者手中。
但是如果您将它们存储在php.ini
中,攻击者只能访问您网站的文档根目录 - 而不是/etc
目录,因此您的API密钥仍然是安全的。
(请记住,如果您的服务器通过root / ssh / shell访问受到攻击,那么无论如何都不安全。)
结论/ tl;博士:
有一整套安全性最佳实践,但这应该让您开始基本了解从文档/脚本中分离配置。简而言之:将您的文档根目录与配置文件分开,这样,如果您的文档根目录受到威胁,您的服务器配置仍然是安全的。