Кстати, по поводу всех этих коннекторов и т.п. В с

Кстати, по поводу всех этих коннекторов и т.п. В своих пользовательских коннекторах я всегда явно указываю $_SERVER['ctx'] = 'web'; С этими коннекторами всегда вопрос безопасности стоял остро и первый мой багрепорт на эту тему был еще в 2011-ом.

Но это свои пользовательские коннекторы. А что делать с системными? Ведь во-первых, в ядро лезть — это совсем не по религии, а во-вторых, при переустановке MODX-а это все затрется. На этот счет есть очень элегантное решение: можно просто переопределить класс обработки процессоров. Вот в connectors/index.php есть такая строка:

$connectorRequestClass = $modx->getOption('modConnectorRequest.class',null,'modConnectorRequest');

А значит вы можете создать свой класс, расширить им базовый modConnectorRequest, прописать его в системную настройку с именем modConnectorRequest и в своем классе уже дополнительно прописать проверки.

К примеру в базовом классе есть метод initialize:

public function initialize() {
    if ($this->modx && is_object($this->modx->context) && $this->modx->context instanceof modContext) {
        $ctx = $this->modx->context->get('key');
        if (!empty($ctx) && $ctx == 'mgr') {
            $ml = $this->modx->getOption('manager_language',null,$this->modx->getOption('cultureKey',null,'en'));
            if (!empty($ml)) {
                $this->modx->setOption('cultureKey',$ml);
            }
        }
    }

    /* load default core cache file of lexicon strings */
    $this->modx->lexicon->load('core:default');

    if ($this->modx->actionMap === null || !is_array($this->modx->actionMap)) {
        $this->loadActionMap();
    }

    return true;
}

Собственно, у меня есть пара вопросов к этому коду, но сейчас не об этом. В общем, переопределим этот метод и пропишем явно проверку контекста:

public function initialize() {
    if (!$this->modx OR !is_object($this->modx->context) OR !$this->modx->context instanceof modContext OR !in_array($this->modx->context->key, array('web', 'mgr'))){
        return 'Access denied';
    }
    
    return parent::initialize();
}

Все. Если контекст не будет инициализирован, или он не в списке разрешенных, то шлем лесом.