我最近做了一个php登录脚本,其中有一个用户名和密码登录,用于会话测试,没有mysql。
我把密码存储在这样的数组中
1 2
| $filepassword[1] ="123"; // User Bob
$filepassword[2] ="321"; // User Tim |
用户名以同样的方式存储在类似这样的数组中
1 2
| $fileuser[1] ="Bob"; // Password 123
$fileuser[2] ="Tim"; // Password 321 |
我使用post获取输入的edd密码,然后将其放入for循环,如果密码在数组中等于1,则它将中断并返回1,然后检查数字是否与用户名匹配,并检查是否匹配。
但是,应该在PHP文件中保留密码,甚至是密码的散列值吗?
- 你不应该直接存储密码,只存储他们的哈希!
- 密码要散列并存储在数据库中,而不是数组中。
- 把它们放在哪里并不重要,重要的是如何存放。参见stackoverflow.com/questions/4795385/…
- 好的,但是假设我确实要散列它们,那么我可以将它们存储在一个包含在检查函数中的.php文件中吗?
- @Alien先生,对于只有很少用户的网站(主要是更新网站上的内容),可以将用户存储在文件中。
- 检查此链接
- 嗯,我不知道如何使用MySQL,所以我不知道如何用PHP中的for循环检查它,但我想不出一个理由,甚至在我的电脑上安装MySQL,只是为了测试和在我的电脑上乱搞。
- 您可能选择了有史以来最复杂的阵列设置。简单的$array[$username] = $password有什么问题?
- 哦,我想我做了@deceze,我没有想到这一点,就像我说的,我只是在胡闹,我刚开始使用php,这是我第一次使用post,includes和函数。
- 如果你学习一些教程的话,你会发现MySQL非常简单、有趣、简单。
- @Jimbo我会查出来的,我认识一些人,他们知道一点,我可以为一些需要它的东西建立数据库。只是不知道如何管理或真正使用它们。
- @loper324快速分步:您的数据库有:id、用户名、哈希。当有人注册时,您散列密码并将用户名和散列存储在数据库中。当他们登录时,他们的用户名和密码是$_POST,从数据库中获得哈希(通过获取该用户名的所有详细信息),然后使用password_verify($_POST['password'], $hashFromDatabase)。如果true,他们可以登录。简单。
为什么要使用PHP文件来存储用户名和密码?使用数据库进行用户名/密码检索是相当标准的(现在也很简单)。
也就是说,您不希望将密码以纯文本形式存储在数据库中。
php 5.5有了一套全新的密码函数,那么您如何使用一个允许这些函数向前兼容的库呢?密码兼容。
要点是,您包含文件,使用它的函数,然后当5.5出现时,您只需删除include,所有函数仍然可以工作,因为它们是核心的一部分。
使用起来非常简单:
- 使用password_hash()散列密码
- 将用户名和哈希存储在数据库中
- 登录时,使用password_verify()根据数据库中的散列验证以$u post发送的密码。
就是这样!简单,安全,向前兼容。强烈推荐使用平面文件存储。
你真的应该花点时间学习MySQL。但是,编写一个接口的代码而不是具体的实现,并在任何时候根据需要将一种类型的存储切换到另一种类型是非常好的。
也就是说,散列你的密码和用户名,如果必须的话,把它们写到一个文件中。至少它们将被散列,而不是纯文本。您仍然可以使用上面描述的函数。
您甚至可以将数组中的serialize()写入一个文件,然后在返回的路上将它写到unserialize()中。但是我真的建议你花点时间来学习MySQL的基础知识,你很快就会学会的。
- 所以我需要将密码存储在一个MySQL数据库中,这样它才不会受到人的攻击。这些函数是否也会停止我一直听到的SQL注入,或者是我不必担心新函数的某些问题?
- 好问题!!您将密码的哈希值存储在数据库中,而不是密码本身以确保安全。很高兴你真的想以正确的方式去做。您使用PDO(或mysqli,起初可能更简单)和准备好的语句来防止这种情况发生。同样,整个网络上都有一些简单的教程,如果你打算学习这些教程,你会做得很好。如果您选择PDO,这里有一个很好的教程。
- 为了保证密码的安全,您不需要mysql(或任何其他数据库)。正确地散列密码是这里的重要部分,而不是它存储的地方。您可以将散列存储在服务器上的passwords.txt文件中(具有适当的文件权限,不可通过Web访问),它们与数据库中的散列一样安全。
- @Jimbo谢谢你的链接,我已经把它加入书签,等我有机会的时候再看。
- @CarlosCampterr&243;的"我的帖子"已经解释了,尽管(老实说)不是首选的方法,但您仍然可以使用平面文件来完成它。
- Jimbo你的文章很好地解释了这一点,但是首先@loper324的回复似乎假设他需要一个安全的数据库,这对于安全来说确实不是必要的(尽管处理数据非常方便)。
- @卡洛坎普德的公平观点。只是试着教导人们,简单的方法并不总是最好的方法;)
- @Jimbo我同意,我宁愿把它放在服务器端并保证它的安全。
- 另外@jimbo我只听说过这个系列,到底是什么,有教程或链接吗?
- @loper324对于任何PHP函数,请使用PHP手册(您总是可以通过在Google中键入来找到它,例如,"php serialize")。serialize只是将数据转换为可存储的表示形式,您应该尝试使用var_dump(serialize($yourArray)),看看它是什么样子的。只是让它可以储存。为了让它回到原来的样子,你又来了。
- @Jimbo我将查看这些教程,现在还将重新编写我的代码以使用带有用户名的数组。现在,我想我已经准备好了所有我需要的东西,可以持续一周的研究和指导。谢谢大家的帮助。
是的,也不是。
PHP是一种服务器端语言,因此通过客户机没有人能看到密码。
但是1:如果黑客访问服务器,您的密码不会被保存和泄露。2:出错了,php文件不是php而是文本,所以服务器将php输出为文本,再次受到影响。
因此,在某种意义上,强烈建议至少散列它们以确保安全。
然后是将其保存到PHP文件中的问题。它有一些问题。1:使用起来不容易,有了数据库,你可以进行很好的搜索等。2:在PHP中加载一个(及时的)大型数组,只需要1个值。记忆的浪费
- 只要我散列密码,它就可以安全地免受远程攻击。只需要担心FTP或PC上的人?(我正在运行一个本地主机网站来测试这个)
- 好吧,是的,只要你把它们散列就安全了(我们是一个很好的方法,我使用bcrypt)。
- 我只是从这样的事情开始,所以我会尝试所有这些方法。
对于少量密码,将它们存储在文件中是完全可行的。你应该选择一个健全的数组格式,你的格式是…相当不理想。而且,正如前面所说,永远不要以纯文本形式存储密码。
密码
1 2 3 4 5 6
| <?php
return array(
'Bob' => '$2y$10$lwnevwevweuvuev...', // hash of Bob's password
...
); |
Login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?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。
- 我同意我检查用户名和密码的设置是非常疯狂的,我从来没有想过像这样检查它,我只是跳到第一个想法,我没有计划,除了做一个登录脚本。
我认为最安全的选择是使用md5()函数。$fileuser[1]=md5($fileuser[1]);等。。。
将所有内容转换为MD5,然后可以将转换后的字符串相互比较以获得相等或不高质量。
希望我能帮上忙。
- 怎么能说md5()是安全的…看来你得抓紧W.R.T.的安全和散列
- 不,不要使用MD5。它很容易受到暴力攻击。做一个简单的谷歌"为什么MD5是不安全的"或不安全的,或沿着这些路线。我记不住这些数字,但是一个强大的GPU可以在几分钟内破解任何MD5散列。
- 我同意@jimbo,这是一篇很好的文章,上面有我今天刚读到的数字
- 有趣的是,你们这些家伙胡说八道,却没有真正理解为什么MD5被贴上倾向于暴力的标签。哦,不是每个人都有思考的能力。
- 很多人都很幸运地让安全专家来解决安全问题,而不是自己动手。