안녕하세요. 린치핀소프트 한광희입니다.

이 글은 테마와 플러그인을 개발하는 개발자에게 간단하지만 효과가 좋은 몇가지 보안을 위한 워드프레스 함수를 소개합니다.

우선 “보안”이라는 분야는 굉장히 방대하고 각 서비스의 계층 별(OS/미들웨어/응용SW/네트워크)로 보안요소의 대상과 방법이 상이합니다. 저 역시도 “보안”에 대한 전문가는 아니므로 이 글에서 제안 드리는 방법은 일반적으로 “악의적인 이용자의 입력”에 따른  XSS 공격을 방지하기 위한 워드프레스 함수를 소개해 드리는데 목적이 있습니다.

모든 상황을 고려한 완벽한 보안  대책을 수립하기는 어려울 수 있지만,  기본적으로 오늘 소개하는 세 가지 종류의 함수를 이용하여 테마/플러그인을 개발하면 “이용자 입력”을 통한 사이트에 대한 공격을 어느 수준한에서는 예방할 수 있습니다.

 

1.esc_html()

이 함수는 데이터베이스(DB)에서 저장되어 있는 콘텐츠를 웹 화면에 출력할때 사용하는 함수입니다. 출력하는 대상인 HTML 페이지에서 출력하는 요소의 html 부분이 있으면 escape하여 HTML 페이지가 악의적인 이용자 입력으로 인해 일그러지거나 스크립트 공격이 실행되는 것을 예방할 수 있습니다.

 

$html = esc_html( '<a href="http://www.example.com/">A link</a>' );

$html now contains this:

&lt;a href=&quot;http://www.example.com/&quot;&gt;A link&lt;/a&gt;

Which would be displayed in an HTML document as:
<a href=”http://www.example.com/”>A link</a>

 

위 예시는 wordpress codex esc_html() 함수 소개 페이지에 실려 있는 예제로서 “<” -> “&lt;” 등으로 변경하는 등 입력된 텍스트가 HTML 태그로 인식되지 않도록 HTML Entity 코드로 변경하고 있는 예제입니다.

최종적으로 HTML 페이지에 출력되는 텍스트는 다음과 같습니다.

<a href=”http://www.example.com/”>A link</a>

Anchor 태그로 출력되지만 실상은 HTML 태그로 해석되지 않기 때문에 다른 웹페이지로 링크된다거나 하는 등의 기능이 수행되지 않습니다.

 

2. sanitize_text_field()

앞의 esc_html() 이 보통 데이터베이스에 있는 데이터를 화면에 출력해줄때 사용하는 함수라면 이 sanitize_text_field() 함수는 이용자의 입력을 데이터베이스에 저장하기 직전에 자주 사용하는 함수입니다. 이 함수는 텍스트 속에 삽입되어 있는 특정 태그를 제거한 텍스트를 반환해주는 함수입니다.

함수의 주요 기능으로서는 다음과 같습니다.

1.입력된 텍스트가 유효한 UTF-8 코드인지 확인

2. 식별된 모든 태그를 제거합니다

3. 줄바꿈,탭 등의 특수 문자를 제거합니다.

 

3. wpdb 객체의 prepare() 메서드

보통 wp_insert_post()나 wp_update_post()를 이용하여 DB내의 레코드를 갱신하는 경우가 아닌 개발자가 기술한 SQL문을 통해 레코드의 갱신/조회를 하는 등의 경우에서 워드프레스에서 제공하는 데이터베이스와의 상호작용 하는  wpdb 클래스의 인스턴스를 이용합니다.

wpdb 클래스의 인스턴스는 전역변수(global $wpdb) 를 통해 이용할수 있습니다. 이때 $wpdb->query() 메서드 처럼 자신이 기술한 SQL에 있어 SQL Injection 등의 공격적인 SQL이 생성되는 것을 예방하는데 $wpdb->prepare() 함수를 활용 할 수 있습니다.

$wpdb->query( 
	$wpdb->;prepare( 
		"
                DELETE FROM $wpdb->;postmeta
		 WHERE post_id = %d
		 AND meta_key = %s
		",
	        13, 'gargle' 
        )
);

위 예시는 wordpress codex에 나와 있는 wpdb 객체의 prepare() 사용 예시 입니다.

위처럼 $wpdb->query() 매서드의 메서드 매개변수로서 $wpdb->prepare에서 반환해주는 SQL을 이용합니다.