08: 访问控制

安全308 字

title = ""
categories = "PHP"
date =

+++

■ 控制方法

场景:需要进行授权访问的系统在进行访问时接入。

说明:将访问控制的逻辑代码与应用程序其他代码分开,服务端根据会话标识来进行访问控制管理。

PHP示例:根据用户组对用户权限进行独立的访问控制。

<?php
    public function getPermission() {
        $this->is_login();
        $user_id = session('id');
        return $user_privileges = DB::table('userPermission')
                                  ->where('user_id', $user_id)
                                  ->get()
                                  ->toArray();
    }
?>

■ 控制管理

场景:用户访问权限校验。

说明:限制只有授权的用户才能访问受保护的URL、文件、服务、应用数据、配置、直接对象引用等。

PHP示例:用户访问URL时对其权限进行校验。

<?php
    namespace App\Http\Controllers\Data;
    use App\Http\Controllers\BaseController;
    
    public function preHandle() {
        $privileges = $this->getPermission();
        if (!$privileges) {
            return $this->responseError('没有访问权限');
        }
        // Handle logic here
    }
?>

■ 接口管理

场景:在那些具有安全性要求的应用程序中,需要检查应用程序是否能访问一些有限的资源,例如文件、套接字(socket) 等。

说明:限制只有授权的用户才能访问受保护的URL、文件、服务、应用数据、配置、直接对象引用等。

(coding...)

■ 权限变更

场景:权限发生变化时。

说明:当权限发生变更时,应记录日志,并通知用户是否是本人操作,告知存在的安全风险。

PHP示例:权限变更时通知。

<?php
    date_default_timezone_set('PRC');
     
    public function writeLog($filename, $msg) {
        $file = dirname(__FILE__) . '/logs/' . $filename . date('Ym') . '.log';
        !is_dir(dirname($file)) && mkdir(dirname($file), 0777, true);
        $handle = fopen($file, 'a');
        flock($handle, LOCK_EX);
        fwrite($handle, sprintf("%s %s\r\n", date('Y-m-d H:i:s',time()), $msg));
        flock($handle, LOCK_UN);
        fclose($handle);
    }
    
    public function roleUpdate() {
        require "DBDA.class.php";
        $db = new DBDA();
        $uid = $_POST["uid"];
        $js = $_POST["js"];
        
        $privileges = $this->getPermission();
        if (!$privileges) {
            return $this->responseError('没有操作权限');
        }
        
        $con = mysqli_connect($host, $user, $pass, $dbName)
        $con->set_charset("utf8");
        $smt = $con->prepare("DELETE FROM userRole WHERE userid=?");
        $smt->bindParam("s", $uid);
        $smt->execute();
        writeLog("admin", "DELETE FROM userRole WHERE userid=".$uid);
         
        $ajs = explode(",", $js);
        foreach($ajs as $v){
            $smt = $con->prepare("INSERT INTO userinjuese SET uid=?, value=?");
            $smt->bindParam("ss", $uid, $v);
            $smt->execute();
            writeLog("admin", "INSERT INTO userinjuese SET uid=".$uid.", value=".$v);
        }
    }
?>
maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见