关键词搜索

源码搜索 ×
×

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

发布2022-03-07浏览874次

详情内容

这里给出的是一个很常用的权限拦截例子,也是目前主流的方法,但存在cookie劫持,有安全风险。后面有博文说如何去解决。

对应的权限登录的类是这样的:

  1. class PrivilegeController extends Controller {
  2. ......
  3. ......
  4. ......
  5. }

其中权限是在Controller类中,如下:

  1. class Controller{
  2. protected $smarty;
  3. public function __construct(){
  4. include VENDOR_PATH . "smarty/Smarty.class.php";
  5. $this->smarty = new \Smarty();
  6. $this->smarty->template_dir = APP_PATH . P . "/view/";
  7. $this->smarty->compile_dir = RESOURCES_PATH . "views";
  8. if(strtolower(C) != "privilege"){
  9. if(isset($_COOKIE['id'])){
  10. $userModel = new UserModel();
  11. $user = $userModel->getById((int)$_COOKIE['id']);
  12. if($user){
  13. $_SESSION['user'] = $user;
  14. return;
  15. }
  16. }
  17. $this->error("未登录,请先登录", "user", "privilege", "login");
  18. }
  19. }
  20. ......
  21. ......
  22. ......
  23. ......
  24. }

从中可以看到这里主要是通过拿到浏览器的COOKIE来判断,拿的这个值通过查询(商用库、Redis等)存不存,存在就放行。并且把$_SESSION['user']存起来。

另外,只有Controller不为privilege的请求,都会被拦截。

设置COOKIE是在登录函数里面,如下:

  1. public function check(){
  2. $useName = trim($_POST["userName"]);
  3. $password = trim($_POST["password"]);
  4. $captcha = trim($_POST["captcha"]);
  5. ......
  6. ......
  7. ......
  8. @session_start();
  9. $_SESSION['user'] = $user;
  10. setcookie('id',$user['user_id'],time() + 1 * 24 * 3600);
  11. $this->success("登录成功", '', 'dashboard', "index");
  12. }

退出登录的:

  1. public function logout(){
  2. session_destroy();
  3. setcookie('id','',1);
  4. $this->success("退出成功", "", "", "login");
  5. }

这里设置的cookie是哪里user_id,对应的是这个

通过修改php.ini可以看其session

 内容如下:

 但这种,存在cookie劫持,并且这里会把user_id带给cookie也是有风险的:

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载