웹마스터 팁
리플이나 서명에서 특정 태그 막기
2008.05.05 19:57
현재 제로보드 XE에서는 html 태그의 제한 기능이 딱히 없습니다. 좋게 보면 회원들에게 보다 많은 자유도를 제공해주는 것이지만, 운영자 입장에서는 괴상한 태그로 사이트가 깨지는 일부터 시작해서, 이를 악용할 경우 악의적인 의도의 태그를 집어넣는 일이 생길 수도 있습니다.
제로보드 4 시절에는 del_html이라는 함수가 있어서, 이를 사용하면 각종 태그를 무력화시킬 수가 있었습니다. 그 내용은 다음과 같습니다.
function del_html( $str ) {
$str = str_replace( ">", ">",$str );
$str = str_replace( "<", "<",$str );
return $str;
}
이 함수는 str_replace를 이용하여, html 태그 제일 앞/뒤에 반드시 나오는 <와 >를 모양은 비슷하지만 코드는 다른 특수문자, >와 <로 대체시켜버리는 역할을 하게 됩니다.
하지만 이를 제로보드 XE에서 그대로 사용할 수는 없는데, 이를 사용하면 해당 부분의 div와 CSS까지 아작나기 때문입니다. 아래는 리플에 del_html을 그대로 적용시켰을 경우 나타나는 현상입니다.
따라서 사이트의 균형을 깨는데 제일 큰 역할을 하는 몇몇 태그만 골라나서 매우 구차하게 막는 방법을 쓸 수밖에 없습니다. 그래서 수정한 것이 이것입니다.
function del_html( $str ) {
$str = str_ireplace( "img","코멘트의 이미지 태그는 사용 금지",$str );
$str = str_ireplace( "table","코멘트의 테이블 태그는 사용 금지",$str );
return $str;
}
str_replace대신 str_ireplace를 사용한 이유는, str_ireplace가 대/소문자를 가리지 않기 때문입니다. img건 IMG건 둘 다 똑같은 이미지 태그니까요.
이대로라면<img src="파일경로">의 태그가, <코멘트의 이미지 태그는 사용 금지 src="파일경로">로 바뀌어서 출력되게 됩니다. 이미지 태그를 막는 효과는 있는데, 별로 깔끔하지는 않습니다.
코멘트의 이미지 태그는 사용 금지 대신 a herf로 넣으면 링크로 바뀌지만 </a>로 링크 영역 설정이 안되어서 해당 코멘트 자체가 날라가버리게 됩니다. 차라리 아무것도 안보이는게 낫다고 생각하신다면 이게 좋겠지만, 이런 불완전한 태그가 사이트 어디에서 문제를 일으킬지는 알 수 없으니 쓰지 않았습니다.
어쨌건 저렇게 금지 운운하게 나온다면, 글쓴이 입장에서도 생각을 다시 해본다던가, 수정한다던가 할 여지가 있을테니 그나마 낫다고 보이는군요.
같은 맥락으로, 테이블 태그 역시 레이아웃을 깨먹는데 일등 공신인지라 막았습니다. 임베디드라던가 아이프레임이라던가, 금지시킬 태그가 있다면 저런 방식으로 추가하면 되겠습니다.
이 방법의 단점은, 전혀 상관없는 글자에서도 img라던가 table이 들어가면 무조건 저걸로 전환이 된다는 것입니다. 영어를 쓸 일이 그리 많은건 아니지만 단점임에는 확실합니다. 그래서 시작할때도 임시 땜빵이라는걸 강조했었고.
다음은 이걸 어디에 넣느냐 하는 문제가 남습니다. 제로보드 XE의 구조에 무지한 저로서는 좋은 방법을 찾지 못해서, 결국 어딜 보건 엑세스하게 되어있는 zbxe\index.php의 제일 마지막에 넣게 되었습니다. ...다시 강조하는데 정말 갑갑한 방법입니다.
index.php의 제일 마지막줄에 ?>라고 php 소스의 끝을 알리는 명령이 있는데, 그 줄 제일 앞에서 엔터 몇번 쳐줘서 빈 공간을 만들고 거기에 넣으면 됩니다.
남는건 이걸 어떻게 적용시키느냐는 것입니다. 먼저 코멘트에 넣어 보겠습니다. zbxe/modules\board\skins\스킨이름\comment.html입니다.
{$comment->getContent(true)}라는 부분을 찾아서 {del_html($comment->getContent(true))}로 바꿔주면 됩니다.
다음은 서명입니다. zbxe/modules\board\skins\스킨이름\view_document.html입니다.
{$oDocument->getSignature()}라는 부분을 찾아서 {del_html($oDocument->getSignature())}로 바꿔주면 됩니다.
이상입니다. 이보다 더 좋은 방법이 나와서 이런 급조 처방을 쓸 일이 없어지길 바랄 뿐입니다.
댓글 4
-
HNO3
2008.05.06 18:51
-
老姜君
2008.05.06 19:11
깔끔한 방법같긴 한데 알려주신대로는 적용이 되질 않습니다.
{nl2br(strip_tags(preg_replace('/<br[^>]*\/?>/i', "\n", $comment->getContent(true)))}나 {nl2br(strip_tags(preg_replace('/<br[^>]*\/?>/i', "\n", $comment->getContent(true)), '<p><a>')} 모두 마찬가지입니다. 화면이 안뜨는군요.
간단하게, {strip_tags($comment->getContent(true))}라고 썼더니 태그를 막는 효과는 있는 것처럼 보이나, 코멘트 제일 뒤에 붙게 되는 '이 댓글을...'하는 부분까지 깨져서, 코멘트 내용처럼 붙어서 출력되게 됩니다. -
HNO3
2008.05.14 00:44
방금 확인하고 올립니다. 이 댓글을.. 부분은 제 실수였습니다. 헌데 왜 에러가 발생하여 화면이 안 떴는지는 잘 모르겠습니다.
따로 빼낼 부분 때문에 상당히 길어졌습니다만, {$comment->getContent(true)} 부분을
{@
$content = $comment->getContent(true);
$pattern = '/<div class="comment_popup_menu"><span class="comment_[0-9]+">[^<]+<\/span><\/div>/i';
preg_match($pattern, $content, $matches);
$content = preg_replace($pattern, '', str_replace("\n", '', str_replace("\r", '', str_replace("\r\n", '', $content))));
}
{nl2br(trim(strip_tags(preg_replace('/<br[^>]*\/?>/i', "\n", $content))))}
{$matches[0]}위와 같이 고치시면 될 것입니다([4193]에서 확인).
-
老姜君
2008.05.14 12:33
잘 되는군요. 감사합니다. 이제 이걸 서명에 적용하는 방법을 연구해 봐야 되겠습니다.
화면이 안 뜨는건 html-php 소스가 조금만 이상하면 종종 생기는 현상이더군요. 저만 그런건지 남들도 그러는건지는 모를 일이지만.
제목 | 글쓴이 | 날짜 |
---|---|---|
관리자 아이디 사용제한 체크하는 어이없는 실수 & 해결 [5] | refree | 2007.09.01 |
플래시 Embed패치(이올라스) 충돌에 의한 파일첨부버튼 해결법 [2] | Guns | 2008.03.18 |
레이아웃 적용 후 게시판 접근 제한 -> 게시판 board 모듈 재설치 해결 [1] | refree | 2010.04.24 |
제로보드 첨부파일 [4] | 아싸수리 | 2008.09.19 |
스팸단어목록 공유 [3] | 쁘띠하긔 | 2010.10.23 |
레이어가 뒤로 숨는 경우 레이아웃을 확인하세요! [1] | 아고라 | 2010.10.26 |
모르지오 레이아웃 사용시 각종 [배경이미지] 넣어도 안 나타날 경우 [2] | 오스카 | 2009.10.10 |
XE 강의 #2 - XE에서 레이아웃 적용하기 [12] | 서기 | 2010.04.24 |
리플이나 서명에서 특정 태그 막기 [4] | 老姜君 | 2008.05.05 |
큐브리드로 변환후 인덱스 재생성 [1] | 카르마 | 2010.10.22 |
카테고리별로 최근게시물 뽑아오기 [11] | 팔공산 | 2008.05.22 |
권한없는 모듈을 만났을때 로그인 페이지 띄우기.. [10] | 똑디 | 2007.12.11 |
게시판에 구글 SyntaxHighlighter 3.0.83(구문강조) 적용하기 - 본문에 코드삽입시 유용 | 으아악. | 2010.10.20 |
imageshack 업로드 버튼 코드 [2] | 도라란 | 2010.09.27 |
나눔고딕 웹폰트가 아닌 API로 적용하여 사용해보자!! [10] | 으아악. | 2010.10.07 |
게시판 링크 무조건 새창으로 뜨게 하는 법 ^^ [7] | Jiyoung540 | 2009.07.29 |
파일첨부 에러가 날때 이렇게 하시면 됩니다. [5] | 밀림의 왕자 | 2009.08.12 |
광고성 글때문에.... 금지 ip 목록 공유 [5] | 한니발2 | 2010.10.06 |
간단한 위키링크 흉내내기 [5] | 고진감래 | 2009.10.17 |
이미지 삽입시 아래에 한줄 띄우고 클릭가능하게 하여 편히 입력하게 만들자~ [8] | xemall | 2010.10.13 |
php에서는 기본적으로 HTML 코드를 자르는 strip_html이란 함수를 제공해 줍니다. 이를 이용하시면 간편하게 HTML 코드 사용을 막으실 수 있습니다.
이를 이용해 코멘트 출력부를 {nl2br(strip_tags(preg_replace('/<br[^>]*\/?>/i', "\n", $comment->getContent(true)))} 라고 해주시면 됩니다. 또한, 허용할 태그가 있을 경우 {nl2br(strip_tags(preg_replace('+ '/<br[^>]*\/?>/i', "\n", $comment->getContent(true)), '<p><a>')}같은 식으로 strip_tags의 인자를 넘겨주시면 됩니다.