PHP密码保护

时间:2011-08-11 17:19:30

标签: php login security

我有以下PHP编码:

<?php
session_start();

$data=array("user1"=>array("url"=>"file1.php","password"=>"pass1"),
"user2"=>array("url"=>"file2.php","password"=>"pass2"));

if(isset($_POST['username']) && isset($_POST['password'])) {
    if($data[$_POST['username']]['password'] == $_POST['password']) {
        $_SESSION['username'] = $_POST['username'] . " " . $_POST['password'];
        header('Location: ' . $data[$_POST['username']]['url']);
    } else {
        login('Wrong user name or password. <br>');
    }
} else {
    login();
}
?>

我希望从另一个文件处理$ data =数组,以便它更安全一些。我怎么做到这一点?有什么想法吗?

4 个答案:

答案 0 :(得分:1)

data.php:

<?php

$data = array(.... user/password data here ...);

的login.php:

<?php

include('data.php');

... process login as usual

这不比你的版本更“安全”,因为它们仍然以明文形式存储密码,任何对文件级访问网络服务器的人都能够窃取你的用户“数据库”而不会闪烁

如果你坚持使用这种方法,至少将'data.php'文件放在网站文档根目录的某个地方,这样它就不在远程网络用户可以轻易到达的区域内。

答案 1 :(得分:0)

这不是保护内容的正确方法。您永远不应该在会话中存储密码,因为它可能会受到损害。这是一个关于loggin的教程:

http://www.phpeasystep.com/phptu/6.html

以下是php安全性的概述:

http://www.phpfreaks.com/tutorial/php-security

答案 2 :(得分:0)

当您说您应该将密码存储在其他位置时,您就走在了正确的轨道上。我建议使用数据库,但是如果你必须使用一个文件,那么你可以在PHP文件的开头读取文件。

关于安全性的真正的关注点是您以明文形式存储密码。如果有人收到您的密码文件,他们可以按原样查看密码。这非常危险。您应该使用称为哈希 salting 的技术:

当用户注册密码时,您哈希密码和用户唯一的随机字符串(称为salt)的组合。散列是一种单向函数,因此您获得的字符串无法与原始密码相反,但仍然是它的“指纹”。然后,将此“指纹”和相应的盐存储在数据库中。

当进行登录尝试时,您以相同的方式计算哈希值,并查看哈希值是否匹配。这样,您永远不会以明文形式存储密码。

盐的原因是为了防止使用称为彩虹表的攻击工具。使用每用户随机盐可防止攻击者使用预先计算的密码到哈希表。

有关此主题的更多信息,请查看http://codahale.com/how-to-safely-store-a-password/

答案 3 :(得分:0)

我想扩展Marc B的答案。

以纯文本格式保存密码永远不是一个好主意,在SESSION数据中保留密​​码是不好的做法,也不会持久。

以下是我在学习使用php验证用户身份时所做的一些笔记的链接。

http://pastebin.com/sFmBJda1

但是长话短说,您需要在某个数据库中散列并存储散列值。即使它不是真正的数据库。将散列值存储在可以解析的文本文件中比存储纯文本密码更好。

只需确保在对用户进行身份验证时,您可以像对密码进行哈希处理一样对密码输入进行哈希处理,然后与您存储的密码表/列表进行比较。