IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP笔记-随机生成cookie、后台检索、通过session获取ID增强安全性 -> 正文阅读

[PHP知识库]PHP笔记-随机生成cookie、后台检索、通过session获取ID增强安全性

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

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

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

内容如下:

CookieAndSession.php

<?php

namespace safe;

class CookieAndSession{

    public $cookie;
    public $userId;
    public $browser;
    public $os;
    public $timeToLive;
}

CookieTool.php

<?php

namespace 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

<?php

    define("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知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:08:09  更:2022-03-08 22:08:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 11:36:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码