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);
}
}
?>