2012-02-22 75 views
1

我目前正在研究php/PostgreSQL/JQuery项目,并且我是所有这些域中的绝对初学者。在Php中,为了连接到我的数据库,我发现的最佳方式是在所有需要它的php脚本中包含一个带有用户名和密码的php 脚本,如下所示。 include('../scripts/pgconnect.php');保护PostgreSQL数据库连接

随着pgconnect.php:

$conn_string = "dbname=mydb user=myuser password=mypass";

$db = pg_connect($conn_string);

if(!$db){ die("Connection à la base impossible -> " . pg_errormessage($db));}

我相信在座的各位安全专家会嘲笑这一点,所以你可以告诉我什么是保持用户和偷窥窥探的最佳方式? 我发现堆栈溢出使用env变量的建议,但我不觉得它真的很安全。

+0

您可以通过点击答案左侧的V来接受一个(!)答案。它会让人们有动力回答你未来的问题。所以,请选择最好的答案。 – 2012-02-22 14:48:35

回答

4

PHP是一种服务器端语言。这意味着,当请求的页面被发送回客户端时,所有的PHP代码都会被解析和“删除”。只要你是唯一能够查看你的文件的人,就没有恐惧感。

无论是否将它存储在(env)变量中,都不会产生任何差异。

但绝对没有错的代码;)


编辑:

当你执行一个SQL查询但是,你要小心。通常,您使用用户输入(URL或POST数据)来设置查询中的某些值。例如:

$sql = 'SELECT * FROM `table` WHERE `id`=' . $_GET['id']; 

$_GET['id']变量在URL(index.php?id=4)来设置。

如果他们将值4更改为一些SQL查询,他们几乎可以做任何事情与您的数据库。这被称为SQL injection。这确实是使用数据库的Web应用程序的最大威胁。

有多个修复程序。

  • 净化输入(确保输入不包含SQL语法)
  • 准备语句

现在,我不熟悉的PostgreSQL,但显然PHP模块具有发送准备好的语句的能力。这使您可以将带有未知值的查询作为问号发送,然后发送值。

$sql = 'SELECT * FROM `table` WHERE `id`=?'; 
// send prepared statement 

$value = $_GET['id']; 
// send the value 

这样数据库可以告诉该值是无查询。

就像我说过的,我对PostgreSQL并不熟悉,但我确信有一些教程会指导您一路完成!


另一个编辑:

因为我是一个好人,我发现怎么办呢!您需要使用功能pg_prepare()pg_execute()。就像这样:

// This is a name to allow the database to identify the prepared statement 
$queryname = 'my_query'; 

// Setting up our query with "empty" values 
$sql = "SELECT * FROM `table` WHERE `column`='$1' AND `column`='$2'"; 

// Setting our values to send afterwards 
$values = array(
    $_GET['first_value'], // The first value that will replace $1 
    $_GET['second_value'] // The second value that will replace $2 
); 

$result = pg_prepare($connection, $queryname, $sql); // Send the query to the database 
$result = pg_execute($connection, $queryname, array($value)); // Send the values 

最后编辑(我发誓):

如果你决定把你的配置变量在一个外部文件,让说的configuration.php,确保该文件结尾.php扩展名。如果您使用不同的扩展名,人们可能能够找到它并以纯文本形式查看它。如果使用PHP扩展,他们将无法看到任何内容,因为就像我所说的那样,PHP将被解析并删除。

+3

对不起,但这是一个可怕的建议。你应该*永远不要*以纯文本保存你的数据库密码,特别是不要在你的PHP文件中。 – AviD 2013-03-14 16:25:34

+1

@AviD PHP在发送给客户端之前被解析,他们看不到密码。除非有人直接访问服务器上的文件,否则没有威胁。为什么您认为世界领先的CMS以纯文本格式将数据库密码保存在PHP文件中?如果像你说的这样一个大问题,你有什么建议?即使你要加密它,你仍然需要解密它。当黑客有权访问您的服务器文件时,他们也可以查找解密算法。如果您使用任何其他扩展名,文本将不会被解析,并会以纯文本显示,甚至更糟糕。 – 2013-03-15 10:02:13

+4

当然它不会发送给客户端。除非有错误。或者是一些漏洞。或内部人员访问文件。或...为什么世界领先的CMS将文件保存为纯文本PHP文件?我没有任何线索。显然他们也不是。您的评论的其余部分毫无意义,并且对加密,保护和安全性有完全的误解。我建议你在将自己称为专业开发人员之前,对这些主题做一些作业。 – AviD 2013-03-15 12:28:00

1

我使用环境变量来存储数据库身份验证信息:也就是说,数据库的主机/用户/密码位于Apache配置中的SetEnv命令中,该命令出现在$_SERVER中。

为什么这样做?

  1. 开发和生产环境需要不同的值,所以让应用程序读取某种环境配置是必要的。
  2. 应用程序代码位于源代码存储库中,该代码存储库很容易浏览...将认证机密嵌入到该存储库中可使这些应用程序广泛使用。

环境变量不是唯一的解决方案:例如,包括一个设置某种配置对象的文件也可以。但是大多数人似乎在一个可变点上发展了一些配置设置(以及设置)的系统,与使用这些设置的代码分开,这些代码在完全不同的时间表上发生变化。

+0

谢谢大家的意见。我会仔细阅读pg_prepare文档(不知道这些)再次考虑env变量的用户/传递信息。 – 2012-02-22 14:02:05