3

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

设置.php:

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

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

谢谢。

4

6 回答 6

6

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

于 2012-06-01T13:55:56.383 回答
5

虽然这在服务器受损的情况下提供的保护很少,但如果您的源代码通过错误或其他漏洞公开可见(例如: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 开发 - .htaccess 与 Zend 框架交互?

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

于 2012-06-01T14:45:57.240 回答
3

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

于 2012-06-01T13:55:26.717 回答
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 访问(如果不修复它!)。

于 2012-06-01T13:55:56.700 回答
2

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

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

于 2012-06-01T13:58:00.283 回答
1

例如,在资源管理器/chrome 中调试时有什么方法可以查看变量值?

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

于 2012-06-01T13:56:21.623 回答