数据库连接的安全性

时间:2013-08-20 15:20:36

标签: php mysqli

昨天我制作了第一个连接到数据库的PHP脚本,在SO的帮助下,它现在可以工作了! 此脚本在我的localhost上运行。我现在想将脚本添加到实时网站,但我担心安全性。有问题的网站是基于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文件中包含的连接详细信息?我是否缺少任何其他重要的安全考虑因素?

2 个答案:

答案 0 :(得分:1)

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

基本上,使用正确配置的服务器,任何人都无法访问您的PHP源代码,因此没有人能够从该源代码获取您的数据库凭据。如果某个恶意用户确实可以访问您的Web服务器,那么存储这些数据的位置就不会有所不同。

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

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

答案 1 :(得分:0)

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

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

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