为什么要在一个应用程序之外存储API密钥?

时间:2014-01-18 17:51:08

标签: php security environment-variables constants api-key

我对在自己的应用程序之外为另一个应用程序存储一个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']

1 个答案:

答案 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;博士:

有一整套安全性最佳实践,但这应该让您开始基本了解从文档/脚本中分离配置。简而言之:将您的文档根目录与配置文件分开,这样,如果您的文档根目录受到威胁,您的服务器配置仍然是安全的。