PHP笔记-随机生成cookie、后台检索、通过session获取ID增强安全性
在
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增强安全性相关推荐
- python随机生成车牌_使用Python自动化获取全国每个城市的车牌代码
最近有这样一需求,需要获取12123交管查询网站上的全国每个城市对应的城市id和车牌代码.最初的想法是直接用Python写个爬虫,遍历每个城市,然后用Xpath提取DOM节点数据就好了.然而在实际操作 ...
- 【SQL Server 学习系列】-- sql 随机生成中文名字
[SQL Server 学习系列]-- sql 随机生成中文名字 原文:[SQL Server 学习系列]-- sql 随机生成中文名字 1 DECLARE @fName TABLE(Id INT I ...
- python随机生成一组数据_使用Python random模块生成随机数据实例
在本节中,我们将学习如何使用random模块(random)在Python中生成随机数和数据.该模块为各种分布(包括整数,浮点数(实数))实现了伪随机数生成器. 本文的目标: 以下是我们将在本文中介绍 ...
- Java 随机生成 “纯数字“、“纯字母“ 、“数字字母混合“ ID 并保持全局唯一
文章目录 随机生成 "纯数字"."纯字母" ."数字字母混合" ID并保持全局唯一 一.随机生成纯数字ID 二.随机生成纯字母ID 三.随机 ...
- mysql 生成邀请码_如何实现用户id生成一个唯一邀请码
根据用户id生成与之对应的唯一邀请码,范围为'0-9A-Z'.这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升. ...
- 什么是cookie,什么是session,cookie和session的区别
会话跟踪 1. 什么是会话 * 用户拨打10086,从服务台接通后会话开始: * 用户发出话费查询请求,服务台响应.这是该会话中的一个请求: * 用户发出套餐变更请求,服务台响应.这是该会 ...
- 【机器学习笔记】随机生成mini-batches的原理及过程
描述问题 在写实现生成mini-batches的时候,发现不能很好理解X[:,n]及X[:,m:n]的原理.下面具体围绕数组介绍切片原理展开讲述如何在不打乱数据集X与对应标签Y的对应关系的条件下,随机 ...
- Java 随机生成 0-9a-zA-z 和 汉字 学习笔记
Java 随机生成 0-9a-zA-z 和 汉字 导包 import org.apache.commons.lang3.RandomStringUtils; 代码 // 0-9a-zA-z 参数为字符 ...
- php随机数字总和固定,php 随机生成固定长度整数、各种服务器请求方法
搜索热词 1.随机生成整数函数,感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编来看看吧. 经测试代码如下: @H_301_3@/** * 随机生成整数函数(生成位数:$pw_length) ...
最新文章
- android:退出程序
- 为什么现在小学生都学计算机编程了,为何要在小学阶段开展编程教育?
- 8bit黑白图像的灰度值范围是_数字图像处理基本知识
- 算法设计与分析——回溯法——批处理作业调度
- 【TypeScript系列教程10】循环语句的使用
- html柳树动画,3D教程-柳树生长动画
- Linux LVM过程问题
- mp.weixin.php,GitHub - temberature/mp-php-sdk: 微信公众平台第三方授权php开发包, weixin mp developer SDK....
- MySQL图形化管理器——EMS SQL Management Studio
- Mac局域网本地库server, CornerStone使用
- [Struts]使用tiles管理界面遇到困难
- 使用LL库开发STM32:UART基础使用
- 小学计算机基础知识思维导图,简单易懂的小学除法思维导图
- Day14-正则表达式及常用类
- 最通俗易懂——TCP/IP协议,让你明明白白!
- 彻底掌握 Javascript(八)正则表达式【讲师辅导】-曾亮-专题视频课程
- 南邮电工电子实验设计5(单极共射放大电路)
- 阿里云服务器mysql开放远程连接步骤
- 可重复读如何解决幻读
- java学生类 方法 输出_高额悬赏,java面向对象编程,编写学生类,输出学生相关信息...
热门文章
- jquery $.get()、$.ajax()与后台servlet交互方法
- Grunt 之通配符
- python核心编程笔记chapter 3
- Android的listview滚动时背景不让变黑解决办法
- 如何在Linux kernel Makefile中添加宏定义
- 南孚电池:如何从0-1建立经营分析报表平台,助力集团转型?
- 关于BI商业智能的“8大问”|一文读懂大数据BI
- 我感到惭愧不已的飞鸽传书
- you just 飞鸽传书2007绿色版 ever day for two years
- Nokia的北美困局