2010-10-20 89 views
0

寻找一个php登录脚本。我搜索了stackoverflow,并看到了很多帖子,但任何人都可以推荐最好的方法吗?另外,如果我想使用哈希,如何在检索时解码密码?我的iPhone应用程序使用相同的数据库,并且当前密码以正常文本存储(我知道不太安全)。PHP登录脚本(安全但不像银行金库)

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

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

+0

THA NKS给大家的答复。这很棒! – BigMike 2010-10-20 05:02:22

回答

3

This is a great tutorial登录系统设计。它以面向对象的方式覆盖所有主要主题,对于了解不同的考虑因素非常有用。

可解码的密码并不像它们可能的那样安全,但我有客户坚持他们能够随意检索和更改密码,没有例外。所以在某些情况下,我选择使用base64编码的字符串来存储在数据库中,这似乎工作得很好。存在用于管理用户需要的编码/解码功能。

的确,会话控制(和/或cookie)是控制访问的方法。使用面向对象的模式构建它将允许您仅使用每页代码的一行或两行代码(或者如果常见,则在代码行中包含一行代码)。

我的一个警告是考虑你是否有一个共同的登录级别或需要用户级别的权限。在构建基于权限的登录非常重要的站点之后,确定更多的工作。如果没有计划在一开始就会变成真正的怪物。

+1

链接的例子是**不安全**。密码散列包含缺陷,并且该示例易受SQL注入攻击的影响,因此是额外的好处。 – Jacco 2012-05-16 12:24:39

+0

@jacco,OP没有询问关于SQL注入的问题,他们正在寻找具有可解密密码的登录脚本示例。毫无疑问,专业开发人员不会跳过数据卫生等基本安全措施,而使用公共免费教程来保护您的关键任务网站是愚蠢的。 – bpeterson76 2012-05-16 14:39:14

+0

就我读的问题而言,他想要做哈希,并且不知道这个主题。总之,你永远不应该推荐任何不安全的代码。对于安全相关的例子来说更是如此。这个例子显示了更多不安全的做法。换句话说,这不是一个好例子,它促进了不安全的做法,根本不应该遵循。 – Jacco 2012-05-17 09:53:25

3

POST到HTTPS URL。

你永远不会解码哈希密码。丢失的密码需要另一种机制来处理。

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

2

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

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

2

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

您的客户端可以存储密码,因为他们想要的,但Web应用程序应该在每一步控制会话有效期(存储一些登录标识与适当的到期或类似的东西会话变量), 所以基本上你require("session_control.inc")在每个“受保护”页面中,您可以检查会话有效性。

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

0

您可以使用密码散列但也有PHP的crypt()函数http://php.net/manual/en/function.crypt.php

他们基本上做同样的事情,但墓穴是一个小整洁IMO。请确保你也可以得到一个很好的盐生成脚本,所以当你在数据库中保存的密码,这里是我的密码加密功能,

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; 
    } 
} 

,然后当你要注意,这不是无盐功能安全验证这个密码,您只需查询登录电子邮件或用户ID的数据库,然后以验证它的那样简单

if (crypt($input_pass, $stored_pass) == $stored_pass) { 
    return true; 
} 
+0

在上面的例子中你的$是什么? – 2011-01-15 07:14:28

+0

@james一个函数,生成一个随机盐它的修改http://www.openwall.com/phpass/ – Brian 2011-02-06 03:15:18

3

仍处于开发阶段,但安全,快速,干净,好了最新:

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

[老版本的网站] http://www.php-login.net

我与一些设计师&编码器帮助创造了这个。已经在几个论坛上进行了讨论,并得到了非常积极的回复。所有当前的问题都可以在github问题页面上看到。所有的代码都是公开的,免费的和可以上架的

+1

+1共享登录脚本,也许它仍然更新:p – bungdito 2013-06-20 21:59:19

4

我的答案迟了一点,但我会发帖无论如何,我知道这并不直接回答这个问题,但它是相关的不少。这里有几点关于登录安全。

记住

你是最好的老调重弹哈希密码,并储存在用于自动登录的用户cookie中的翻版。当你的老调重弹密码,使用特定的东西到浏览器作为种子,如浏览器类型。这将有助于防止cookie被盗(通过人们窥探网络流量)。这有助于防止使用彩虹桌的机会。

会议

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

CSRF

跨站请求伪造 - 实现你登录后的事,但要注意的,因为它不仅影响记录成员:http://en.wikipedia.org/wiki/Cross-site_request_forgery

HTT PS

应该在登录请求发送到的页面上使用HTTPS - 它不一定要在您输入登录信息的页面上!

散列

您可以哈希密码,客户端使用JavaScript这只会服务器来保护成员具有在不使用HTTPS时transfering他们在网络上自己的密码被盗。这很好,因为很多人经常在许多网站上使用相同的密码。缺点是:你不能检查服务器端的密码长度&如果javascript被禁用,他们不能登录(尽管你可以在某种程度上编程)。雅虎过去几年前(可能还会这样做)。

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

键盘记录器

如果你想避开键盘记录器(或大部分),你可以通过添加一个JavaScript键盘/键盘这样做。然后,用户单击字母和数字以使用鼠标代替键盘输入其密码,这意味着键盘记录器难以记录密码。

知道的东西,有事,是值得

三个级别的安全性。有人知道的东西,比如密码,某人的某个东西,比如电话(谷歌使用两步验证完成了前两个),某人是指纹等。你填写得越多,你的安全凭证就越多 - 通过一个很长的一步!

机器人

计算机有时会尝试蛮力快速登录页面(一定要快,如果密码是不正确的,剧本暂停甚至只需1秒,这大大降低了总的登录尝试一个机器人你可以暂停一个不正确的登录1或2秒(就像linux一样),或者你可以产生一个捕获图片,表明僵尸程序在X登录失败之后很难解决(像google一样)

有要点,但我确定有其他要求。