寻找一个php登录脚本。我已经搜索了 stackoverflow 并看到了很多帖子,但是任何人都可以推荐最好的方法吗?另外,如果我想使用散列,检索时如何解码密码?我的 iPhone 应用程序使用相同的数据库,目前密码以普通文本存储(我知道不是很安全)。
另外,如果我实现了一个重定向到 info.php 的登录页面,如何阻止用户直接进入 info.php 页面而不登录,会话控制?
期待听到您的意见。非常感谢。
寻找一个php登录脚本。我已经搜索了 stackoverflow 并看到了很多帖子,但是任何人都可以推荐最好的方法吗?另外,如果我想使用散列,检索时如何解码密码?我的 iPhone 应用程序使用相同的数据库,目前密码以普通文本存储(我知道不是很安全)。
另外,如果我实现了一个重定向到 info.php 的登录页面,如何阻止用户直接进入 info.php 页面而不登录,会话控制?
期待听到您的意见。非常感谢。
我的回答有点晚了,但无论如何我都会发帖,我知道这并不能直接回答这个问题,但它的相关性并非如此。以下是有关登录安全性的几点。
记得我
您最好重新散列散列密码,并将重新散列存储在用于自动登录用户的 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 那样)。
有要点,但我敢肯定还有其他的。
POST 到 HTTPS URL。
您永远不会解码散列密码。丢失的密码需要另一种机制来处理。
是的,会话控制。在登录时在会话中设置一个标志并在其他页面上检查它。
仍在开发中,但安全、快速、干净、良好且最新:
[最新版本] https://github.com/Panique/PHP-Login
【旧版网址】http://www.php-login.net
我在一些设计师和编码人员的帮助下创建了这个。它已在多个论坛上进行了讨论,并得到了非常积极的答复。所有当前问题都可以在 github 问题页面上查看。所有代码都是公开的、免费的和可分叉的。
这是一个关于登录系统设计的很棒的教程。它以面向对象的方式涵盖了所有主要主题,非常适合学习不同的注意事项。
可解码的密码并不安全,但我有客户坚持他们可以随意检索和更改密码,没有例外。因此,在某些情况下,我选择对 base64 编码的字符串进行加盐以存储在数据库中,这似乎工作得很好。存在一个功能来根据管理员用户的需要进行编码/解码。
实际上,会话控制(和/或 cookie)是控制访问的方法。使用面向对象的模式构建它可以让您在每页仅使用一两行代码(如果很常见,也可以在页眉中使用一行代码)来做到这一点。
我的一个警告是考虑您是否具有通用登录级别或需要用户级别权限。在您建立网站后,确定基于权限的登录很重要,这显然需要做更多的工作。如果一开始没有计划,它可能会变成一个真正的怪物。
您不需要解码密码,您必须将哈希密码存储在数据库中,当用户尝试登录时,您将存储的密码与输入密码的哈希值进行比较。
关于 info.php,是的,如果登录成功,您会在会话中分配一个变量,并且要测试用户是否已登录,您只需测试是否分配了该变量。
基本上你散列你的密码,所以它不能被恶意检索,散列存储在数据库中而不是明文密码,你只比较2个散列值。
您的客户端可以根据需要存储密码,但 Web 应用程序应在每一步控制会话有效性(在会话变量中存储一些已登录的标识符,并具有适当的过期时间或类似的东西),所以基本上您require("session_control.inc")在每个“受保护”页面中所以你可以检查会话的有效性。
最好的方法是使用 MVC 框架,它可以帮助定义这种情况下的逻辑。
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;
}