0

寻找一个php登录脚本。我已经搜索了 stackoverflow 并看到了很多帖子,但是任何人都可以推荐最好的方法吗?另外,如果我想使用散列,检索时如何解码密码?我的 iPhone 应用程序使用相同的数据库,目前密码以普通文本存储(我知道不是很安全)。

另外,如果我实现了一个重定向到 info.php 的登录页面,如何阻止用户直接进入 info.php 页面而不登录,会话控制?

期待听到您的意见。非常感谢。

4

7 回答 7

4

我的回答有点晚了,但无论如何我都会发帖,我知道这并不能直接回答这个问题,但它的相关性并非如此。以下是有关登录安全性的几点。

记得我

您最好重新散列散列密码,并将重新散列存储在用于自动登录用户的 cookie 中。当您重新散列密码时,使用特定于浏览器的内容作为种子,例如浏览器类型。这将有助于防止 cookie 被盗(通过人们窥探网络流量)。这有助于防止任何使用彩虹表的机会。

会话

注意会话劫持:http ://en.wikipedia.org/wiki/Session_hijacking

CSRF

跨站点请求伪造 - 在您登录后实施,但需要注意一些事情,因为它只影响登录的成员:http ://en.wikipedia.org/wiki/Cross-site_request_forgery

HTTPS

HTTPS 应该在登录请求被发送到的页面上使用 - 它不必在您输入登录详细信息的页面上!

散列

您可以使用 javascript 对密码客户端进行哈希处理,这只会在不使用 HTTPS 时通过网络传输密码时保护成员的密码不被盗。这很好,因为许多人经常对许多网站使用相同的密码。缺点是:您无法检查服务器端的密码长度,并且如果禁用了 javascript,他们将无法登录(尽管您可以在一定程度上对此进行编程)。几年前,雅虎曾经(可能仍然如此)这样做。

当您在服务器上收到密码时,通常会使用种子重新散列并存储在数据库中。这更安全,因为即使人们知道哈希,他们仍然无法登录!只有原始密码才会重新散列到让用户登录的相同散列。

键盘记录器

如果您想绕过键盘记录器(或大多数键盘记录器),您可以通过添加 JavaScript 小键盘/键盘来实现。然后,用户单击字母和数字以使用鼠标而不是键盘输入密码,这意味着键盘记录器很难记录密码。

知道某事,拥有某事,是某事

三个安全级别。有人知道的东西,例如密码,有人拥有的东西,例如电话(谷歌使用两步验证完成了前 2 项),以及有人知道的东西,例如指纹。您填写的越多,您的安全凭证就越大 - 从长远来看!!!

机器人

计算机有时会尝试强制快速登录页面(必须像密码错误一样快速,并且脚本会暂停甚至仅 1 秒,这大大减少了机器人可以进行的总登录尝试。为了帮助阻止这种情况,您可以暂停1 或 2 秒的错误登录(就像 linux 一样),或者您可以生成一个捕获,在 X 次错误登录后机器人很难解决(就像 google 那样)。

有要点,但我敢肯定还有其他的。

于 2012-11-22T13:58:54.167 回答
3

POST 到 HTTPS URL。

您永远不会解码散列密码。丢失的密码需要另一种机制来处理。

是的,会话控制。在登录时在会话中设置一个标志并在其他页面上检查它。

于 2010-10-20T04:51:22.477 回答
3

仍在开发中,但安全、快速、干净、良好且最新:

[最新版本] https://github.com/Panique/PHP-Login

【旧版网址】http://www.php-login.net

我在一些设计师和编码人员的帮助下创建了这个。它已在多个论坛上进行了讨论,并得到了非常积极的答复。所有当前问题都可以在 github 问题页面上查看。所有代码都是公开的、免费的和可分叉的。

于 2012-11-22T13:35:25.993 回答
3

这是一个关于登录系统设计的很棒的教程。它以面向对象的方式涵盖了所有主要主题,非常适合学习不同的注意事项。

可解码的密码并不安全,但我有客户坚持他们可以随意检索和更改密码,没有例外。因此,在某些情况下,我选择对 base64 编码的字符串进行加盐以存储在数据库中,这似乎工作得很好。存在一个功能来根据管理员用户的需要进行编码/解码。

实际上,会话控制(和/或 cookie)是控制访问的方法。使用面向对象的模式构建它可以让您在每页仅使用一两行代码(如果很常见,也可以在页眉中使用一行代码)来做到这一点。

我的一个警告是考虑您是否具有通用登录级别或需要用户级别权限。在您建立网站后,确定基于权限的登录很重要,这显然需要做更多的工作。如果一开始没有计划,它可能会变成一个真正的怪物。

于 2010-10-20T04:57:45.627 回答
2

您不需要解码密码,您必须将哈希密码存储在数据库中,当用户尝试登录时,您将存储的密码与输入密码的哈希值进行比较。

关于 info.php,是的,如果登录成功,您会在会话中分配一个变量,并且要测试用户是否已登录,您只需测试是否分配了该变量。

于 2010-10-20T04:52:17.407 回答
2

基本上你散列你的密码,所以它不能被恶意检索,散列存储在数据库中而不是明文密码,你只比较2个散列值。

您的客户端可以根据需要存储密码,但 Web 应用程序应在每一步控制会话有效性(在会话变量中存储一些已登录的标识符,并具有适当的过期时间或类似的东西),所以基本上您require("session_control.inc")在每个“受保护”页面中所以你可以检查会话的有效性。

最好的方法是使用 MVC 框架,它可以帮助定义这种情况下的逻辑。

于 2010-10-20T04:57:40.337 回答
0

You can use password hashing but there is also php's crypt() function http://php.net/manual/en/function.crypt.php

They essentially do the same thing but crypt is a little neater IMO. Make sure you also get a good salt generation script so when you save the password in the database here is my password encryption function, notice this isn't that secure without the salt function

function crypt_password($password)
{
    if($password){
        //blowfish hashing with a salt as follows: "$2a$", a two digit cost parameter, "$", and 22 base 64
        $blowfish = '$2a$10$';

        //get the random bytes and makes a salt
        $salt = $this->get_salt();

        //append salt2 data to the password, and crypt using salt, results in a 60 char output
        $crypt_pass = crypt($password,$blowfish . $salt);

        //blowfish comes out as 60, check
        $len = strlen($crypt_pass);

        if($len == 60)
        {
            return $crypt_pass;
        }
        else {
            throw new Exception('encryption failed');
            return false;
        }
    }
    else {
        throw new Exception('encryption failed, missing password');
        return false;
    }
}

and then when you want to verify this password you simply query the database for the login email or user id then to verify its as simple as

if (crypt($input_pass, $stored_pass) == $stored_pass) {
    return true;
}
于 2010-10-20T05:09:57.953 回答