2

昨天我制作了我的第一个连接到数据库的 php 脚本,在 SO 的帮助下,它现在可以工作了!该脚本在我的本地主机上运行。我现在想将脚本添加到实时站点,但我担心安全性。有问题的网站是一个基于 PHP 的 CMS。在这个 CMS 中有一个名为“detail.php”的脚本,用于在特定页面上生成内容。我昨天制作的脚本出现在这个内容中,所以我只是将我的 mysqli(称为“get_vote_date.php”)脚本添加到与 detail.php 相同的目录中

<?php
                        include("get_vote_date.php")  
                        ?>  

脚本如下所示:

<?php # script get_vote_date

// This file contains the db info
// This file establishes a mysql connection, connects to the db and then gets the most recent vote date for a particular page (incident_id).

DEFINE ('DB_USER','myname');
DEFINE ('DB_PASSWORD','pass123');
DEFINE ('DB_HOST','localhost');
DEFINE ('DB_NAME','local_sitename');


// make the db connection
$dbc = @mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME)
    OR die ('Could not connect to mysql: ' . mysqli_connect_error());

// Set the encoding
mysqli_set_charset($dbc, 'utf8');

// set the query variable
$query = "SELECT MAX(rating_date) 
          AS last_date
          FROM rating
          WHERE incident_id = $incident_id;";

//connect and run the query
$result = mysqli_query($dbc, $query);

 echo $result->fetch_object()->last_date;

?>

如您所见,这里有敏感信息 - 数据库连接数据。如果我只是按原样添加脚本就足够了吗?我并不想在这里超越合理的预防措施,我的目标是仅添加具有合理安全性的脚本。

我确实注意到在配置文件中有一个 database.php 文件似乎也保存了连接数据:

$config['default'] = array(
    'benchmark' => TRUE,
    'persistent' => FALSE,
    'connection' => array(
        'type' => 'mysqli',
        'user' => 'myname',
        'pass' => 'somepass123',
        'host' => 'localhost',
        'port' => FALSE,
        'socket' => FALSE,
        'database' => 'local_sitename',
    ),
    'character_set' => 'utf8',
    'table_prefix' => '',
    'object' => TRUE,
    'cache' => FALSE,
    'escape' => TRUE
);

我的直觉告诉我,调用这些变量比将它们包含在脚本中更安全。是对的吗?我是 PHP 新手,甚至必须研究如何在此处选择数组中的变量。例如,上面调用“pass”的语法是什么?如果这甚至是最好的事情?

我应该让脚本保持原样,还是应该调用 config/database.php 文件中包含的连接详细信息?我是否遗漏了任何其他重要的安全注意事项?

4

2 回答 2

1

安全方面,它不应该改变这些信息的存储位置。只要 PHP 工作正常(意味着它实际上是在执行而不是显示为纯文本),那么您的信息应该是安全的(当然,除非另一个用户可以访问服务器本身)。

本质上,使用正确配置的服务器,没有人应该能够访问您的 PHP 源代码,因此没有人应该能够从该源代码中获取您的数据库凭据。如果恶意用户确实以某种方式访问​​了您的 Web 服务器,那么这些数据的存储位置不会有任何影响。

我认为这里的问题更多是效率而不是安全性。我个人总是将我的数据库凭据存储在一个文件中,然后将该文件包含在与我的 MySQL 数据库交互的所有其他文件中(通常我称之为db.php)。如果我的数据库凭据发生更改,我可以很容易地简单地编辑db.php,而不是遍历我的文件并在每次列出凭据时都更改凭据。最后的结果还是一样的。

因此,为了回答您的问题,我将包含该database.php文件并使用$config阵列中的数据库凭据。您的 CMS 很可能使用我上面提到的相同方法,这就是为什么(我假设)您只在 中输入了一次数据库凭据database.php,并且该文件包含在与数据库交互的所有其他 CMS 文件中。

于 2013-08-20T16:09:22.797 回答
0

为了获得额外的安全性,要考虑的另一件事是使用 htaccess 文件将所有请求重定向到某个目录。这在共享主机环境中尤其有用。假设您希望所有流量都转到您的“应用程序”文件夹。然后,在您的 Web 根目录中,创建一个文件夹“应用程序”,并在应用程序文件夹旁边放置一个 .htaccess 文件,其中包含以下代码:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    application/    [L]
    RewriteRule    (.*) application/$1    [L]
</IfModule>

这是许多 PHP 框架中非常常见的技术。您将敏感文件存储在应用程序目录之上,来自外部的所有流量都被重定向到应用程序目录。

于 2013-08-20T17:10:30.307 回答