8.2.0.控制器执行安全

控制器执行安全

控制器安全由适配器提供。

控制器类

namespace qing\controller;
use qing\com\Component;
//
interface ControllerInterface{
     public function _runAction($ctrlName,$actionName,array $actionParams=[]);
}
//继承Component已经被移除
//class Controller extends Component implements ControllerInterface{
class Controller implements ControllerInterface{
    /**
     * 限制http访问权限|转发不受限制
     * 
     * @var boolean
     */
    public $httpAccess=true;
    /**
     * 限制所有的访问权限|转发也受限制
     *
     * @var boolean
     */
    public $access=true;
    /**
     * - 该方法被调用在操作执行时
     * 
     * 注意: 不能设置为public,会被作为控制器操作访问
     * 
     * @return boolean
     */
    protected function beforeAction(){
        return true;
    }
    /**
     * index.php/Controller/test 控制器不存在
     */
    //public function test(){dump(__METHOD__);}
}

ControllerAdapter适配器安全处理

<?php
namespace qing\adapter;
use qing\com\Component;
/**
 * 控制器适配器
 */
class ControllerAdapter extends Component implements AdapterInterface{
    /**
     * 禁止访问的操作名称|appName/__get
     * 
     * - beforeaction可能会被不小心写成public访问权限,如果是protected则没有风险
     * - 基类的Component::initComponent也可能被作为控制器操作访问
     * 
     * @tutorial 必须小写
     * @var array
     */
    public $banActionNames=['beforeaction','afteraction'];
    /**
     * 禁止访问的类
     *
     * @var array
     */
    //public $banClassNames=[];
}

禁止访问操作名或控制器类名

$banActionNames=['beforeaction','afteraction']; public $banClassNames=[];

怎样才是合法的控制器类,操作方法?

注意事项

访问权限控制

允许访问

不允许访问

禁止访问的操作名称

/**
 * 禁止访问的操作名称
 * 
 * - beforeaction可能会被不小心写成public访问权限,如果是protected则没有风险
 * - 基类的Component::initComponent也可能被作为控制器操作访问
 * 
 * @var array 必须小写
 */
public $banActionNames=['beforeaction','afteraction'];

危险的内置成员函数,不可访问

用户控制器重写父类的方法,public时可被非法访问

案例

<?php
namespace main\controller;
/**
 * 控制器基类
 */
class Base extends \qing\controller\Controller{
    /**
     * @return boolean
     */
    protected function beforeAction(){
        return true;
    }
    /**
     * index.php/index/common //禁用的操作所在控制器类
     * index.php/base/common  //正常访问
     */
    public function common(){
        dump(__METHOD__);
    }
}
?>
<?php
namespace main\controller;
/**
 */
class Index extends Base{
    /**
     * @var boolean
     */
    public $httpAccess=true;//如果为false不允许访问
    /**
     */
    public function index(){
        dump(__METHOD__);
    }
    /**
     */
    public function _index(){//禁止访问,操作名不能以下划线开头
        dump(__METHOD__);
    }
    /**
     */
    public static function sindex(){//禁止访问,静态函数
        dump(__METHOD__);
    }
    /**
     */
    protected function pindex(){//禁止访问,非public函数
        dump(__METHOD__);
    }
    /**
     * @return boolean
     */
    public function beforeAction(){//禁用的操作方法/控制器类,不小心写成public
        dump(__METHOD__);
        return true;
    }
}
?>

index.php/index/abc //禁止访问,控制器操作不存在
index.php/index/sindex //禁止访问,静态函数
index.php/index/pindex //禁止访问,非public函数
index.php/index/_index //禁止访问,操作名不能以下划线开头
index.php/index/common //禁用的操作所在控制器类
index.php/base/common  //正常访问

index.php/Controller/test 控制器不存在 Controller
index.php/Component/comName 控制器不存在 Component

其他框架的做法