관리 메뉴

웹개발자의 기지개

[PHP] XSS 방어용 필터링 하기1 (GET/POST 변수들 막기) 본문

PHP

[PHP] XSS 방어용 필터링 하기1 (GET/POST 변수들 막기)

http://portfolio.wonpaper.net 2024. 4. 16. 15:48

 

XSS 방어용 관련 소스를 만들어봤다.

 

최상단 include 부에 제일 먼저 넣어 삽입해 두자.

post 방식의 경우 에디터의 태그기능까지 htmlspecialchars() 함수로 인해 모두 막아버리기 때문에 유념하도록 하자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?
 
function xss_filter($data) {
    if(is_array($data)) {
        // 배열인 경우 재귀적으로 각 요소에 대해 처리
        foreach($data as $key => $value) {
            $data[$key= xss_filter($value);
        }
    } else {
        $data = xss_keyword_filter($data);
        // 문자열인 경우 XSS 필터링 적용
        $data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
    }
    return $data;
}
 
// GET 요청 처리
$_GET = xss_filter($_GET);
 
// POST 요청 처리
$_POST = xss_filter($_POST);
 
function xss_keyword_filter($url) {
 
    // JavaScript 이벤트 관련 함수 목록
    $eventFunctions = array(
        "onabort""onafterprint""onbeforeprint""onbeforeunload""onblur""oncanplay""oncanplaythrough",
        "onchange""onclick""oncontextmenu""oncopy""oncut""ondblclick""ondrag""ondragend"
        "ondragenter""ondragleave""ondragover""ondragstart""ondrop""ondurationchange"
        "onemptied""onended""onerror""onfocus""onfocusin""onfocusout""onfullscreenchange"
        "onfullscreenerror""onhashchange""oninput""oninvalid""onkeydown""onkeypress"
        "onkeyup""onload""onloadeddata""onloadedmetadata""onloadstart""onmousedown"
        "onmouseenter""onmouseleave""onmousemove""onmouseout""onmouseover""onmouseup"
        "onmousewheel""onoffline""ononline""onpagehide""onpageshow""onpaste""onpause"
        "onplay""onplaying""onpopstate""onprogress""onratechange""onresize""onscroll"
        "onsearch""onseeked""onseeking""onselect""onstalled""onstorage""onsubmit"
        "onsuspend""ontimeupdate""ontoggle""onunload""onvolumechange""onwaiting"
    );
 
    // <script> 태그 제거
    $url = preg_replace('/<\s*script\b[^>]*>(.*?)<\s*\/\s*script\s*>/i'''$url);
 
    // alert 함수 제거
    $url = preg_replace('/\balert\s*\(/i'''$url);
 
    // JavaScript 이벤트 관련 함수 제거
    foreach ($eventFunctions as $event) {
        $url = preg_replace('/\b' . $event . '\s*=/i'''$url);
    }
 
    return $url;
}
 
?>
cs

 

Comments