安全数据库连接功能?

时间:2014-11-11 10:00:36

标签: php function security sqlconnection

我一直在阅读通过不同的安全方式连接到数据库,并希望在我将自己与我的实际数据库联系起来,如果它没有安全优势或简化数据库之间的切换之前,将这个想法传递给您。 。

我认为在使用该函数并且已经连接到相关数据库之后,它将确保db_ *变量被终止:

<?php
function dbconn($db_hostname='localhost',
                $db_username='',
                $db_password='',
                $db_database='database1'
                $db_object='connection') {

    if($db_username=='' && $db_password=='') {
        switch ($db_database) {
            case 'database1':
                $db_username='user1'; 
                $db_password='pass1';
                break;
            case 'database2':
                $db_username='user2'; 
                $db_password='pass2';
                break;
            default: 
                echo "No database defined to connect to";
                break;
        }
    }
    else if($db_password=='') {
        switch ($db_username) {
        case 'root':
            $db_password='rootpass';
            break;
        case 'user':
            $db_password='userpass';
            break;
        default:
            echo "No password known for this user";
            break;
        }
    }

    $db_object= new mysqli($db_hostname, $db_username, $db_password, $db_database);
    if ($db_object->connect_error) die($db_object->connect_error);
} 
?>

1 个答案:

答案 0 :(得分:1)

根据您提供的代码,我不清楚您要尝试做什么。但是,我可以回答您的问题:“什么是连接数据库的安全方式?”

使用PHP作为类似CGI的语言,安全连接的主要问题是您的配置文件可能会暴露。有两种可能的解决方案:

1。一个PHP文件作为您的配置

这可能是最常用的方法,特别是在可再发行软件中经常使用。通过使“配置文件”成为简单设置变量并包含在其他页面中的PHP文件,PHP解释器将解析此文件,而不是返回其内容。文件的位置并不重要 - 只要它是可以执行PHP文件的地方。在典型的应用程序中,这位于uploads目录的文档根之外的任何位置。

示例配置文件(db_config.php):

<?php

$db_host = "localhost";
$db_user = "username";
$db_pass = "password";
$db_database = "database_name";

您只需在初始化/标头/等中require('db_config.php');。代码。

您应该只使用配置连接的配置文件,而不是制作它。这样,它可以轻松更改稍后您的连接代码,而无需在运行应用程序的每台服务器上修改配置文件。

2。序列化配置文件

或者,您可以使用JSON或YAML之类的东西来创建配置文件。主要优点是您可以对需要连接到同一数据库但不是用PHP编写的任何辅助脚本或应用程序使用相同的配置文件。

但是,您从不将此文件放在文档根目录中。就您的网络服务器而言,JSON或YAML文件是“可查看”文件,它会愉快地显示给任何有URL的人。

使用JSON / YAML /等的正确方法。 file作为配置文件,是为了确保将置于文档根目录之外,以便网络服务器无法将其提供给用户。 试图给它一个'不可饶恕的'名称是足够。

可能也使用.htaccess这样的内容,但不推荐因为它会更难改变其他网络服务器,并且可能会暴露网络服务器错误配置你的数据库连接细节。仅将其用作绝对最后手段

其他考虑因素

我想在此处讨论其他三个要点。

多个数据库凭据

在原始代码中,您似乎正在尝试添加一个功能,您可以在其中选择要选择的数据库。实际上,这几乎不是你想要的。每个服务器/安装应该只有自己的数据库凭据。

如果您遵循我为存储配置数据提出的建议,那么在每个系统上都可以很容易地获得单独的配置文件,而无需更改它。如果您正在使用Git或其他允许您忽略文件的版本控制系统,则可以安全地(并且应该)使其忽略配置文件。您只需在每台服务器上拥有不同的配置文件。

整体安全

当然,您应该确保整体安全性处于正常工作状态。如果您有LFI漏洞或有人可以将shell上传到您的服务器,那么在文档根目录之外放置文件的数量不会保护您的数据库凭据。 OWASP是一般(网络)应用程序安全性的合适资源。

PDO或mysqli_

根据您的代码片段判断,您使用的是mysqli_。如果您正确使用参数化/准备好的查询,这个可以是一个有效的选择,我不建议使用它。 PDO 是一个独立于数据库的SQL库,它更关注参数化查询。它默认包含在最近的每个PHP安装中,作为奖励,它可以让你在不同的SQL服务器之间切换。

使用参数化(“准备好”)语句绝对至关重要 - 它是防止SQL注入的唯一可靠方式,这似乎是您要保护自己免受攻击的最重要问题。可以找到goood入门指南here