当前位置:首页 > 技术文档 > 正文内容

PHP实现登陆后台限制到只允许一台机器在线

admin10年前 (2015-07-10)技术文档1839

方法一:

# <?php
# ob_start();
# session_start();
# class CC{
#   private $REFURL="http://www.php100.com";    //登陆成功后转换页面
#   private $LoginFLAG=false;        //登陆成功标志
#   private $loginFILE="loginmsg.txt";      //信息文件
#   function setFlag($flag){
#     $this->loginFLAG=$flag;
#   }
#   function check(){
#   global $_POST;
#     if(file_exists($this->loginFILE)&& (time()-filemtime($this->loginFILE))<60){//用户登陆存在而且有效
#       $info=file($this->loginFILE);
#       $username=trim($info[0]);  //已在线的登陆用户名
#       $password=trim($info[1]);  //已在线密码(可以不保存)
#       $ip   =trim($info[2]);  //已在线IP
#       $sid   =trim($info[3]);  //已在线PORT
#       if(strcmp($_SESSION[LoginUser],$username)==0){
#         if(strcmp($_SESSION['LoginPw'],$password)==0){
#           if(strcmp($_SERVER[REMOTE_ADDR],$ip)==0){
#             if(strcmp(session_id(),$sid)==0){
#               $this->setFlag(true);
#               echo "<h3>您的帐户可以确定是唯一的!</h3>";
#               $cf=fopen($this->loginFILE,"a+");
#               fputs($cf,"\r\na");
#               fclose($cf);
#               echo "<meta http-equiv=refresh content=\"10;url=t.php\">";
#               //echo "<iframe src=\"t.php\" frameborder=0 width=0 height=0></iframe>";
#             }else{
#               echo "不允许帐户在局网上同时登陆.. ".$_SERVER[REMOTE_PORT];
#               $this->LoginFLAG=false;
#             }       
#           }else{
#             echo "不允许使用帐户同时登陆..<br>";
#               $this->LoginFLAG=false;
#           }
#         }else{
#           echo "密码错误..<br>";
#           $this->LoginFLAG=false;
#         }
#       }else{
#       //这里验证身份如果正确则
#         echo "帐户登陆时发生错误!用户名错误<br><pre>";
#       }
#     }else{
#       if(isset($_POST[LoginUser])){
#         $_SESSION[LoginUser]=$_POST[LoginUser];
#         $_SESSION[LoginPw]=$_POST[LoginPw];
#         $fp=fopen($this->loginFILE,"w");
#         $msg=$_POST['LoginUser']."\r\n".$_POST['LoginPw']."\r\n".$_SERVER[REMOTE_ADDR]."\r\n".session_id();;
#         fputs($fp,$msg);
#         fclose($fp);
#       }else{
#         $outtime=time()-filemtime($this->loginFILE)-60;
#         echo "登陆不存在或您已经超时(".$outtime."秒)...";
#       }
#     }
#   }
#   function Wfrom(){
#   global $_POST;
#   if(!file_exists($this->loginFILE) ||(time()-filemtime($this->loginFILE))>60){    //登陆失败
#   echo <<<LOGINFORM
#   <Form action="$_SERVER[PHP_SELF]" method="post" name="Loginform">
#     <table cellpadding=0 border=0>
#     <tr><td>
#     用户名:<td><input type="text" name="LoginUser"></span><br>
#     <tr><td>密码:<td><input type="password" name="LoginPw"></span><br>
#      <tr><td> <td><input type="button" value=" Login " onclick="if(this.form.LoginUser.length*this.form.LoginPw.length!=0){this.form.submit();}else{return false;}">
#     </table>
#   </form>
# LOGINFORM;
#   }else{
#     echo "已有用户登陆";
#   }
#   }
# }
# $D=new CC;
# $D->check();
# $D->Wfrom();
# ?>


方法二:

【问题描述】

同一用户在同一时间多次登录如果不能检测出来,是危险的。因为,你无法知道是否有其他用户在登录你的账户。如何禁止同一用户多次登录呢?

【解决方案】

(1) 每次登录,身份认证成功后,重新产生一个session_id。

  1. session_regenerate_id();  

  2. session_register ("username") ;  

(2) 在用户数据库中开一个sessionid字段,重新产生session_id后,都更新该字段。

  1. $sessionid = session_id();  

  2. $db = new PDO('sqlite:softToken.db');  

  3. $sql = "update userinfo set sessionid ='$sessionid' where username='$username' and passwd='$passwd';";  

  4. $query = $db->prepare($sql);   

  5. $query->execute();  

(3) 建立一个session保存用户名

  1. $_SESSION["username"] = $username;  

(4) 利用url重写,传递session_id

  1. $url = "main.php?sid=".session_id();  

  2. unset($db);  

  3. echo "<font color=blue>登录成功,正在跳转!</font>" ;  

  4. header ("Location:$url");  

(5) 在需要跳转的页面,起始处加入

main.php

 

  1. <?php   

  2. header('Content-type:text/html; charset=utf-8');  

  3. $sessionid = $_GET['sid'];  

  4. session_id($sessionid);  

  5. session_start ();  

  6. $username = $_SESSION["username"];  

  7. $db = new PDO('sqlite:softToken.db');  

  8. $sql = "select * from userinfo where username='$username' and sessionid='$sessionid';";  

  9. $query = $db->prepare($sql);   

  10. $query->execute();  

  11. $user = $query->fetch(PDO::FETCH_OBJ);  

  12.   

  13. if ($user->username == ""){  

  14. session_destroy();  

  15. echo "<script language='javascript' type='text/javascript'>" ;  

  16. echo "window.location.href = 'index.html';" ;  

  17. echo "</script>" ;  

  18. exit () ;   

  19. }  

  20. ?>  

  21.   

  22. <html>  

  23. <body>  

  24. ......  

  25. </body>  

  26. </html> 





分享到:

扫描二维码推送至手机访问。

版权声明:本文由云河空间发布,如需转载请注明出处。

本文链接:http://yuyunhe.cn/index.php/post/78.html

分享给朋友:

“PHP实现登陆后台限制到只允许一台机器在线” 的相关文章

ThinkPHP分页的实现

分页类需要和查询相结合,我们可以使用ThinkPHP自带的limit方法或者page方法,目的就是为了获取当前分页的数据(也有先获取完整数据然后前端分页显示的方法,不在本文描述内容中,也不建议)。使用limit方法或者page方法是和数据库类型无关的。我们首先在数据库里面创建一个think_data...

图文解说Navicat使用ssh方式连接远程MySql服务器

图文解说Navicat使用ssh方式连接远程MySql服务器

如何使用Navicat 8.0 for MySQL连接公司服务器的数据库,但我也是第一次接触这个软件,搞了半天也没连上,在网上找了很多解决的办法,其中就有使用ssh方式连接的,但写的不够详细,因此还是费了一番功夫,自己搞定的,不敢独享,特记录下来 与大家分享。首先,在Navicat的连接设置里选择S...

phpcms v9更换模板的具体操作方法

phpcms v9更换模板的具体操作方法

这篇文章主要介绍了phpcms v9更换模板的具体操作方法,需要的朋友可以参考下分享一下Phpcms V9更换模板的具体操作方法先分享下大概的步骤:1、上传模版文件到服务器;2、在站点管理 里边【模板风格配置】选择新模板;3、设置不同模型对应模板;4、修改现有的栏目,匹配新模板;5、更新栏目缓存、系...

jQuery编程的最佳实践

加载jQuery1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢。点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地址。<script type="text/javascript" src="...

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)

如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?先上代码进行java时间转换成unix timestampimport java.text.DateFormat;   import java.text.ParseExceptio...

PHP开发之THINKPHP多表联合查询操作的三种方法

THINKPHP 中关联查询(多表查询)可以使用 table() 方法或和join方法,请看示例: 联合查询         1、原生查询    &...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。