在没有数据库或用户名的情况下使用 php 密码保护文件夹/页面的最佳方法是啥
Posted
技术标签:
【中文标题】在没有数据库或用户名的情况下使用 php 密码保护文件夹/页面的最佳方法是啥【英文标题】:What is the best way to password protect folder/page using php without a db or username在没有数据库或用户名的情况下使用 php 密码保护文件夹/页面的最佳方法是什么 【发布时间】:2010-09-22 03:56:32 【问题描述】:使用没有数据库或用户名但使用 php 来密码保护文件夹的最佳方法是什么?基本上我有一个页面将列出组织的联系人,并且需要密码保护该文件夹,而无需为每个用户提供帐户。只有一个密码会经常更改并分发给群组。我知道这不是很安全,但我更想知道如何做到这一点。以最好的方式。
如果用户正确输入密码后能记住一段时间就好了。
我正在按照 David Heggie 的建议进行操作,但不使用 cookie。它看起来确实不安全,但最好有一个糟糕的密码保护然后根本没有。
这是针对内部网站的,人们会花时间记住他们的登录名和密码,并且永远不会通过注册过程......除非真的很容易,否则他们不会使用系统一点也不。
我想看看这个问题的其他解决方案。
用户群由不太懂技术的人组成,还有其他方法可以做到这一点。
【问题讨论】:
【参考方案1】:假设您使用的是 Apache:
http://httpd.apache.org/docs/1.3/howto/htaccess.html#auth
【讨论】:
我想用 php 来做这个。是的,我知道如何使用 .htaccess 此链接不再可用,这是“仅链接”答案的问题【参考方案2】:好吧,既然您知道一开始是不安全的,您可以将密码存储在您网络服务器上某处的文本文件中。当有人访问该页面时,您可以显示一个要求输入密码的表单。如果密码与文本文件中的内容匹配,则重新加载页面并显示信息。使用文本文件将允许您更改密码,而无需在您想要更改密码时修改他们正在访问的页面。除非您使用 SSL,否则您仍将到处发送纯文本。如果您需要一些代码,请告诉我。
【讨论】:
如果文本文件不在公共目录中,这与 http 基本身份验证和大多数各种 php 实现(没有 SSL 层)一样安全,所以我不会投反对票。 ..?【参考方案3】:我怀疑这是否会算作 最好的 这样做,但它会起作用。而且由于安全性对您来说似乎不是一个大问题,因此这种方式非常不安全的事实可能也不会打扰您。
有一个 login.php 页面,该页面接受密码,如果登录详细信息正确,则设置一个 cookie。然后每个 php 文件可以检查 cookie 的存在,以确定用户是否“登录”,并相应地显示信息。
login.php
...
if(isset($_POST['password']) && $_POST['password'] == 'my_top_secret_word')
setcookie('loggedin', 'true', time() + 1200, '/url/');
else
setcookie('loggedin', 'false', time() - 1200, '/url/');
// display a login form here
etc
然后每个“受保护”页面都会检查此 cookie:
if(isset($_COOKIE['loggedin']))
if($_COOKIE['loggedin'] == 'true')
$showHidden = true;
else
$showHidden = false;
else
$showHidden = false;
我相信你明白(非常不安全)的想法......
【讨论】:
【参考方案4】:编辑:SHA1 不再被认为是安全的。存储的密码哈希也应该是salted。现在有更好的解决方案来解决这个问题。
你可以使用这样的东西:
//access.php
<?php
//put sha1() encrypted password here - example is 'hello'
$password = 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d';
session_start();
if (!isset($_SESSION['loggedIn']))
$_SESSION['loggedIn'] = false;
if (isset($_POST['password']))
if (sha1($_POST['password']) == $password)
$_SESSION['loggedIn'] = true;
else
die ('Incorrect password');
if (!$_SESSION['loggedIn']): ?>
<html><head><title>Login</title></head>
<body>
<p>You need to login</p>
<form method="post">
Password: <input type="password" name="password"> <br />
<input type="submit" name="submit" value="Login">
</form>
</body>
</html>
<?php
exit();
endif;
?>
然后在您要保护的每个文件上,放在顶部:
<?php
require('access.php');
?>
secret text
这不是一个很好的解决方案,但它可能会做你想做的事
编辑
您可以添加一个 logout.php 页面,例如:
<?php
session_start();
$_SESSION['loggedIn'] = false;
?>
You have logged out
【讨论】:
+1 用于使用散列算法进行预计算和存储。不过,SHA2 或至少 SHA1 会更安全。 我不知道 OP 对安全性的关心程度。 谢谢!正是我需要的!它也确实返回了一些不影响任何东西的错误,所以我只是通过将<?php error_reporting(0); ?>
放在相应页面的顶部(在<?php require('access.php'); ?>
之前)来关闭 PHP 错误。再次感谢!
我试过用这个,但每次我得到“不正确的密码”。我错过了什么吗?
警告 : 此脚本无法保护同一目录中的图像和其他文件【参考方案5】:
如果你想避免 cookie、会话并且不想玩 .htaccess 文件,你也可以使用 PHP 单独进行 http 身份验证:
http://www.php.net/manual/en/features.http-auth.php
您可以将密码硬编码到文件中并根据需要进行更改,或者从不在 web_accessible 目录中的文件中包含密码。
缺点是您无法格式化“登录”屏幕 - 这将是一个标准的 http 身份验证对话框
【讨论】:
以上是关于在没有数据库或用户名的情况下使用 php 密码保护文件夹/页面的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
javascript:在没有php的情况下将数据存储在文件或数据库中?