HTMLFilter v.1.01 > 그누4 스킨

그누4 스킨

스킨의 저작권은 해당 스킨 제작자님께 있으며, 그누보드의 저작권과 다를 수 있습니다.
스킨 다운로드시 좋아요와 감사의 코멘트를 남기시면 제작자에게 큰 힘이됩니다. ^^y
그누보드와 관련이 있지만 스킨과 빌더가 아니면 플러그인 게시판에 올려주세요.

HTMLFilter v.1.01 정보

기타 HTMLFilter v.1.01

본문

사용자 함수를 추가하였습니다...

HTMLFilter란:

대부분의 인터넷 보드는 HTML쓰기를 허용하고 있습니다. 그러나 HTML 쓰기를 허용할 경우 XSS(Cross-site Scripting, 크로스 사이트 스크립팅)와 CSRF(Cross Site Request Forgery, 크로스 사이트 요청 변조)와 같은 공격에 자유롭지 못합니다. 몇몇 보드들은 이런 문제를 해결하고자 몇가지 기술을 이용하나 대부분의 경우 그 기술을 우회하여 사이트를 공격하거나 어드민 계정을 취득할 수 있는 방법이 존재합니다. http://ha.ckers.org/xss.html를 보면 얼마나 많은 방법으로 스크립트쓰기방지를 우회할 수 있는지를 알 수 있으며 혹은 HTML 에디터를 우회하여 직접 HTML코드를 입력함으로써 크로스 사이트 스크립팅을 시도하는 방법역시 존재함을 볼 수 있습니다.  제로보드나 혹은 그누보드는 preg_preplace함수를 이용한 방법을 쓰고 있으나 이 방법역시 우회하는 방법이 존재하며 제로보드와 같이 자바스크립트 에디터에서 필터링을 함으로써 해결하려는 시도도 있으나 에디터를 우회함으로 사용자가 직접적으로 글을 올리게 되면 에디터의 필터링을 거치지 않기 때문에 서버상에서 좀더 직관적으로 사용자가 올린 글을 분석함으로써 필터링을 해야하는 필요가 있습니다. HTMLFilter란 스크립트나 메타와 같은 XSS공격을 유발할 수 있는 태그들을 제거하고 또한 등록되지 않은 태그나 혹은 태그의 속성을 제거하는 php 클래스입니다. http://richarea.net/htmlfilter/ajax_filter_test.html에 테스트를 할 수 있도록 페이지를 마련해 놓았습니다.

기본 사용법:

include_once('HTMLFilter.php');
$filter = new HTMLFilter();
$content = $filter->parse($content);

사용함수:

1. use_rgb(): rgb(255,255,255)와 같은 형식을 그대로 사용하고자 할 때 씁니다.
기본값은 헥스형식(예 #FFFFFF)으로 전환됩니다.
예:
$filter->use_rgb();
$content = $filter->parse($content);

2. set_tag($tagname, $set=false): 기본적으로 HTMLFilterConfig.php 파일에서 세팅되어 있으나
일시적으로 세팅을 바꾸고자 할경우 사용합니다. 혹은 새로운 태그를 정의하는 것도 가능합니다.
예:
기본적으로 meta 태그는 false로 지정되어 있습니다. 직접 HTMLFilterConfig.php파일을 수정하여도 되나
set_tag함수를 이용하여 바꿀 수 있습니다.
$filter->set_tag('meta', true);
$content = $filter->parse($content);

새로운 태그 정의
$filter->set_tag('convas', true);

3. set_tag_attribute($tagname, $attrname, $set=false): set_tag()와 마찬가지로 각 태그의 속성을 바꿀 때 사용합니다.
예:
$filter->set_tag('convas', true)
$filter->set_tag_attribute('convas', 'width', true);
$filter->set_tag_attribute('convas', 'height', true);
$content = $filter->parse($content);

4. add_block_url_syntax($syntax): 금지하고 싶은 URL의 정규식을 추가합니다. HTMLFilterConfig.php 파일의 $block_url_syntax에 추가하여도 됩니다.
이전 버젼의 add_prohibited_url_syntax의 이름이 add_block_url_syntax로 바뀌었습니다.
예:
$filter->add_block_url_syntax('/hackers\.web\.net/i');
$content = $filter->parse($content);

5. register_function($function_name): 사용자 함수를 등록할 때 사용합니다. 사용자 함수의 등록은 여러개 가능합니다.
등록할 함수의 형식은 함수이름($tagname, $attrname, $attrval, $global_variable)로 차례로 태그이름, 속성이름, 속성값, 글로벌변수 입니다. 만일 $tagname의 값을 false로 놓으면 그 태그가 제거되고 $attrval의 값을 false로 놓으면 속성이 제거됩니다. 혹은 태그의 이름이나 속성의 이름을 바꾸는 것도 가능합니다. 글로벌 변수의 값을 바꾸면 각 함수에도 적용됩니다.
또한 글로벌 변수는 여러개를 입력할 수 있도록 array입니다.
예:
// src값이 http://로 시작되지 않으면 제거하기
function myFunction($tagname, $attrname, $attrval, $g)
{
 if ($tagname == 'img && $attrname == 'src' && !preg_match
('/^http:\/\//i', $attrval)) {
  $tagname = false;
 }
}

// br 태그에서 속성을 모두 제거하기
// HTMLConfig.php에서 속성이 없어도 되지만 사용자 정의 함수를 통해서 없애는
예제입니다.
function myFunction2($tagname, $attrname, $attrval, $g)
{
 if ($tagname == 'br' && $str($attrname)) {
  $attrval = false;
 }
}
$filter->register_function('myFunction');
$filter->register_function('myFunction2');
$content = $filter->parse($content);

HTMLFilterConfig.php

HTMLFilterConfig.php 파일은 반드시 HTMLFilter.php와 동일한 디렉토리내에 있어야 합니다.
이전의 $prohibited_url_syntax의 이름이 $block_url_syntax로 바뀌었습니다.

사용 Class 변수:

1. $block_url_syntax: 차단 URL의 정규식을 적어야 합니다. 정규식에 익숙하지 못하면 preg_quote를 이용하세요.
예:
var $block_url_syntax = array(
 '/'.preg_quote('sir.co.kr').'/i'
 );

2. $css_syntax: 허용할 css 정규식입니다. {width: 50px}라는 css가 있을 때 50px와 같이 속성값 부분을 체크할 때 쓰일 정규식입니다. 기본값은 '/^([a-z0-9#\!\.\,\-\*가-힣ㄱ-ㅎㅏ-ㅣ\t ]+)$/i' 입니다. 이정도면 대부분은 문제없을거라 생각됩니다.

3. $attributes_need_url_filtering: URL 필터링이 필요한 속성들입니다. 예로 background:url('javascript:alert('XSS')로 필터링이 필요한 속성을 추가하면 됩니다.

4. $script_types: URL에서 스크립이 가능하게 하는 값들입니다.

5. $object_security: <object>태그에서 보안상 설정이 필요한 변수들을 적습니다.

6. $tags: 사용할 태그들을 정합니다. 목록에 없거나 값이 false인 태그는 제거됩니다.

7. $tag_attributes: 사용할 태그의 속성을 정합니다. 목록에 없거나 값이 false인 속성은 제거됩니다.

8. $unanalyzed_tags: 이 변수는 되도록이면 변경을 하지 말기 바랍니다. textarea나 style이나 script 태그는 같은 태그 이름으로 닫혀야 합니다. 즉 <textarea>는 </textarea>로 닫아야 하며 중간에 어떤 태그가 오더라도 textarea의 텍스트로 인식됩니다.

9. $empty_tags: xhtml 형식으로 전환을 위해 필요합니다. 예로 <br>은 닫는 태그가 없으므로 <br />의 형식으로 전환됩니다.

10. $empty_attributes: xhml형식을 위한 빈 속성값을 가질 수 있는 속성입니다. 비어있는 속성은 그대로 그 값을 갖습니다.  예로 <input type="text" readonly><input type="text" readonly="readonly" />로 전환됩니다.

11. $css_properties: css에서 사용할 속성을 정합니다. 목록에 없거나 값이 false인 속성은 제거됩니다.

 

그누보드에 추가하기:

lib 폴더에 htmlfilter라는 폴더 생성후 압축된 파일을 그곳에 풀어
그 폴더 안에 HTMLFilter.php 및 HTMLFilterConfig.php가 있게 하세요.

그리고 lib/common.lib.php파일을 열어 conv_content()함수를 찾아 다음으로 교체합니다.

function conv_content($content, $html)
{
 global $config, $board;

 if ($html)
 {
  include_once("$g4[path]/lib/htmlfilter/HTMLFilter.php");
  $filter = new HTMLFilter();

  if ($html == 2) { // 자동 줄바꿈
   $content = preg_replace("/\n/", "<br/>", $content);
  }

  // XSS (Cross Site Script) 막기
  $content = $filter->parse($content);
 }
 else // text 이면
 {
  // & 처리 : &   등의 코드를 정상 출력함
  $content = html_symbol($content);

  // 공백 처리
  //$content = preg_replace("/  /", "  ", $content);
  $content = str_replace("  ", "  ", $content);
  $content = str_replace("\n ", "\n ", $content);

  $content = get_text($content, 1);
  $content = url_auto_link($content);
 }

 return $content;
}

추천
3
  • 복사

댓글 전체

수고하셨습니다. 오늘 제로 xe를 보니 spam filter가 기본 모듈로 들어 있더군요.
ip금지, 금지단어체크, 연속작성 같은 것을 스킨이 아닌 spam filter에서 하도록
되어 있구요 xss csrf에 대한 부분은 없던거 같더라구요.

그런데 아무리봐도 잘 모르겠네요. 기본적인 filter rule을 배포해 주심이... ㅠ..ㅠ..

(1)
게시글 내에 textarea라는 요소만 제거하려면 어떻게 해야 할까요??? ...
사람들이 웹페이지를 copy & paste하다가 보면 그런 요소가 들어오더라구요.
제거라기 보다는 그것을 테이블이나 div로 바꿔버리면 좋을 것 같은데요.

(2)
spam filter의 경우 처리된 내역에 대해서 logging을 받는 기능이 있으면 좋을 것 같아요.
어떤 것을 어떻게 변환했는지, 변환내역이 적정했는지를 logging 받아서 letsgo님께서
review를 하실 수 있게 하면 filter rule이나 프로그램이 더 정교해지지 않을까요?

(3)
금지단어를 지금은 무조건 금지하고 있는데, 이것을 개세뀌의 경우 스팸필터에서 확인해서
개xx로 바꾸는 것은 어떤가요? 그러면 굳이 client단에서 금지단어 확인을 할 필요가 없쟎아요.
내용도 나름 순화되는 장점도 있구요. ㅎㅎ
사용자 정의 함수에 대해 더 생각해보고 업데이트 하고 같이 예제를 올릴께요.

요즘 홈페이지도 만들려고 하니까 정신이 없네요... 프로그래밍은 하겠는데 디자인에 영 소질이 없어서...
letsgolee님 한가지 궁금한 점은..

소스에 _unpacked 가 있는데..

HTMLFilter.php 파일 처럼 소스코드를 pack 하는 프로그램이 뭐가 있나요?

개발하고 배포할때 읽어들여지는 파일용량이 줄어드니..
사용하면 되게 유용할거 같네요..
헉... 예... 어떻게 아셨데... php 소스를 pack처리하는 php로 만들어진 프로그램있습니다. 다 끝나면 그 프로그램 실행 한번한후 copyright 부분만 복사하고 있어요.
아 PHP로 만들어진 프로그램이 있군요^^

구글 같은 곳에 소스를 봐도
jquery소스를 봐도
배포버전은 모두 한줄로 처리되어 있고해서
왠지 그런 프로그램이 있을것 같은 느김이 들었어요 ㅋㅋ

주석만 제거하고
VIM에서 Shift+j만 하면 될듯한데..
VIM에 단축 버튼으로 등록해서 만들어야 겠네요 ㅋㅋ

기타 다른 알고리즘 같은게 필요 한가요?
© SIRSOFT
현재 페이지 제일 처음으로