Program: CWE-79
Project: CVE-2021-35265
Buggy source:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

/**
 * MaxSite CMS
 * (c) http://max-3000.com/
 */

# функция автоподключения плагина
function global_cache_autoload($args = array())
{
	// исключаем из кэширования адреса по первому сегменту
	$no_cache = array('admin', 'page_404', 'contact', 'logout', 'login', 'registration', 'password-recovery', 'loginform', 'require-maxsite', 'ajax', 'remote', 'dc', 'feed', 'search');
	
	if (in_array(mso_segment(1), $no_cache)) return $args;
	
	$options = mso_get_option('plugin_global_cache', 'plugins', array());
	
	// кэш включен?
	if (isset($options['on']) and $options['on'])
	{
		# сброс кэша если была отправка POST
		if ( isset($_POST) and $_POST ) global_cache_all_flush();
		
		# дополнительные хуки, которые позволяют сбросить кэш - использовать в плагинах и т.п.
		mso_hook_add('global_cache_key_flush', 'global_cache_key_flush'); // сброс кэша текущей страницы
		mso_hook_add('global_cache_all_flush', 'global_cache_all_flush'); // сброс всего html-кэша
		
		// кэшировать только главную
		if (isset($options['home-only']) and $options['home-only'])
		{
			if (!is_type('home')) return $args;
		}
		
		// если залогиненность и есть опция выключения, то отключаем кэш
		if ( (isset($options['onlogin']) and $options['onlogin']) and (is_login() or is_login_comuser()))
		{
			return $args;
		}
		else
		{
			// ставим хуки на кэширование
			mso_hook_add('global_cache_start', 'global_cache_start');
			mso_hook_add('global_cache_end', 'global_cache_end');
		}
	}
}

# функция выполняется при деактивации (выкл) плагина
function global_cache_deactivate($args = array())
{	
	// очистить html-кэш
	global_cache_all_flush();
	return $args;
}

# функция выполняется при деинстяляции плагина
function global_cache_uninstall($args = array())
{	
	// очистить html-кэш
	global_cache_all_flush();
	return $args;
}

# текущий ключ
# если $dir = true, то добавляем каталог html
function global_cache_key($dir = true)
{
	$cache_key = $_SERVER['REQUEST_URI'];
	$cache_key = str_replace('/', '-', $cache_key);
	$cache_key = mso_slug(' ' . $cache_key);
	
	if (!$cache_key) $cache_key = 'home'; // главная
	
	if ($dir) $cache_key = 'html/' . $cache_key . '.html';
		else $cache_key = $cache_key . '.html';
	
	return $cache_key;
}

# старт кэширования
function global_cache_start($arg = array())
{
	if ( $k = mso_get_cache(global_cache_key(), true) ) 
	{
		// да есть в кэше
		$CI = & get_instance();	
		$mq = $CI->db->query_count; // колво sql-запросов
		$k = str_replace('<!--global_cache_footer-->', ' | Cache ON (' . $mq . 'sql)', $k);
		echo $k; 
		return true;
	}
	
	ob_start();
	return false;
}

# стоп кэширования - отдача результата
function global_cache_end($arg = array())
{
	# сброс кэша для страниц, которые отправлены как POST
	if ( isset($_POST) and $_POST ) global_cache_key_flush();
	else 
	{
		$options = mso_get_option('plugin_global_cache', 'plugins', array());
		
		if (!isset($options['time'])) $options['time'] = 15;
		
		mso_add_cache(global_cache_key(), ob_get_flush(), $options['time'] * 60, true);
	}
}

# сброс кэша текущей страницы
function global_cache_key_flush($arg = array())
{
	mso_flush_cache(false, 'html', global_cache_key(false));
	return $arg;
}

# сброс всего кэша html
function global_cache_all_flush($arg = array())
{
	mso_flush_cache(false, 'html');
	return $arg;
}

function global_cache_mso_options() 
{
	if ( !mso_check_allow('global_cache_edit') ) 
	{
		echo t('Доступ запрещен');
		return;
	}

	// сброс всего кэша
	if ( $post = mso_check_post(array('f_submit_clear_global_cache', 'f_session_id')) )
	{
		global_cache_all_flush();
		echo '<div class="update">'. t('Кэш очищен') . '</div>';
	}

	
	# ключ, тип, ключи массива
	mso_admin_plugin_options('plugin_global_cache', 'plugins', 
		array(
		
			'on' => array(
							'type' => 'checkbox', 
							'name' => t('Включить глобальное кэширование'), 
							'description' => '', 
							'default' => 1
						),
						
			'home-only' => array(
							'type' => 'checkbox', 
							'name' => t('Кэшировать только главную страницу'), 
							'description' => '', 
							'default' => 0
						),
			
			'onlogin' => array(
							'type' => 'checkbox', 
							'name' => t('Выключить глобальное кэширование для авторов/админов'), 
							'description' => '', 
							'default' => 1
						),
			
			'time' => array(
							'type' => 'text', 
							'name' => t('Время жизни кэша (минут)'), 
							'description' => t('Укажите время, через которое кэш устареет и будет создан заново'), 
							'default' => '15'
						),
			),
		t('Настройки глобального кэширования'), // титул
		t('Кэширует страницы целиком. В кэш будет добавляться полностью сгенерированные страницы, что ускоряет работу сайта. Рекомендуется для сайтов с большой посещаемостью. Данный кэш может занимать много места на диске.')   // инфо
	);
	
	echo '<form method="post">' . mso_form_session('f_session_id');
	echo '<p><button class="button i-stack-overflow" type="submit" name="f_submit_clear_global_cache">'. t('Сбросить кэш') . '</button></p>';
	echo '</form>';
	
}

# end of file

Fixed version (ground truth):
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

/**
 * MaxSite CMS
 * (c) http://max-3000.com/
 */

# функция автоподключения плагина
function global_cache_autoload($args = array())
{
	// исключаем из кэширования адреса по первому сегменту
	$no_cache = array('admin', 'page_404', 'contact', 'logout', 'login', 'registration', 'password-recovery', 'loginform', 'require-maxsite', 'ajax', 'remote', 'dc', 'feed', 'search');
	
	if (in_array(mso_segment(1), $no_cache)) return $args;
	
	$options = mso_get_option('plugin_global_cache', 'plugins', array());
	
	// кэш включен?
	if (isset($options['on']) and $options['on'])
	{
		# сброс кэша если была отправка POST
		if ( isset($_POST) and $_POST ) global_cache_all_flush();
		
		# дополнительные хуки, которые позволяют сбросить кэш - использовать в плагинах и т.п.
		mso_hook_add('global_cache_key_flush', 'global_cache_key_flush'); // сброс кэша текущей страницы
		mso_hook_add('global_cache_all_flush', 'global_cache_all_flush'); // сброс всего html-кэша
		
		// кэшировать только главную
		if (isset($options['home-only']) and $options['home-only'])
		{
			if (!is_type('home')) return $args;
		}
		
		// если залогиненность и есть опция выключения, то отключаем кэш
		if ( (isset($options['onlogin']) and $options['onlogin']) and (is_login() or is_login_comuser()))
		{
			return $args;
		}
		else
		{
			// ставим хуки на кэширование
			mso_hook_add('global_cache_start', 'global_cache_start');
			mso_hook_add('global_cache_end', 'global_cache_end');
		}
	}
}

# функция выполняется при деактивации (выкл) плагина
function global_cache_deactivate($args = array())
{	
	// очистить html-кэш
	global_cache_all_flush();
	return $args;
}

# функция выполняется при деинстяляции плагина
function global_cache_uninstall($args = array())
{	
	// очистить html-кэш
	global_cache_all_flush();
	return $args;
}

# текущий ключ
# если $dir = true, то добавляем каталог html
function global_cache_key($dir = true)
{
	$cache_key =  mso_clean_str($_SERVER['REQUEST_URI']); //$_SERVER['REQUEST_URI'];
	$cache_key = str_replace('/', '-', $cache_key);
	$cache_key = mso_slug(' ' . $cache_key);
	
	if (!$cache_key) $cache_key = 'home'; // главная
	
	if ($dir) $cache_key = 'html/' . $cache_key . '.html';
		else $cache_key = $cache_key . '.html';
	
	return $cache_key;
}

# старт кэширования
function global_cache_start($arg = array())
{
	if ( $k = mso_get_cache(global_cache_key(), true) ) 
	{
		// да есть в кэше
		$CI = & get_instance();	
		$mq = $CI->db->query_count; // колво sql-запросов
		$k = str_replace('<!--global_cache_footer-->', ' | Cache ON (' . $mq . 'sql)', $k);
		echo $k; 
		return true;
	}
	
	ob_start();
	return false;
}

# стоп кэширования - отдача результата
function global_cache_end($arg = array())
{
	# сброс кэша для страниц, которые отправлены как POST
	if ( isset($_POST) and $_POST ) global_cache_key_flush();
	else 
	{
		$options = mso_get_option('plugin_global_cache', 'plugins', array());
		
		if (!isset($options['time'])) $options['time'] = 15;
		
		mso_add_cache(global_cache_key(), ob_get_flush(), $options['time'] * 60, true);
	}
}

# сброс кэша текущей страницы
function global_cache_key_flush($arg = array())
{
	mso_flush_cache(false, 'html', global_cache_key(false));
	return $arg;
}

# сброс всего кэша html
function global_cache_all_flush($arg = array())
{
	mso_flush_cache(false, 'html');
	return $arg;
}

function global_cache_mso_options() 
{
	if ( !mso_check_allow('global_cache_edit') ) 
	{
		echo t('Доступ запрещен');
		return;
	}

	// сброс всего кэша
	if ( $post = mso_check_post(array('f_submit_clear_global_cache', 'f_session_id')) )
	{
		global_cache_all_flush();
		echo '<div class="update">'. t('Кэш очищен') . '</div>';
	}

	
	# ключ, тип, ключи массива
	mso_admin_plugin_options('plugin_global_cache', 'plugins', 
		array(
		
			'on' => array(
							'type' => 'checkbox', 
							'name' => t('Включить глобальное кэширование'), 
							'description' => '', 
							'default' => 1
						),
						
			'home-only' => array(
							'type' => 'checkbox', 
							'name' => t('Кэшировать только главную страницу'), 
							'description' => '', 
							'default' => 0
						),
			
			'onlogin' => array(
							'type' => 'checkbox', 
							'name' => t('Выключить глобальное кэширование для авторов/админов'), 
							'description' => '', 
							'default' => 1
						),
			
			'time' => array(
							'type' => 'text', 
							'name' => t('Время жизни кэша (минут)'), 
							'description' => t('Укажите время, через которое кэш устареет и будет создан заново'), 
							'default' => '15'
						),
			),
		t('Настройки глобального кэширования'), // титул
		t('Кэширует страницы целиком. В кэш будет добавляться полностью сгенерированные страницы, что ускоряет работу сайта. Рекомендуется для сайтов с большой посещаемостью. Данный кэш может занимать много места на диске.')   // инфо
	);
	
	echo '<form method="post">' . mso_form_session('f_session_id');
	echo '<p><button class="button i-stack-overflow" type="submit" name="f_submit_clear_global_cache">'. t('Сбросить кэш') . '</button></p>';
	echo '</form>';
	
}

# end of file