현재의 플러그인 제작 방식을 그대로 사용한다면야 악의적인 코드를 찾기란 무리겠죠.
BlogIcon 플러그인을 기준으로 제가 생각하는 대략적인 구상을 말해보겠습니다.
components/Tattertools.Plugins.php 파일
class Plugins {
var $owner;
var $database;
...
function tt_empty($v) {
return empty($v);
}
function tt_strlen($v) {
return strlen($v);
}
...
}
Plugins/BlogIcon/index.php
class BlogIcon extends Plugins {
var $target;
var $mother;
function BlogIcon($target, $mother) {
$this->__construct($target, $mother);
}
function __construct($target, $mother) {
$this->target = $target;
$this->mother = $mother;
}
function BlogIcon_main() {
if (Plugins::tt_empty($this->mother['homepage']))
return $this->target;
$slash = ($this->mother['homepage']{Plugins::tt_strlen($this->mother['homepage']) - 1} == '/' ? '' : '/');
return "<img src=\"{$this->mother['homepage']}{$slash}index.gif\" width=\"16\" height=\"16\" onerror=\"this.parentNode.removeChild(this)\"/> $this->target";
}
}
Plugins/BlogIcon/index.xml
...
<listener event="ViewCommenter">BlogIcon::BlogIcon_main</listener>
<listener event="ViewGuestCommenter">BlogIcon::BlogIcon_main</listener>
...
상당히 노가다이긴 하지만..; Plugins class에 사용 가능한 함수들을 일일이 등록시켜주는 거죠.;;
(모듈화된 상태기때문에 개별적으로 업데이트가 이루어지면 되니 큰 문제는 아니라고 생각중)
이렇게되면 validate 시에 Plugins class를 거치지 않는 함수를 잡아내는건 쉽겠죠.
쿼리같은 경우는 아래처럼 대충 처리하고 drop같은건 지원을 안하면 되겠죠.;
(예전에 사용하던 MySQL class 발췌; )
function mysql_select($table, $where, $field = '*') {
return mysql_query("SELECT ".$field." FROM ".$table." ".$where);
}
헛점이 너무 많은가요? -_-;;