保护PostgreSQL数据库连接

时间:2012-02-22 13:25:14

标签: php security postgresql

我目前正在开发一个php / PostgreSQL / JQuery项目,而且我是所有这些领域的绝对初学者。在Php中,要连接到我的数据库,我发现的最好方法是包含一个php 在所有需要它的PHP脚本中使用用户和密码的脚本,像这样。 include('../scripts/pgconnect.php');

使用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变量的建议,但我发现它并不安全。

2 个答案:

答案 0 :(得分:4)

PHP是一种服务器端语言。这意味着当请求的页面被发送回客户端时,所有PHP代码都会被解析并被删除"。只要你是唯一一个能够查看文件的人,就不用担心。

是否将其存储在(env)变量中或不会产生单一的差异。

这段代码绝对没有错;)


编辑:

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

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

$_GET['id']变量在网址(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

最后编辑(我发誓):

如果您决定将配置变量放在extern文件中,请说配置.php,确保文件以.php扩展名结尾。如果您使用不同的扩展程序,人们可能会找到它并以纯文本格式查看。如果使用PHP扩展,他们将无法看到任何东西,因为就像我说的那样,解析并删除了PHP。

答案 1 :(得分:1)

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

为什么这样?

  1. 开发和生产环境需要不同的值,因此有必要让应用程序读取某种环境配置。
  2. 应用程序代码位于源代码存储库中,可以轻松浏览...将身份验证机密嵌入其中会使这些内容广泛可用。
  3. 环境变量不是唯一的解决方案:例如,包含设置某种配置对象的文件也会起作用。但是大多数人似乎都在进化一些系统,以便在一个可更改的点上进行配置设置(以及设置),与使用这些设置的代码分开,这些设置会根据完全不同的时间表进行更改。