PHP笔记-用户登录&权限拦截说明

这篇博文中设置Cookie时用的是数据库的用户id。这样有问题,用户可以随意改动ID,从而获取不同的用户权限。

这里我们更新下,增加点安全性。构造safe包

内容如下:

CookieAndSession.php

<?phpnamespace safe;class CookieAndSession{public $cookie;public $userId;public $browser;public $os;public $timeToLive;
}

CookieTool.php

<?phpnamespace safe;class CookieTool{protected function generateKey(): string{$length = 32;$retKey = "";for ($i = 0; $i < $length; $i++){$retKey .= chr(mt_rand(33, 126));}return $retKey;}protected function getIPAddress(): string{$ipaddress = "";if (isset($_SERVER['HTTP_CLIENT_IP']))$ipaddress = $_SERVER['HTTP_CLIENT_IP'];else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];else if(isset($_SERVER['HTTP_X_FORWARDED']))$ipaddress = $_SERVER['HTTP_X_FORWARDED'];else if(isset($_SERVER['HTTP_FORWARDED_FOR']))$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];else if(isset($_SERVER['HTTP_FORWARDED']))$ipaddress = $_SERVER['HTTP_FORWARDED'];else if(isset($_SERVER['REMOTE_ADDR']))$ipaddress = $_SERVER['REMOTE_ADDR'];else$ipaddress = 'UNKNOWN';return $ipaddress;}protected function getBrowser($agent): string{$browserAgent = "";if(strstr($agent, 'MSIE')) {$browserAgent="Internet Explorer";}else if(strstr($agent, 'Opera')) {$browserAgent="Opera";}else if(strstr($agent, 'Firefox')) {$browserAgent="Firefox";}else if(strstr($agent, 'Chrome')) {$browserAgent = "Chrome";}else if(strstr($agent, 'Safari')) {$browserAgent = "Safari";}else{$browserAgent = "unknown";}return $browserAgent;}protected function getPlatform($agent): string{$agent = strtolower($agent);$platform = "";if(strstr($agent, 'win')) {$platform="windows";}else if(strstr($agent, 'linux')) {$platform = "linux";}else{$platform = "unknown";}return $platform;}protected function getMacAddress(): string{$MAC = exec('getmac');print_r($MAC);$MAC = strtok($MAC, ' ');return $MAC;}public function printCookieArray(){global $cookieAndSessionArray;print_r($cookieAndSessionArray);}public function setCookieByUserId($userId){$userToken = $this->generateKey();$browserAgent = $this->getBrowser($_SERVER['HTTP_USER_AGENT']);$platform = $this->getPlatform($_SERVER['HTTP_USER_AGENT']);$cookieAndSession = new CookieAndSession();$cookieAndSession->cookie = $userToken;$cookieAndSession->userId = $userId;$cookieAndSession->browser = $browserAgent;$cookieAndSession->os = $platform;$cookieAndSession->timeToLive = 24 * 60 * 60;@session_start();$_SESSION["user"] = serialize($cookieAndSession);setcookie('userToken',$userToken ,time() + 1 * 24 * 3600);}
}

因为这里我用的是自定义MVC框架,在每次加载的时候,会调用如下start函数:

    public static function start(){self::setPath();self::setConfig();self::setSafe();self::setUrl();self::setAutoLoad();self::setDispatch();}

其中setSafe()就是新加的,作用是加载对应的php文件

    private static function setSafe(){$files = self::getAllFile(SAFE_PATH);foreach($files as $file){if(file_exists($file)){include $file;}}}

其中getAllfile是获取当前目录下的所有文件,如下:

    private static function getAllFile($dir): array{$retArray = array();if(!is_dir($dir))return $retArray;$files = scandir($dir);foreach ($files as $file){$tmpFile = $dir . "/" . $file;if(!is_dir($tmpFile)){array_push($retArray, $dir . "/" . $file);}}return $retArray;}

其中SAFE_PATH如下:

ROOT_PATH在index.php中定义的,如下:

index.php

<?phpdefine("ROOT_PATH", str_replace("\\", "/", dirname(__DIR__)) . "/");include ROOT_PATH . "core/App.php";\core\App::start();

当用户点击登录后:

其userToken就为随机数了

后台登录校验是这样的:

    public function check(){$useName = trim($_POST["userName"]);$password = trim($_POST["password"]);$captcha = trim($_POST["captcha"]);..................$cookieTool = new CookieTool();$cookieTool->setCookieByUserId($user['user_id']);$this->success("登录成功", '', 'dashboard', "index");}

权限拦截如下:

    public function __construct(){include VENDOR_PATH . "smarty/Smarty.class.php";$this->smarty = new \Smarty();$this->smarty->template_dir = APP_PATH . P . "/view/";$this->smarty->compile_dir = RESOURCES_PATH . "views";if(strtolower(C) != "privilege"){if(isset($_COOKIE['userToken'])){@session_start();$obj = unserialize($_SESSION["user"]);if(strcmp($_COOKIE['userToken'], $obj->cookie) != 0){$this->error("未登录,请先登录", "user", "privilege", "login");}$userModel = new UserModel();$user = $userModel->getById((int)$obj->userId);if($user){return;}}$this->error("未登录,请先登录", "user", "privilege", "login");}}

PHP笔记-随机生成cookie、后台检索、通过session获取ID增强安全性相关推荐

  1. python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码

    最近有这样一需求,需要获取12123交管查询网站上的全国每个城市对应的城市id和车牌代码.最初的想法是直接用Python写个爬虫,遍历每个城市,然后用Xpath提取DOM节点数据就好了.然而在实际操作 ...

  2. 【SQL Server 学习系列】-- sql 随机生成中文名字

    [SQL Server 学习系列]-- sql 随机生成中文名字 原文:[SQL Server 学习系列]-- sql 随机生成中文名字 1 DECLARE @fName TABLE(Id INT I ...

  3. python随机生成一组数据_使用Python random模块生成随机数据实例

    在本节中,我们将学习如何使用random模块(random)在Python中生成随机数和数据.该模块为各种分布(包括整数,浮点数(实数))实现了伪随机数生成器. 本文的目标: 以下是我们将在本文中介绍 ...

  4. Java 随机生成 “纯数字“、“纯字母“ 、“数字字母混合“ ID 并保持全局唯一

    文章目录 随机生成 "纯数字"."纯字母" ."数字字母混合" ID并保持全局唯一 一.随机生成纯数字ID 二.随机生成纯字母ID 三.随机 ...

  5. mysql 生成邀请码_如何实现用户id生成一个唯一邀请码

    根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...

  6. 什么是cookie,什么是session,cookie和session的区别

    会话跟踪 1. 什么是会话   * 用户拨打10086,从服务台接通后会话开始:   * 用户发出话费查询请求,服务台响应.这是该会话中的一个请求:   * 用户发出套餐变更请求,服务台响应.这是该会 ...

  7. 【机器学习笔记】随机生成mini-batches的原理及过程

    描述问题 在写实现生成mini-batches的时候,发现不能很好理解X[:,n]及X[:,m:n]的原理.下面具体围绕数组介绍切片原理展开讲述如何在不打乱数据集X与对应标签Y的对应关系的条件下,随机 ...

  8. Java 随机生成 0-9a-zA-z 和 汉字 学习笔记

    Java 随机生成 0-9a-zA-z 和 汉字 导包 import org.apache.commons.lang3.RandomStringUtils; 代码 // 0-9a-zA-z 参数为字符 ...

  9. php随机数字总和固定,php 随机生成固定长度整数、各种服务器请求方法

    搜索热词 1.随机生成整数函数,感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编来看看吧. 经测试代码如下: @H_301_3@/** * 随机生成整数函数(生成位数:$pw_length) ...

最新文章

  1. android:退出程序
  2. 为什么现在小学生都学计算机编程了,为何要在小学阶段开展编程教育?
  3. 8bit黑白图像的灰度值范围是_数字图像处理基本知识
  4. 算法设计与分析——回溯法——批处理作业调度
  5. 【TypeScript系列教程10】循环语句的使用
  6. html柳树动画,3D教程-柳树生长动画
  7. Linux LVM过程问题
  8. mp.weixin.php,GitHub - temberature/mp-php-sdk: 微信公众平台第三方授权php开发包, weixin mp developer SDK....
  9. MySQL图形化管理器——EMS SQL Management Studio
  10. Mac局域网本地库server, CornerStone使用
  11. [Struts]使用tiles管理界面遇到困难
  12. 使用LL库开发STM32:UART基础使用
  13. 小学计算机基础知识思维导图,简单易懂的小学除法思维导图
  14. Day14-正则表达式及常用类
  15. 最通俗易懂——TCP/IP协议,让你明明白白!
  16. 彻底掌握 Javascript(八)正则表达式【讲师辅导】-曾亮-专题视频课程
  17. 南邮电工电子实验设计5(单极共射放大电路)
  18. 阿里云服务器mysql开放远程连接步骤
  19. 可重复读如何解决幻读
  20. java学生类 方法 输出_高额悬赏,java面向对象编程,编写学生类,输出学生相关信息...

热门文章

  1. jquery $.get()、$.ajax()与后台servlet交互方法
  2. Grunt 之通配符
  3. python核心编程笔记chapter 3
  4. Android的listview滚动时背景不让变黑解决办法
  5. 如何在Linux kernel Makefile中添加宏定义
  6. 南孚电池:如何从0-1建立经营分析报表平台,助力集团转型?
  7. 关于BI商业智能的“8大问”|一文读懂大数据BI
  8. 我感到惭愧不已的飞鸽传书
  9. you just 飞鸽传书2007绿色版 ever day for two years
  10. Nokia的北美困局