2

我最近制作了一个带有用户名和密码登录的 PHP 登录脚本,用于使用会话和没有 MySQL 的测试。

我将密码存储在这样的数组中

$filepassword[1] = "123"; // User Bob
$filepassword[2] = "321"; // User Tim

用户名以相同的方式存储在数组中,如下所示

$fileuser[1] = "Bob"; // Password 123
$fileuser[2] = "Tim"; // Password 321

我使用 Post 获取输入的密码,然后将其放入 for 循环中,如果密码在数组中等于 1,它会中断并返回 1,然后检查数字是否与用户名匹配并检查是否匹配。

但是,我应该将密码甚至它们的哈希值存储在 php 文件中吗?

4

4 回答 4

12

为什么要使用 php 文件来存储用户名和密码?使用数据库检索用户名/密码是非常标准的(现在也很简单)。

话虽如此,您不想将密码以纯文本形式存储在数据库中。

PHP 5.5 推出了一组全新的密码函数,那么您如何使用一个允许这些函数向前兼容的库呢?密码兼容

关键是,您包含文件,使用它的功能,然后当 5.5 出来时,您只需删除包含,所有功能仍然可以工作,因为它们是核心的一部分。

使用起来非常简单:

  • 使用哈希密码password_hash()
  • 将用户名和哈希存储在数据库中
  • 登录时,用于password_verify()根据数据库中的哈希验证 $_POST 中发送的密码。

而已!简单、安全、向前兼容。强烈推荐超过平面文件存储。


你真的应该花时间学习 MySQL。但是,最好将代码编写为接口而不是具体实现,并随时将一种存储类型切换为另一种存储类型。

话虽如此,散列您的密码和用户名,如果必须,将它们写入文件。至少它们会被散列,而不是纯文本。您仍然可以使用上述功能。

你甚至可以serialize()将你的数组写入一个文件,然后unserialize()在返回的路上。但我真的建议您花时间学习 MySQL 的基础知识,您很快就会学会它。

于 2013-05-29T09:49:03.817 回答
2

好吧,是的,不是的。

PHP 是一种服务器端语言,因此通过客户端没有人可以看到密码。

但是 1:如果黑客可以访问服务器,您的密码不会被保存和泄露。2:出现错误,php文件不是php而是文本,因此服务器将PHP输出为文本,再次受到攻击

因此,从某种意义上说,强烈建议至少对它们进行哈希处理以确保安全。

然后是将其保存在 php 文件中的问题。它有一些问题。1:使用起来并不容易,使用数据库可以进行很好的搜索等 2:您在 php 中加载(及时)巨大的数组,只需要 1 个值。浪费内存

于 2013-05-29T09:48:44.567 回答
0

对于少量密码,将它们存储在文件中是完全可行的。你应该只选择一个理智的数组格式,你的......非常不理想。此外,如前所述,永远不要以明文形式存储密码。

密码.php

<?php

return array(
    'Bob' => '$2y$10$lwnevwevweuvuev...',  // hash of Bob's password
    ...
);

登录.php

<?php

// include https://github.com/ircmaxell/password_compat functions
require_once 'lib/password.php';

$passwords = require 'passwords.php';

if (isset($_POST['username'], $_POST['password'])) {
    if (!isset($passwords[$_POST['username']])) {
        die('Invalid username');
    }
    if (!password_verify($_POST['password'], $passwords[$_POST['username']])) {
        die('Invalid password');
    }
    echo 'Hi there!';
}

只要您使用稳健的算法正确存储密码将它们存储在文件中几乎不会比使用数据库更不安全。需要注意的是,您应该非常小心,不要意外泄露该 PHP 文件的内容;错误放置var_debug($passwords)或配置错误的 Web 服务器可能会使密码散列公开可见。在这种情况下,它们仍然是散列的,但最好将它们保密。使用经过验证且用户友好的库进行散列,例如https://github.com/ircmaxell/password_compat

于 2013-05-29T10:00:59.637 回答
-5

我认为最安全的选择是使用 md5() 函数。$fileuser[1] = md5($fileuser[1]); ETC...

将所有内容转换为 md5,然后您可以将转换后的字符串相互比较是否相等。

希望我有帮助。

于 2013-05-29T09:49:39.350 回答