【问题标题】:Storing sensitive data in PHP在 PHP 中存储敏感数据
【发布时间】:2012-06-01 13:53:38
【问题描述】:

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

settings.php:

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

我的问题,它足够安全吗? 例如,在资源管理器/chrome 中调试时有什么方法可以查看变量值? 有没有其他更安全的方法?

谢谢。

【问题讨论】:

标签: php


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    SetEnv DB_ADDRESS localhost
    ...
    

    在你的 PHP 代码中:

    $DB_ADDRESS = getenv('DB_ADDRESS');
    

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

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

    SetEnv APPLICATION_ENV development - .htaccess interacting with Zend Framework?

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

    【讨论】:

    • 谢谢,当我的代码“在线”时,这听起来是个不错的解决方案。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您的后端代码永远不应出现在前端,除非您的设置出现严重问题。如果发生这种情况并且您的后端源代码“泄露”——不太可能,但possible——那么您的密码将一目了然。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 谢谢。 MySQL 是为 localhost 配置的,但我还有其他敏感数据,例如私钥和 facebook 秘密 ID。
        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2017-09-05
          • 2020-02-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-27
          相关资源
          最近更新 更多