PHP实现加密文本文件并限制特定页面的存取的效果


Posted in PHP onOctober 21, 2016

文件的加密程序在站点上已经应用的很广泛了,这意味着要使用一个数据库来存储口令和用户名。具体如下:

一、 简介

尽管在一般情况下,你的网站往往相当简单以至它根本不要求使用数据库;但是在有些情况下,你的站点可能想限制对某些页面的存取。一般地,这意味着要使用一个数据库来存储口令和用户名。然而,你还有一个更容易的方法-尽管其安全性差了一点,但是它仅包含了极少的编码。

如果你在自己的Web应用程序中使用了数据库,那么你已经能够在某处存储口令和用户名,并且有一种方法可用来认证访问者。但是,当因你的站点的安全性或复杂性需要而无法保证使用数据库时,那该怎么办?可能有些时候你仅想要一些特别的人存取你的站点的某些页面或一些区域。为此,一种很简单的方式就是使用一个存储口令的文本文件,并且创建一个页面来提示访问者输入口令;如果口令与存储在该文本文件中的内容相匹配,那么允许该用户存取受限的页面;否则,在开始刷新页面之前显示一条适当的消息以禁止其存取。

为了进一步的安全起见,你还可以用哈希法来加密存储在文本文件中的口令,这样如果它的内容在某种程度上被发现,它还将会是很难被查明。所有这些都可以用PHP方法来构建,而且只需极少量的编码。

在正式开始前,你需要建立一个环境来测试和使用PHP;所以,你首先需要为PHP安装和配置一个Web服务器。由于Apache与PHP协同工作良好,并且易于安装和配置,因此我推荐使用这一方案。

接下来,你需要创建一个页面(类似下图)-它有一个文本框用于接收来自访问者的口令,还有一个submit按钮来把它发送到你的PHP文件。这既可以是一个新页面也可以是你的网站上的一个现有页面的一部分。象下面简单的代码块应该足够了:

<form name="passwordForm" method="post" action="restricted.php">
<p>Password:
<input type="password" name="password">
<input type="submit" name="Submit" value="Login">
</p>
</form>

二、 创建PHP主页

接下来,你需要创建完成实际工作的PHP主页。在一个文本编辑器中打开一个空白页面,然后以标准方式打开一个PHP块:

如我以前所提及的,PHP具有一套标准的函数和方法用来实现文件操作。其中,最为主要的几个是fopen(),fread()和fclose()函数。为了进行某种文件操作,我们需要先打开它,并且很明显,这是使用fopen()函数实现的;而且,我们必须指定如何操作文件;读文件,读文件是最普通的任务,但是另外一些额外标志可以用来告诉程序是把文件指针放在开始还是文件的结束,以及如果文件还不存在的话是否创建该文件。然而,在本例中,我们所需要做的是,打开包含口令字的文本文件并读取它。

然后,首先创建一个到指定文本文件路径的变量:

$fileloc = "/apachesite/docs/pass.txt"

 

接下来,创建一个变量来存放文件指针:

$filetoread = fopen($fileloc, "r") or die("Could not open password file");

你也可以使用die方法来结束该脚本,并且如果操作因某种原因失败的话将在屏幕上打印一条适当的消息。一旦打开文件,你需要读取它的内容,以便把它与以口令字形式输入的内容进行比较:

$storedpass = fread($filetoread, filesize($fileloc)) or die ("Could not read stored password");

你应该设置一个变量来存放文件中的数据,并且调用fread()方法(它有两个参数:文件指针和文件长度)。你可能知道(也可能不知道)你的口令的长度。为了使将来的编程容易些(当口令字需要改变时),你可以使用filesize()方法来得到文件长度。一旦文件不再需要,立即关闭之:

fclose($filetoread);

三、 使用口令

为了使用输入到HTML表单中的口令,你需要得到它并把它存储到一个变量中。当我们使用POST方法来把用户输入的内容发送到PHP脚本时,我们可以使用$_POST来取得输入的口令:

$password = $_POST["password"];

然后,我们可以简单地把输入的口令字与存储的口令字进行比较并采取相应的措施:

if (empty ($password)){
die ("No password entered");
}
elseif ($password != $storedpass){
die ("Password Incorrect");
}
else{
Header("Location: securepage.htm")
}

第一个if语句处理一个空的$password变量以防止当输入框为空时,submit按钮被点击。如果用户输入的口令与存储的那个不匹配,那么第二个语句执行括号内的代码并且输出一条消息显示口令是错误的。最后,如果前两个条件都不满足,那么,该脚本认为口令一定是正确的并且把一个重定向头(header)发送到浏览器以打开示例中的HTML页面。

在此能够工作之前,你需要创建一个文本文件并且把它放到与该PHP文件相同的目录下。它需要包含你目前想要使用的以普通文本形式存储的口令,并且应该引用该PHP文件名。保存所有这些文件,然后在一个浏览器中打开该HTML页面,并用该表单进行试验。该页面应该如所设想的那样工作。

当你输入正确的口令时,如果你得到一个错误消息,其内容是:

"Warning: Cannot modify header information - headers already sent by (thepathtoyourphpfile)"

这意味着,你需要把位于你的Windows目录下的php.ini文件中的output-buffering设置为"on"。

四、 加密

现在,我们开始分析在前面提到的加密问题。PHP具有一些内置的MD5方法。这样以来,在把访问者输入的口令与存储的口令进行比较之前,我们可以很容易地使用这些函数来转换它。

MD5是一种单向哈希算法,这意味着口令可以仅用一种方向进行加密-从普通文本到加密文本,而以另外一种方向是不可能的。然而,这并不是就能使得它不可破解。这种加密容易被以暴力方式或者通过字典攻击加以破解,但是它仍然还是比较安全的。你可以把下列一行添加到$password变量的声明语句之后:

$md5password = (md5($password));

这样可以把一个输入到该文本框中的内容的加密版本保存到变量$md5password中。现在,你需要修改你的if语句,以便它把存储的口令与新的加密的口令加以比较:

if (empty ($password))
{
 die ("No password entered");
}
elseif ($md5password != $storedpass)
{
 die ("Password Incorrect");
}
else
{
 header("Location: securepage.htm");
}

如你所见,我们仅改变了语句的elseif部分中的变量。这是因为即使是一个空的输入变量也被哈希化为一个32位值,因此$md5variable永远不可能为空,-即使在把任何文本输入到输入域之前点击submit按钮。

现在,所有你需要做的就是,找到你想存储在文本文件pass.txt中的该口令的哈希值。为此,你可以注释掉整个的if语句并且再加上一个echo语句以把加密的口令显示在屏幕上。然后,你还可以复制加密串并且把它保存到口令文件中。然而,你必须记住,在使用该脚本之前,取消注释if语句并且删除echo调用。

就本文所讨论的方法而言,上面的脚本框架所提供的已经足够了。另外,本文所讨论的测试文件,尽管非常基本,但是该HTML页面能够被容易地加入到一个现有的页面中去;你可以把它粘贴到一个窗口中去并整理它的样式以匹配你的主页的其余部分,并且你可能包含一个定时函数-它在把访问者重新定向到一个安全的页面前等待一段固定的时间,同时显示一条消息指示口令正确。你还可以包含一个类似的函数集来重载初始页面。

总之,你可以使用本文所提供的脚本来限制到你的站点结构中的特定页面的存取。尽管该方法并没有提供一个数据库所提供的安全的用户名/口令认证方法,并且它意味着你必须把口令发给想存取安全页面的任何人,但是它的确耗费非常少的时间和编码提供了一种简单的安全层。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
删除及到期域名的查看(抢域名必备哦)
May 14 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
Jun 30 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
基于PHP CURL用法的深入分析
Jun 09 PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
Feb 13 PHP
微信支付开发教程(一)微信支付URL配置
May 28 PHP
19个Android常用工具类汇总
Dec 30 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
php短网址和数字之间相互转换的方法
Mar 13 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 PHP
PHP实现多关键字加亮功能
Oct 21 #PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 #PHP
PHP与服务器文件系统的简单交互
Oct 21 #PHP
微信公众号开发客服接口实例代码
Oct 21 #PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 #PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 #PHP
phpcms中的评论样式修改方法
Oct 21 #PHP
You might like
用ODBC的分页显示
2006/10/09 PHP
MYSQL数据库初学者使用指南
2006/11/16 PHP
php 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php下安装配置fckeditor编辑器的方法
2011/03/02 PHP
PHP7 新增常量
2021/03/09 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
Python处理CSV与List的转换方法
2018/04/19 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
信息总监管理职责范本
2014/03/08 职场文书
法制演讲稿
2014/09/10 职场文书
学生通报表扬范文
2015/05/04 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
五一放假通知怎么写
2015/08/18 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle