• XSS.stack #1 – первый литературный журнал от юзеров форума

Обзор фреймворка Code Igniter

SapienS

RAM
Пользователь
Регистрация
14.08.2005
Сообщения
113
Реакции
0
В последнее время в сети развелось очень много CMS систем. Выбрать ту, которая подходила бы именно вам, имела понятный интерфейс и должный уровень безопасности задача почти невыполнимая.
Писать новую CMS? Да, это выход. Но написание может затянуться на ооочень долгое время...
Есть выход лучше - использовать фреймворк. Фреймворк - это основа для будущей CMS: классы, библиотеки, различные функции. Дальнейшее повествование будет вестись о фреймворке Code Igniter.

Дистрибутив последней версии этой замечательной вещицы всего 650 кб. Качаем с оф. сайта http://www.codeigniter.com

Распаковываем архив и видим 2 каталога: "system" и "user_guide".
Вся установка состоит из 2-х пунктов:
1) Правим system/application/config/config.php - пишем свой URL, а так же другие настройки, вроде языка и различных путей.
2) Правим config.php - так же различные пути, название системных каталогов...
Если имеем дело с БД, надо редактить system/application/config/database.php. Там все стандартно - хост, логин, пасс и пр.

Все! Система уже работает, можем зайти на индексовую страницу :D

Дальше будет посложнее...

Фреймворк Code Igniter основан на архитектуре Model-View-Controller (MVC).
Модель (Model) служит для работы с БД. Лежат в system/application/models.
Вид (View) практически является HTML документом, с той лишь разницей, что этот документ имеет в своем составе что-то вроде указателей для парсера. Например, "{elapsed_time}" при обработке будет заменено на соответствующую переменную. Лежат в system/application/views.
Контроллер (Controller) обеспечивает связь Модели и Вида. Если текущий проект не связывается с БД, то в Контроллере мы перечислим основные функции для работы модуля. Лежат в system/application/controllers.

Рассмотрим стандартный пример. Главная стрница в только что установленном Code Igniter`e является совокупностью Контроллера welcome и Вида welcome_message.

Синтаксис Контроллера:

Код:
<?php

class Welcome extends Controller {

	function Welcome()
	{
  parent::Controller();	
	}
	
	function index()
	{
  $this->load->view('welcome_message');
	}
}
?>

Строка
Код:
$this->load->view('welcome_message');
означает, что в качестве вида используется файл system/application/views/welcome_message.php. Остальное, думаю, понятно.

Листинг welcome_message.php:

Код:
Welcome to Code Igniter!

The page you are looking at is being generated dynamically by Code Igniter.

If you would like to edit this page you'll find it located at:
system/application/views/welcome_message.php 

The corresponding controller for this page is found at:
system/application/controllers/welcome.php 

If you are exploring Code Igniter for the very first time, you should start by reading the {User Guide}.


Page rendered in {elapsed_time} seconds

{User Guide} и {elapsed_time} при обработке будут заменены на соответствующие переменные, которые определяются не в Контроллере, что тоже возможно, а в ядре системы.

Примеры посложнее можно найти здесь.

ЗЫ: система довольно понятная, все описано в мануале. Если есть вопросы - задавайте :)
ЗЗЫ: знакомый делает сайт на основе этого фреймворка, можно глянуть здесь.
 
Хм, я вот никогда не пользовался фрэймворками. Все ручками,но как и всякий кодер я ленив,надоедает писать однотипный код.
Вообщем 2 вопроса/замечания:
1. Скорость выполнения кода? Падает ли она сильно,если да,то насколько сильно. ООП давно уже шагнуло в массы,но я не люблю его использовать для небольших проектов.
2. Безопасность. Насколько надежно использовать ФрэймВорк как посредника для работы с БД и т.п.. Насколько устойчив и прочен? Просто когда я пишу свой код, то отдаю отчет где у меня опасные моменты и как с ними работать,но что написано сторонними кодерами,мне неизвестно...

Собсна, жду ответа :)
 
2 Psixo:

1. Скорость приличная. Хотя, если честно, особо я его не насиловал :crazy:
2. А здесь все довольно неплохо. Очень система нравится подробными комментами. Например, вырезалка XSS в системе такая:

Код:
	function xss_clean($str, $charset = 'ISO-8859-1')
	{	
  /*
   * Remove Null Characters
   *
   * This prevents sandwiching null characters
   * between ascii characters, like Java\0script.
   *
   */
  $str = preg_replace('/\0+/', '', $str);
  $str = preg_replace('/(\\\\0)+/', '', $str);

  /*
   * Validate standard character entites
   *
   * Add a semicolon if missing.  We do this to enable
   * the conversion of entities to ASCII later.
   *
   */
  $str = preg_replace('#(&\#*\w+)[\x00-\x20]+;#u',"\\1;",$str);
  
  /*
   * Validate UTF16 two byte encodeing (x00) 
   *
   * Just as above, adds a semicolon if missing.
   *
   */
  $str = preg_replace('#(&\#x*)([0-9A-F]+);*#iu',"\\1\\2;",$str);

  /*
   * URL Decode
   *
   * Just in case stuff like this is submitted:
   *
   * <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a>
   *
   * Note: Normally urldecode() would be easier but it removes plus signs
   *
   */	
  $str = preg_replace("/%u0([a-z0-9]{3})/i", "&#x\\1;", $str);
  $str = preg_replace("/%([a-z0-9]{2})/i", "&#x\\1;", $str);        
          
  /*
   * Convert character entities to ASCII 
   *
   * This permits our tests below to work reliably.
   * We only convert entities that are within tags since
   * these are the ones that will pose security problems.
   *
   */
   
        if (preg_match_all("/<(.+?)>/si", $str, $matches))
        {        
  	for ($i = 0; $i < count($matches['0']); $i++)
  	{
    $str = str_replace($matches['1'][$i], 
        	$this->_html_entity_decode($matches['1'][$i], $charset), 
        	$str);
  	}
  }
	
  /*
   * Convert all tabs to spaces
   *
   * This prevents strings like this: ja	vascript
   * Note: we deal with spaces between characters later.
   *
   */  
  $str = preg_replace("#\t+#", " ", $str);
	
  /*
   * Makes PHP tags safe
   *
   *  Note: XML tags are inadvertently replaced too:
   *
   *	<?xml
   *
   * But it doesn't seem to pose a problem.
   *
   */  
  $str = str_replace(array('<?php', '<?PHP', '<?', '?>'),  array('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $str);
	
  /*
   * Compact any exploded words
   *
   * This corrects words like:  j a v a s c r i p t
   * These words are compacted back to their correct state.
   *
   */  
  $words = array('javascript', 'vbscript', 'script', 'applet', 'alert', 'document', 'write', 'cookie', 'window');
  foreach ($words as $word)
  {
  	$temp = '';
  	for ($i = 0; $i < strlen($word); $i++)
  	{
    $temp .= substr($word, $i, 1)."\s*";
  	}
  	
  	$temp = substr($temp, 0, -3);
  	$str = preg_replace('#'.$temp.'#s', $word, $str);
  	$str = preg_replace('#'.ucfirst($temp).'#s', ucfirst($word), $str);
  }
	
  /*
   * Remove disallowed Javascript in links or img tags
   */  
   $str = preg_replace("#<a.+?href=.*?(alert\(|alert&\#40;|javascript\:|window\.|document\.|\.cookie|<script|<xss).*?\>.*?</a>#si", "", $str);
   $str = preg_replace("#<img.+?src=.*?(alert\(|alert&\#40;|javascript\:|window\.|document\.|\.cookie|<script|<xss).*?\>#si", "", $str);
   $str = preg_replace("#<(script|xss).*?\>#si", "", $str);

  /*
   * Remove JavaScript Event Handlers
   *
   * Note: This code is a little blunt.  It removes
   * the event handler and anything up to the closing >, 
   * but it's unlkely to be a problem.
   *
   */  
   $str = preg_replace('#(<[^>]+.*?)(onblur|onchange|onclick|onfocus|onload|onmouseover|onmouseup|onmousedown|onselect|onsubmit|onunload|onkeypress|onkeydown|onkeyup|onresize)[^>]*>#iU',"\\1>",$str);
	
  /*
   * Sanitize naughty HTML elements
   *
   * If a tag containing any of the words in the list 
   * below is found, the tag gets converted to entities.
   *
   * So this: <blink>
   * Becomes: &lt;blink&gt;
   *
   */  
  $str = preg_replace('#<(/*\s*)(alert|applet|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|layer|link|meta|object|plaintext|style|script|textarea|title|xml|xss)([^>]*)>#is', "&lt;\\1\\2\\3&gt;", $str);
  
  /*
   * Sanitize naughty scripting elements
   *
   * Similar to above, only instead of looking for
   * tags it looks for PHP and JavaScript commands
   * that are disallowed.  Rather than removing the
   * code, it simply converts the parenthesis to entities
   * rendering the code unexecutable.
   *
   * For example:	eval('some code')
   * Becomes:  eval('some code')
   *
   */
  $str = preg_replace('#(alert|cmd|passthru|eval|exec|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', "\\1\\2(\\3)", $str);
      
  /*
   * Final clean up
   *
   * This adds a bit of extra precaution in case
   * something got through the above filters
   *
   */	
  $bad = array(
      'document.cookie'	=> '',
      'document.write'	=> '',
      'window.location'	=> '',
      "javascript\s*:"	=> '',
      "Redirect\s+302"	=> '',
      '<!--'    => '&lt;!--',
      '-->'    => '--&gt;'
    	);
	
  foreach ($bad as $key => $val)
  {
  	$str = preg_replace("#".$key."#i", $val, $str);   
  }
  
                        
  log_message('debug', "XSS Filtering completed");
  return $str;
	}
 
очередной MVC framework , лучшеб обозрел mzz (http://mzz.ru), накрайняк дупал (dupal.ru)
+google code search выдал
http://weework.googlecode.com/svn/trunk
http://simple-php-framework.googlecode.com/svn/trunk
http://php-xframework.googlecode.com/svn/trunk
http://phpsimpl.googlecode.com/svn/trunk
http://mmframe.googlecode.com/svn/trunk
http://akelosframework.googlecode.com/svn/trunk
+http://phponrails.ru/ темная лошадка ...

ну а про CodeIgniter
[ + ] вызов всего через $this->CI
[ + ] по коду видно что на ядре собираются реальные приложения
[ - ] \system\codeigniter\Base4(5).php некрасиво
[ - ] много сайтов на одном ядре не замутишь
[ - ] роутеры запутаны и не гибкие
[?] ненашел шаблонизатор, hm...
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх