2012-06-01 130 views
2

我正在开发一个PHP项目,我正在使用一个全局设置文件,其中包括我需要一些全局值(例如用于连接到mysql的数据库证书)的位置。 例如:在PHP中存储敏感数据

的settings.php:

<?php   
    const DB_ADDRESS = 'localhost'; 
    const DB_USERNAME = 'johndoe'; 
    const DB_PASSWORD = 'mypassword'; 
    const DB_PORT = 7777; 
?> 

我的问题,是不是足够安全? 例如,是否有任何方法可以在explorer/chrome中调试时查看变量值? 有没有其他更安全的方法?

谢谢。

+0

相关:http://www.stackoverflow.com/questions/7099737/storing-sensitive-values-in-a-secure-location – nickb

+0

[安全存储数据库凭证](http:// stackoverflow。 com/questions/10825367/secure-storage-of-database-credentials) –

+0

谢谢。做了一个简短的搜索,但找不到它。 –

回答

6

PHP信息在发送到浏览器之前在服务器上处理,因此在正常情况下无法在浏览器内部看到。但是,如果您的网络服务器配置错误,则可能会将代码的纯文本版本发送到浏览器,从而使其对用户可见。这就是为什么重要代码应该始终保存在文档根目录之外并在需要时包含在文件中。

3

变量保存在服务器中,不会发送给客户端。除非您的脚本有任何允许用户输出自定义变量的漏洞,否则他们对任何没有源代码访问权的人都将保持安全。

2

这是标准的方式(查看phpmyadmin,mediawiki等):此php文件不可访问,如果您在服务器设置中未发生任何错误,则不可读。

通常你会添加一个测试,以检查此设置文件包含在你的PHP文件中的一个:

<?php 
if (!defined('IN_KP')) die("Hacking attempt"); 
?> 

当然,你在你的包含文件定义“IN_KP”:

<?php 
define('IN_KP', true); 
include("sensitive_file.php"); 
?> 

但最好的保护总体上是那些敏感数据不是那么敏感,因为你的mysql帐户只能通过本地主机访问(如果没有修复它!)。

+0

谢谢。 MySQL配置为localhost,但我有其他敏感数据,如私钥和Facebook秘密ID。 –

1

例如,有什么办法可以在explorer/chrome中调试时查看变量值吗?

如果您从不将它们发送到视图(即echo,var_dump,print_r,session等) - 则不会。浏览器永远不会知道它们。

2

您的后端代码应该永远不会出现在前端,除非您的设置出现严重错误。如果发生这种情况,并且您的后端源代码被“泄漏” - 不太可能,但是possible - 那么您的密码将清晰可见。

您可以使用对称加密方案加密密码字符串,但必须在某处存储加密密钥。然后,如果加密密钥泄露,您将回到起点。它仍然比纯文本密码好一点,但没有任何东西会100%安全。

4

虽然这在服务器遭到破坏时几乎没有任何保护,但是如果您的源代码已成为公众可见的,通过缺陷或其他漏洞(如:http://www.php.net/archive/2012.php#id2012-05-06-1),越来越常见的方法是设置各种凭据和参数作为服务器环境变量。

E.g.在apache的虚拟主机/的.htaccess您可以设置环境变量,如以下几点:

SetEnv DB_ADDRESS localhost 
... 

而且在PHP代码:

$DB_ADDRESS = getenv('DB_ADDRESS'); 

当然,你可以将此值赋给一个类常量,全球根据您的使用情况等不同而不变......

这也使得您的源代码更加便携,允许根据托管环境(分段/生产等)提供不同的配置:

SetEnv APPLICATION_ENV development - .htaccess interacting with Zend Framework?

您的设置永远不会被硬编码,也无法在源代码中访问。 Heroku使用类似的方法来进行应用程序配置。

+0

谢谢,当我的代码变成“在线”时,听起来像是一个很好的解决方案。 –