我最近制作了一个带有用户名和密码的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文件中?
发布于 2013-05-29 17:49:04
为什么要使用php文件来存储用户名和密码?使用数据库进行用户名/密码检索是非常标准的(现在也很简单)。
也就是说,不希望将密码以纯文本形式存储在数据库中。
PHP5.5已经推出了一个whole new set of password functions,那么你可以使用一个允许这些函数向前兼容的库吗?Password_compat。
重点是,你包含这个文件,使用它的函数,然后当5.5发布时,你只需删除包含,所有的函数仍然有效,因为它们是核心的一部分。
它使用起来非常简单:
在database
password_hash()
就这样!简单,安全,向前兼容。强烈推荐使用平面文件存储。
你真的应该花点时间学习MySQL。但是,将代码编写为接口而不是具体实现,并随时将一种类型的存储切换为另一种类型的存储是很棒的。
也就是说,散列您的密码和用户名,如果需要的话,将它们写入一个文件。至少它们是散列的,而不是纯文本。您仍然可以使用上面描述的函数。
您甚至可以serialize()您的数组并将其写入一个文件,然后在返回的过程中对其执行unserialize()操作。但我真的建议你花点时间来学习MySQL的基础知识,你很快就会学会的。
发布于 2013-05-29 17:48:45
嗯,是也不是。
PHP是一种服务器端语言,所以通过客户端没有人能看到密码。
但是1:如果黑客访问了服务器,你的密码不会被保存和泄露。2:犯了一个错误,php文件看起来不是php而是text,所以服务器将PHP输出为text,再次受到损害
因此,从某种意义上说,强烈建议对它们进行散列处理,至少是为了安全。
然后就是将其保存到php文件中的问题。它有一些问题。1:不容易使用,有了数据库你可以进行很好的搜索等等2:你在php中加载一个(及时)巨大的数组,只需要1个值。内存浪费
发布于 2013-05-29 18:01:00
对于少量密码,将它们存储在一个文件中是完全可行的。你应该选择一个合理的数组格式,你的是...相当不理想。此外,正如前面所说的,永远不要以明文形式存储密码。
passwords.php
<?php
return array(
'Bob' => '$2y$10$lwnevwevweuvuev...', // hash of Bob's password
...
);login.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。
https://stackoverflow.com/questions/16810573
复制相似问题