• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Класс страниц

  • Автор темы Gisma
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Gisma

Предназначен для создания классов страниц. Активно используется для создания модульных страниц. В последствии, модульные страницы через наследование дорабатываются до конкретного проекта и переносятся на вывод.

Кроме стандартного функционал, в основу разработки класса положены идеи паттерна проектирования Facade. Он отлично подходит для расширения функционала страниц.

Немножко теории. Замечена склонность людей описывать в одном скрипте несколько реакций на переменные из GET/POST или других объектов внешной среды. Соотв. в зависимости от разных параметров скрипт выдает/осуществялет разные данные/действия. Все хорошо, если таких вариантов развития событий два или три, но картина заметно усложняется как только таких реакций становится целое множество :). Все становится просто адски сложно если такую старницу нужно постоянно дорабатывать.

Эту проблему можно решить с помощью ввода класса страницы, пусть методы этого класса будут реакциями на внешние события, так проще если реакций несколько. И пусть на одно и тоже событие можно подключить несколько методов класса (Facade).

полная документация здесь:

сам класс:
Код:
<?
//************************************************************//
//															//
//				 Базовый класс Страницы					//
//	  Copyright (c) 2006 ООО SmartDesign				 //
//			  отдел/сектор								 //
//	  Email: gis2002@inbox.ru							 //
//															//
// Разработчик: Gisma (13.01.2007)						  //
// Модифицирован: 27.06.2006 by Gisma					 //
//															//
//************************************************************//
class CPage {
/**
*  @var array Массив хранит все существющие схемы обработок для POST
*/
var $aPostSchema = array();
/**
*  @var array Массив, хранящий существующие схемы обработок для GET
*/
var $aGetSchema = array();
/**
*  @var array Массив, хранящий имена финишных функций для _POST
*/
var $aPostFinish = array();
/**
*  @var array Массив, хранящий имена финишных функций для _GET
*/
var $aGetFinish = array();
/**
*  @var array Массив, хранящий имена функции для каждого сценария
*/
var $aFunction = array();
/**
*  @var string Строка хранящая имя функции по умолчанию
*/
var $szDefault = '';
function CPage() {
// устанавливаем дефолтовую переменную
$this->szDefault = 'main';
}
/**
*  @desc Дефолтовая функция куда передается управления страницой
*  @return 
*/
function main() {
}
/**
*  @desc Добавляет новый обработчик _GET
*  @return 
*/
function addPost($name,$action) {
// сначала, мы должны получить схему (если ее нет, она будет создана)
$nResult = $this->findSchema($name,true);
// проверяем есть ли такая уже функция, т.к. обработчики не должны повторяться
$nFound = array_search($action,$this->aFunction[$nResult]);
if ($nFound === false ) {
// нет не существует ничего не делаем
// проверяем нет ли функции а массиве финишных функция
if ($this->aPostFinish[$nResult] != $action) {
// нет, нету
} else {
// да, есть 
// удаляем из финишных функцию
$this->aPostFinish[$nResult] = '';
}
// добавляем функцию
$this->aFunction[$nResult][] = $action;
}
}
/**
*  @desc Добавляет новый обработчик _POST
*  @return 
*/
function addGet($name,$action) {
// сначала, мы должны получить схему (если ее нет, она будет создана)
$nResult = $this->findSchema($name,false);
// проверяем есть ли такая уже функция, т.к. обработчики не должны повторяться

$nFound = array_search($action,$this->aFunction[$nResult]);
if ($nFound === false ) {
// нет не существует ничего не делаем
// проверяем нет ли функции а массиве финишных функция

if ($this->aGetFinish[$nResult] != $action) {
// нет, нету
} else {
// да, есть 
// удаляем из финишных функцию
$this->aGetFinish[$nResult] = '';
}
// добавляем функцию
if (!isset($this->aFunction[$nResult])) {
$this->aFunction[$nResult] = array();
}
$this->aFunction[$nResult][] = $action;


}
}
/**
*  @var Добавляет финишную функции в POST схемы
*/
function addPostFinish($name,$action) {
// сначала, мы должны получить схему (если ее нет, она будет создана)
$nResult = $this->findSchema($name,true);
// проверяем есть ли такая уже функция в массиве функций
$nFound = array_search($action,$this->aFunction[$nResult]);
if ($nFound !== false) {
// удаляем функцию
unset($this->aFunction[$nResult][$nFound]);
}
$this->aPostFinish[$nResult] = $action;
}
function addGetFinish($name,$action) {

// сначала, мы должны получить схему (если ее нет, она будет создана)
$nResult = $this->findSchema($name,false);

// проверяем есть ли такая уже функция в массиве функций
$nFound = array_search($action,$this->aFunction[$nResult]);
if ($nFound !== false) {
// удаляем функцию
unset($this->aFunction[$nResult][$nFound]);
}
$this->aGetFinish[$nResult] = $action;
}
function setDefault($name) {
$this->szDefault = $name;
}
function process() {
$szMethod = $_SERVER['REQUEST_METHOD'];
if ( $szMethod == 'GET') 
$this->callProcs(false);
if ($_SERVER['REQUEST_METHOD'] == 'POST') 
$this->callProcs(true);
}
/**
*  @desc Выставляет 403:)
*/
function error403() {
//global $trace;
//$trace->makeDebug();
//$Application->destroy();
header ("HTTP/1.0 403 Forbidden"); die;
}
/**
*  @desc Выставляет 404:)
*/
function error404() {
//global $trace,$Application;
//$trace->makeDebug();
//$Application->destroy();
header("HTTP/1.0 404 Not Found");
die;
}
/**
*  @desc Выполняет редирект на указанный url 
*/
function jump($url = '') {
global $Application;
if (empty($url)) {
die('Page:jump Url empty');
}
//global $trace;
//$trace->makeDebug();
//$Application->destroy();
header('Location: '.$url);
die();
}
/**
*  @desc Ищет указанную схему, если ее нет, то создает заново
*  @return 
*/
function findSchema($name,$is_post = false) {
if ($is_post) {
$aData = &$this->aPostSchema;
} else {
$aData = &$this->aGetSchema;
}
// разрезаем схему по запятой
$aSchema = explode(',',$name);
// перебираем все существующие схемы 
foreach ($aData as $key=>$value) {
// ищем совпадает ли схема с существующей
if (sizeof($aSchema) == sizeof($value)) {
// вычисляем разницу между схемами
$aDiff = array_diff($aSchema,$value);
if (sizeof($aDiff) == 0) {
// значит схема совпадает и найдена
// возвращает результат
return $key;
}
}
}
// если мы дошли до этой точки, значит схема до сих пор не найдена

$this->aFunction[] = array();
$nResult = sizeof($this->aFunction) - 1;
$this->aGetFinish[$nResult] = '';
$this->aPostFinish[$nResult] = '';
$aData[$nResult] = $aSchema;
return $nResult;
}
/**
*  @var Вызываем обработчики для 
*/
function callProcs($is_post = false) {
// определяем массивы данных
if ($is_post) {
$aData = $_POST;
$aSchema = $this->aPostSchema;
$aFinish = $this->aPostFinish;
} else {
$aData = $_GET;
$aSchema = $this->aGetSchema;
$aFinish = $this->aGetFinish;
}

// определяем активную схему 
$nSchema = -1;
foreach ($aSchema as $key => $value) {
// перебираем все параметры
$bFlag = true;
foreach ($value as $szParam) {
if (!isset($aData[$szParam])) {
$bFlag = false;
break;
}
}

if ($bFlag) {
$nSchema = $key;
break;
}
}

// для активной схемы
if ($nSchema >= 0) {
// собираем аргументы по схеме
$aArgument = array();
foreach ($aSchema[$nSchema] as $key=>$value) {
$aArguments[] =$aData[$value];
}
// вызываем все переменные
foreach ($this->aFunction[$nSchema] as $szFunction) {
if (is_callable(array(&$this,$szFunction))) {

call_user_func_array(array(&$this,$szFunction),$aArguments);
} else {

die('Method `'.$szFunction.'` doesn`t exists');
}
}
// вызываем финишную функцию
if (!empty($aFinish[$nSchema]) && is_callable(array($this,$aFinish[$nSchema]))) {
call_user_func_array(array(&$this,$aFinish[$nSchema]),$aArguments);
} elseif (!empty($aFinish[$nSchema])) {
die('Method `'.$aFinish[$nSchema].'` doesn`t exists');
}

} else {
// иначе 
// определеня дефолтовая функцию?

if (is_callable(array($this,$this->szDefault))) {
// да 
// вызываем
call_user_func(array($this,$this->szDefault));

} else {
// нет

}
}




}
}

/**
*  @desc 
*  @return 
*/
/*function callProcs($aParam,$aData) {
global $trace;
$bFlagFound = false;

foreach ($aParam as $value=>$name) {
$tmp = explode(',',$name);
$bFlag = 1;
$aParam = array();

for ($i = 0; $i < sizeof($tmp); $i++) 
if (!isset($aData[$tmp[$i]])) {
$bFlag = 0;
break;
} else {
$aParam[] = $aData[$tmp[$i]];
}
if ($bFlag == 1) 
if (is_callable(array($this,$value))) { 
$trace->addDebug('Page','callProcs: Вызов метода `'.$value.'`');

call_user_func_array(array(&$this,$value),$aParam); 
$bFlagFound = true;
} else postError('CPage::process не могу найти функцию :"'.$value.'"');
}
if ((false == $bFlagFound) && (is_callable(array($this,$this->szDefault)))) {
$trace->addDebug('Page','callProcs: Вызов метода `'.$this->szDefault.'`');
call_user_func(array($this,$this->szDefault));
}
}*/
?>
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!