设置没有密码的PDO连接

时间:2014-04-08 19:33:49

标签: php mysql pdo

我试图连接到我的数据库,但出于安全考虑,我更改了数据库的root密码。但是,为了连接到数据库并使用PDO,我显然必须在php中传递我的密码,这显然不利于安全:

$hsdbc = new PDO('mysql:dbname=hs database;host=127.0.0.1;charset=utf8', 'root','passwordgoeshere');

$hsdbc->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$hsdbc->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我是愚蠢的,因为它没有PHP,但查看实际文件的人将能够看到密码,或者有没有办法在不传递文件密码的情况下执行此操作

5 个答案:

答案 0 :(得分:1)

人们无法直接阅读您的文件。它们应该在您托管它的地方安全。如果他们能够在您托管您的东西时进入该位置,他们只能访问文件。如果他们没有到达那里的信息,这是不可能的。(这应该只为你所知)。

这不仅适用于PDO。而且我的mysql和mysqli也是这样做的

答案 1 :(得分:1)

一般来说,在非面向用户的文件中使用连接字符串并不错。如果你不想在php文件中输入你的个人密码,那么你可以为php创建一个新的mysql用户。

您还可以将MySQL中用户的IP地址限制为托管PHP脚本的服务器。这样,如果以某种方式浏览网页的邪恶人员能够看到数据库密码,他们将更难以访问它。

答案 2 :(得分:1)

要扩展SupSon(SC2 Select fan?)的回答:

PHP本身就是服务器编码语言。

只有3种方式(如果有人想添加它可能更多)可以向外部用户显示代码:

  1. 通过使用不安全的.htaccess文件将php文件显示为文本 文件(那么你应该在那时移动服务器,因为通常 这不会发生)
  2. 不知何故,您在调试模式和页面中的某些操作 触发此模式,您将获得一大堆PHP代码
  3. FTP / SSH访问您的.php文件(那么您拥有的不仅仅是PDO 你手中的问题)
  4. 因此,如果其中一种情况发生,编码为.php文件,您的用户名/密码将不会违反安全规定。

答案 3 :(得分:1)

当PHP的Apache类型处理程序意外取消配置时,我看到了暴露PHP代码的网站。然后显示.php文件中的代码而不是执行。还有一个Apache类型处理程序可以故意显示PHP源代码,但通常不会这样配置。

要避免此漏洞,将敏感的PHP代码放在htdocs目录之外是一种很好的做法。相反,在htdocs目录中放入一个最小的PHP脚本,使用include()require()加载其余代码。

另一种方法是将MySQL凭据放在配置文件中而不是PHP代码中。例如,/ etc / my.cnf和$ HOME / .my.cnf使用的文件格式可由PHP函数parse_ini_file()读取。通过这种方式将MySQL密码存储在代码之外很容易。

例如,从/etc/my.cnf的[mysql][client]部分阅读用户密码

$ini = parse_ini_file("/etc/my.cnf", true);

if (array_key_exists("mysql", $ini)) {
    $connect_opts = array_merge($connect_opts, $ini["mysql"]);
} else if (array_key_exists("client", $ini)) {
    $connect_opts = array_merge($connect_opts, $ini["client"]);
}

$pdo = new PDO($dsn, $connect_opts["user"], $connect_opts["password"]);

答案 4 :(得分:0)

是的,一开始它似乎不安全,但是一旦您掌握了它的窍门并知道如何管理您的文件以最大限度地减少潜在的安全漏洞,您就可以最大限度地降低与在可能公开的空间中以纯文本形式存储密码相关的风险。然而,AFAIK PDO 甚至不允许您在不提供密码的情况下建立连接。解决方案是每个人都说过的,然后是一些的组合。这是我的工作快速指南。

出于不同目的将 SQL 用户分开(最大限度地减少 SQL 注入或黑客帐户造成的损害):

您需要访问的每个表都应该有一个特定于 PHP 的用户。该用户将仅被授予足够的权限来处理他需要处理的该表,如果不需要删除,则不要授予它删除权限。如果它不需要选择,则不要授予它选择权。这看起来很麻烦,但很快你就会有一个复制粘贴模板来制作用户,给他们他们需要的权利,并记录下来。如果有连接表,您自然还希望授予用户对该表的访问权限。

-- a single user account for a specific purpose:
CREATE USER 'usermanager'@'localhost' IDENTIFIED BY '5765FDJk545j4kl3';
-- You might not want to give access to all three here:
GRANT SELECT, UPDATE, INSERT ON db.users to 'usermanager'@'localhost';

这样做的目的是,如果您的代码中存在允许 SQL 注入的错误,他们将无法造成超出该角色所能做的范围的任何损害。

如果将 PHP 代码和文件留在目录中,愚蠢的错误可能会泄露它们,将它们移出:

不要介意透露源代码,即使只是尝试“乱序”访问 php 文件也可能具有破坏性。

将尽可能多的文件移至范围外目录。然后像这样称呼他们:

require_once('../lib/sql_connectors.php');

这应该会避开您的 html/webdir,并且您应该希望能够在愚蠢的管理员错误可能揭示的范围之外存储各种有趣的东西。

您甚至可以拥有一个 php 文件,它可以从您的 webdir 外部获取图片和视频,这就是流媒体站点如何保护其资源并执行基于 php 的身份验证以访问文件。要了解如何做到这一点,您需要查找分配您自己的 etag 标头以确保浏览器缓存您的 php 检索文件,否则您的服务器将非常繁忙,这里是 a short introduction

阻止对留在目录中的 PHP 的错误访问:

通过检查 $_SERVER['REQUEST_URI'] 不是它本身,可以保护您所有的目录内 PHP 文件。如果是,您可以使用一个名为 show404() 的函数来加载 404.php 页面并在那里消失,或者直接使用包含来调用您的 404.php。这样,即使您有黑客试图对您的 php 文件进行暴力破解,他们也永远不会看到它们,因为他们会收到 404 错误(愚弄机器人)并且他们会看到 404 页面(愚弄人类)。

我避免在任何公开可见的路径中使用 .php,为此,我在 .htaccess 文件中制定了如下重写规则:

RewriteEngine On
RewriteRule ^login$ login.php [L,QSA]

L 使它停止运行其他规则。

QSA 保留了 $_GET 标签。

每个文件 (consider prepending) 的第一行代码可以是:

// they should be connecting via a redirect, not directly:
$fileName = basename(__FILE__);
if ($_SERVER['REQUEST_URI'] === '/' . $fileName) {
    error_log('Security Warning: [' . $_SERVER['REMOTE_ADDR'] . '] might be trying to scrape for PHP code. URI: [' . $_SERVER['REQUEST_URI'] . ']');
    include('404.php'); // should point to your 404 ErrorDocument
    exit();
}
// redirect to actual file
include('../hidden/php/' . $fileName); 

在这个例子中,假设你的 .htaccess 中有重定向,上面有代码的 login.php,隐藏目录中有 login.php,用户会遇到以下两种情况: 尝试连接到 ' /login' 并查看 隐藏 '/login.php' 页面;尝试直接连接到可见的“/login.php”并得到 404 错误。


那些是 3 大事情,许多小的受限帐户可以在安全失败的情况下最大限度地减少损害,将所有可能的文件保存在 web 目录之外,并使所有目录中的 php 文件产生错误,只允许非 php 链接访问它们。