홈으로 | 무료회원가입 | 아이디/비번찾기
추천음악방송
그누보드에서 사용된 XSS (Cross Site Script) 막기
9년 전

function conv_content($content)

{




        // 테이블 태그의 갯수를 세어 테이블이 깨지지 않도록 한다.

        $table_begin_count = substr_count(strtolower($content), "<table");

        $table_end_count = substr_count(strtolower($content), "</table");

        for ($i=$table_end_count; $i<$table_begin_count; $i++)

        {

            $content .= "</table>";

        }




        $content = preg_replace_callback("/<([^>]+)>/s", 'bad130128', $content);




        $content = preg_replace($source, $target, $content);




        // XSS (Cross Site Script) 막기

        // 완벽한 XSS 방지는 없다.

        

        // 이런 경우를 방지함 <IMG STYLE="__XSS__expression(alert('XSS'))">

        //$content = preg_replace("#\/\*.*\*\/#iU", "", $content);

        // 위의 정규식이 아래와 같은 내용을 통과시키므로 not greedy(비탐욕수량자?) 옵션을 제거함. ignore case 옵션도 필요 없으므로 제거

        // <IMG STYLE="__XSS__ex/pression(alert('XSS'))"></IMG>

        $content = preg_replace("#\/\*.*\*\/#", "", $content);




        // object, embed 태그에서 javascript 코드 막기

        $content = preg_replace_callback("#<(object|embed)([^>]+)>#i", "bad120422", $content);




        $content = preg_replace("/(on)([a-z]+)([^a-z]*)(\=)/i", "on$2$3$4", $content);

        $content = preg_replace("/(dy)(nsrc)/i", "dy$2", $content);

        $content = preg_replace("/(lo)(wsrc)/i", "lo$2", $content);

        //$content = preg_replace("/(sc)(ript)/i", "sc$2", $content);

        $content = preg_replace_callback("#<([^>]+)#", create_function('$m', 'return "<".str_replace("<", "<", $m[1]);'), $content);

        //$content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "", $content);

        $content = preg_replace("/\<(\w|\s|\?)*(xml)/i", "_$1$2_", $content);




        // 플래시의 액션스크립트와 자바스크립트의 연동을 차단하여 악의적인 사이트로의 이동을 막는다.

        // value="always" 를 value="never" 로, allowScriptaccess="always" 를 allowScriptaccess="never" 로 변환하는데 목적이 있다.

        //$content = preg_replace("/((?<=\<param|\<embed)[^>]+)(\s*=\s*[\'\"]?)always([\'\"]?)([^>]+(?=\>))/i", "$1$2never$3$4", $content);

        // allowscript 속성의 param 태그를 삭제한다.

        $content = preg_replace("#(<param.*?allowscript[^>]+>)(<\/param>)?#i", "", $content);

        // embed 태그의 allowscript 속성을 삭제한다.

        $content = preg_replace("#(<embed.*?)(allowscriptaccess[^\s\>]+)#i", "$1", $content);

        // object 태그에 allowscript 의 값을 never 로 하여 태그를 추가한다.

        $content = preg_replace("#(<object[^>]+>)#i", "$1<param name=\"allowscriptaccess\" value=\"never\">", $content);

        // embed 태그에 allowscrpt 값을 never 로 하여 속성을 추가한다.

        $content = preg_replace("#(<embed[^>]+)#i", "$1 allowscriptaccess=\"never\"", $content);




        // 이미지 태그의 src 속성에 삭제등의 링크가 있는 경우 게시물을 확인하는 것만으로도 데이터의 위변조가 가능하므로 이것을 막음

        $content = preg_replace("/<(img[^>]+delete\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content);

        $content = preg_replace("/<(img[^>]+delete_comment\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content);

        $content = preg_replace("/<(img[^>]+logout\.php[^>]+)/i", "*** CSRF 감지 : <$1", $content);

        $content = preg_replace("/<(img[^>]+download\.php[^>]+bo_table[^>]+)/i", "*** CSRF 감지 : <$1", $content);




        $content = preg_replace_callback("#style\s*=\s*[\"\']?[^\"\']+[\"\']?#i",

                    create_function('$matches', 'return str_replace("\\\\", "", stripslashes($matches[0]));'), $content);




        $pattern = "";

        $pattern .= "(e|&#(x65|101);?)";

        $pattern .= "(x|&#(x78|120);?)";

        $pattern .= "(p|&#(x70|112);?)";

        $pattern .= "(r|&#(x72|114);?)";

        $pattern .= "(e|&#(x65|101);?)";

        $pattern .= "(s|&#(x73|115);?)";

        $pattern .= "(s|&#(x73|115);?)";

        //$pattern .= "(i|&#(x6a|105);?)";

        $pattern .= "(i|&#(x69|105);?)";

        $pattern .= "(o|&#(x6f|111);?)";

        $pattern .= "(n|&#(x6e|110);?)";

        //$content = preg_replace("/".$pattern."/i", "__EXPRESSION__", $content);

        $content = preg_replace("/<[^>]*".$pattern."/i", "__EXPRESSION__", $content);

        // <IMG STYLE="__XSS__expression(alert('XSS'))"></IMG> 와 같은 코드에 취약점이 있어 수정함. 121213

        $content = preg_replace("/(?<=style)(\s*=\s*[\"\']?xss\:)/i", '="__XSS__', $content);

        $content = bad_tag_convert($content);

        return $content;

}








// OBJECT 태그의 XSS 막기

function bad120422($matches)

{

    $tag  = $matches[1];

    $code = $matches[2];

    if (preg_match("#\bscript\b#i", $code)) {

        return "$tag 태그에 스크립트는 사용 불가합니다.";

    } else if (preg_match("#\bbase64\b#i", $code)) {

        return "$tag 태그에 BASE64는 사용 불가합니다.";

    }

    return $matches[0];

}




// tag 내의 주석문 무효화 하기

function bad130128($matches)

{

    $str = $matches[2];

    return '<'.$matches[1].preg_replace('#(\/\*|\*\/)#', '', $str).'>';

}








// 악성태그 변환

function bad_tag_convert($code)

{

    global $view;

    global $member, $is_admin;




    if ($is_admin && $member[mb_id] != $view[mb_id]) {

        //$code = preg_replace_callback("#(\<(embed|object)[^\>]*)\>(\<\/(embed|object)\>)?#i",

        // embed 또는 object 태그를 막지 않는 경우 필터링이 되도록 수정

        $code = preg_replace_callback("#(\<(embed|object)[^\>]*)\>?(\<\/(embed|object)\>)?#i",

                    create_function('$matches', 'return "<div class=\"embedx\">보안문제로 인하여 관리자 아이디로는 embed 또는 object 태그를 볼 수 없습니다. 확인하시려면 관리권한이 없는 다른 아이디로 접속하세요.</div>";'),

                    $code);

    }




    //return preg_replace("/\<([\/]?)(script|iframe)([^\>]*)\>/i", "<$1$2$3>", $code);

    // script 나 iframe 태그를 막지 않는 경우 필터링이 되도록 수정

    return preg_replace("/\<([\/]?)(script|iframe|form)([^\>]*)\>?/i", "<$1$2$3>", $code);

}
추천추천 : 354 추천 목록
번호 제목
3,035
 아이프레임(iframe) 비율 유지하면서 크기 조절하는 방법
3,034
 PHP 배열에서 무작위로 하나 뽑아주는 array rand() 함수
3,033
 PHP 정규식 정리
3,032
 PHP 정규식을 활용한 태그 및 특정 문자열 제거 및 추출 방법
3,031
 php 크롤링 또는 파싱 함수, 정규식 모음
3,030
 제이쿼리 기본 명령어
3,029
 웹페이지 가로 모드세로 모드 인식하기
3,028
 모바일 웹 화면 강제 회전(가로모드 고정)
3,027
 [HTML5]에서 frameset 대체 방법과 iframe 속성
3,026
 HTML <Audio> 사용법
3,025
 윈도우10 시스템파일 손상 (초간단 오류 복구방법!!)
3,024
 PHP 파일 존재 여부 파악하기(로컬 파일 존재 및 원격지 파일 존재)
3,023
 [CSS] 박스 세로 가운데 중앙 정렬 6가지
3,022
 CSS Layout 수평 & 수직 정렬
3,021
 여러 도메인들 간 쿠키 공유하기
3,020
 태그 사이에 있는 텍스트를 추출
3,019
 [JQuery] textbox focus on off일때 숫자 콤마 보여주기
3,018
 쿠키 생성,가져오기,삭제
3,017
 사용자 함수 모음
3,016
 마우스,키보드 제한 ( 오른쪽클릭,드래그,영역선택등..)
3,015
 [HTML5] <video> - DOM으로 제어하기
3,014
 HTML5 video 태그에서 영상 좌우반전
3,013
 PHP - 특정 태그 및 문자열 추출, 제거
3,012
 [PHP] define과 defined의 차이
3,011
 우클릭 완벽차단 스크립트
목록
뮤직트로트 부산광역시 부산진구 가야동 ㅣ 개인정보취급방침
Copyright (C) musictrot All rights reserved.