昨天我制作了第一个连接到数据库的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文件中包含的连接详细信息?我是否缺少任何其他重要的安全考虑因素?
答案 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框架中,这是一种非常常见的技术。将敏感文件存储在应用程序目录上,并将来自外部的所有流量重定向到应用程序目录。