在PHP中存储敏感数据

时间:2012-06-01 13:53:38

标签: php

我正在开发一个PHP项目,我正在使用一个全局设置文件,其中包含我需要一些全局值,例如用于连接到mysql的数据库凭据。 例如:

的settings.php:

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

我的问题,它足够安全吗? 例如,在explorer / chrome中调试时有没有办法查看变量值? 有没有其他更安全的方式?

感谢。

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

虽然在服务器受损的情况下提供的保护很少,但是如果您的源代码通过错误或其他漏洞(例如:http://www.php.net/archive/2012.php#id2012-05-06-1)变得公开可见,则越来越常见的方法是设置各种凭据和参数作为服务器环境变量。

E.g。在apache vhost / .htaccess中,您可以设置一个环境变量,如下所示:

SetEnv DB_ADDRESS localhost
...

在您的PHP代码中:

$DB_ADDRESS = getenv('DB_ADDRESS');

当然,您可以将此值分配给类常量,全局常量,具体取决于您的用例等....

这也使您的源代码更具可移植性,允许根据托管环境(登台/制作等)提供不同的配置:

SetEnv APPLICATION_ENV development - .htaccess interacting with Zend Framework?

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

答案 2 :(得分:3)

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

答案 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帐户只能通过localhost访问(如果没有修复它!)。

答案 4 :(得分:2)

您的后端代码不应出现在前端,除非您的设置出现严重错误。如果发生这种情况并且您的后端源代码被“泄露” - 不太可能,只有possible - 那么您的密码将在明显可见时显示。

您可以使用对称加密方案加密密码字符串,但您必须将加密密钥存储在某处。然后,如果加密密钥泄露,您将返回起点。它比使用纯文本密码要好一些,但没有什么是100%安全的。

答案 5 :(得分:1)

  

例如,在explorer / chrome中调试时有没有办法查看变量值?

如果你从未将它们发送到视图(即echo,var_dump,print_r,session等) - 那么没有。浏览器永远不会知道它们。