我目前正在从事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变量的建议,但我觉得它并不安全。
PHP是一种服务器端语言。这意味着,当请求的页面被发送回客户端时,所有的PHP代码都会被解析并"删除"。只要你是唯一一个能够查看你的文件的人,就没有恐惧。
是否将其存储在(env)变量中不会有任何区别。
这个代码绝对没有错;)
编辑:
然而,当您执行SQL查询时,您需要小心。通常,您使用用户输入(URL或POST数据)来设置查询中的某些值。例如:
$sql = 'SELECT * FROM `table` WHERE `id`=' . $_GET['id'];
$_GET['id']
变量设置在URL中(index.php?id=4
)。
如果他们将值4
更改为SQL查询,那么他们几乎可以对数据库执行所有操作。这称为SQL注入。它确实是使用数据库的web应用程序的最大威胁。
有多种修复方法。
- 对输入进行Sanitize(确保输入不包含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被解析并删除。
我使用环境变量来存储数据库身份验证信息:也就是说,数据库的主机/用户/密码位于Apache配置中的SetEnv命令中,这些命令显示在$_SERVER
中。
为什么要这样做?
- 开发环境和生产环境需要不同的值,因此让应用程序读取某种环境配置是必要的
- 应用程序代码位于源代码存储库中,可轻松浏览。。。将身份验证秘密嵌入其中将使这些秘密同样广泛可用
环境变量并不是唯一的解决方案:例如,包含一个设置某种配置对象的文件也可以。但大多数人似乎都在进化一些系统,将配置设置(以及仅设置)放在一个可更改的点上,与使用这些设置的代码分开,后者按照完全不同的时间表进行更改。