Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中存储敏感数据_Php - Fatal编程技术网

在PHP中存储敏感数据

在PHP中存储敏感数据,php,Php,我正在处理一个PHP项目,我正在使用一个全局设置文件,其中包括一些全局值,例如连接到mysql的数据库凭据。 例如: settings.php: <?php const DB_ADDRESS = 'localhost'; const DB_USERNAME = 'johndoe'; const DB_PASSWORD = 'mypassword'; const DB_PORT = 7777; ?> 我的问题是,它足够安全

我正在处理一个PHP项目,我正在使用一个全局设置文件,其中包括一些全局值,例如连接到mysql的数据库凭据。 例如:

settings.php:

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

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


谢谢。

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

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

这是标准方法(查看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访问(如果不修复的话!)

例如,在explorer/chrome中调试时,是否有任何方法可以查看变量值


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

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


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

虽然这在服务器受损的情况下提供了很少的保护,但是如果您的源代码通过错误或其他漏洞(例如:)公开查看,则可能会受到影响越来越常见的方法是将各种凭据和参数设置为服务器环境变量

例如,在apache vhost/.htaccess中,您可以设置如下环境变量:

SetEnv DB_ADDRESS localhost
...
在PHP代码中:

$DB_ADDRESS = getenv('DB_ADDRESS');
当然,您可以根据您的用例将该值分配给类常量、全局常量等

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


您的设置从来都不是硬编码的,在源代码中也不可访问。Heroku对应用程序配置使用了类似的方法。

相关:可能重复感谢。做了一个简短的搜索,但找不到。谢谢。MySQL是为localhost配置的,但我有其他敏感数据,如私钥和facebook机密ID。谢谢,当我的代码变为“在线”时,听起来是个不错的解决方案。