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

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

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

方法一:

# <?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实现登陆后台限制到只允许一台机器在线” 的相关文章

php 判断手机访问

//手机来访 function is_mobile() {     $user_agent = $_SERVER['HTTP_USER_AGENT'];    &n...

Zend Studio 8打开utf-8文件出现乱码解决方法

Zend Studio 8打开utf-8文件出现乱码解决方法

今天安装了zend studio 8.0.1,运行了一个PHP程序项目(项目文件编码为utf-8),发现utf-8文件中的中文全部变成乱码了,后面终于经过寻找探索,找到了问题所 在:虽然你的项目是UTF-8编码文件,但是当通过zend studio工具运行打开时,是以工具里设定的GBK编码...

用php gettext库来开发多语言系统

用php gettext库来开发多语言系统

通常人们写程序时都是将文字写死在程序里的, 比如:echo "Hello World!";  ,假如要改成它国语言,写国际化程序,就要逐个打开进行修改,程序较短时还行,若程序有上万甚至更多,改起来就不是那么容易了。近来随着i18n的逐渐标 准化,我也来讲一讲在PHP中如...

jQuery编程的最佳实践

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

PHP利用Curl模拟登录并获取数据例子

PHP利用Curl模拟登录并获取数据例子

几乎所有的程序员来模仿用户登录或抓取数据都会使用到curl函数,下面我来给各位介绍利用curl函数实现登录并抓取数据,希望下面例子对各位有帮助。PHP的curl()在抓取网页的效率方面是比较高的,而且支持多线程,而file_get_contents()效率就要稍低些,当然,使用curl时需要开启下c...

发表评论

访客

看不清,换一张

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