라이브러리와 Composer(2)

minah moon·2023년 9월 13일

PHP

목록 보기
52/58
post-thumbnail

HTML Purifier: HTML 콘텐츠 허용하기

HTML Purifier 라이브러리는 XSS 공격을 일으키는 코드를 제거할 수 있다.

XSS 공격을 유발할 수 있는 마크업을 제거하기 위해, 먼저 HTMLPurifier 클래스를 이용하여 HTMLPurifier 객체를 생성한다. 그런 다음 purify() 메서드를 호출한다.

  1. 마크업을 포함할 수 있는 텍스트를 PHP 파일이 허용하려면, HTMLPurifier 클래스를 이용하여 HTMLPurifier 객체를 생성한다. HTML Purifier는 자체 네임스페이스가 없고 전역 네임스페이스에 작성된다. 다음의 HTMLPurifier 객체는 $purifier라는 변수에 저장된다.
$purifier = new HTMLPurifier();
$text = $purifier->purify($text);
  1. 그런 다음 HTMLPurifier의 purify() 메서드가 호출된다. 이 메서드의 하나의 인수는 정제되어야 하는 문자열이다. XSS 위험에 노출된 모든 마크업과 XHTML 1.0에 없는 태그나 속성을 제거하고. 해당 마크업이 없는 텍스트를 반환한다.

HTMLPurifier 객체는 config라는 속성을 가진다. 이것은 HTML Purifier의 동작 방식을 제어하는 옵션을 구성하는 또 다른 객체를 보유한다. 예를 들어, 허용되는 태그와 속성을 지정할 수 있으며 다른 모든 태그는 제거한다.

HTML Purifier 객체가 생성되면, 두 개의 인수를 갖는 set() 메서드를 사용하여 구성 객체의 설정을 변경할 수 있다.

  • 업데이트하고자 하는 속성

  • 사용해야 하는 값

예를 들어, HTML.Allowed 속성은 허용되는 HTML 태그와 속성을 지정한다.

텍스트에 표시돼도 괜찮은 태그는 쉼표로 구분된 태그 이름(꺾쇠 괄호 없이)의 목록으로 지정해야 한다. 예를 들어, <p>, <br>, <a>, <img> 태그를 허용하려면, HTML.Allowed 속성의 값은 다음과 같다.

p,br,a,img

요소의 속성을 허용하려면, 요소 이름 뒤에 대괄호 안에 속성 이름을 둔다. 하나의 요소에 하나 이상의 속성을 허용하려면, 각 속성을 파이프스템 |으로 구분한다. 예를 들어, <a>와 <img> 태그에서 <a href="">와 <img alt="" src=""> 속성을 허용하려면, HTML.Allowed 속성의 값은 다음과 같다.
p,br,a[href],img[src|alt]

  $purifier->config->set('HTML.Allowed', 'p,br,a[href],img[src|alt]');

TWIG: 템플릿 엔진

템플릿 엔진은 데이터를 가져와서 처리하는 PHP 코드와 브라우저로 보내는 HTML 페이지를 만드는 데 사용되는 코드를 분리한다.

사이트가 템플릿 엔진을 사용할 때, 데이터를 가져와서 처리하는 PHP 코드는 동일한 파일에 남는다. 하지만 방문자가 보는 HTML을 생성하게 될 두 번째 부분은 템플릿template이라는 파일로 옮겨진다.

Twig 템플릿은 PHP를 사용하여 데이터를 표시하지 않는다. 예를 들어, PHP에서 $title이라는 변숫값을 출력하기 위해 다음과 같이 한다.

<p><?= htmlspecialchars($title); ?><p>

Twig 템플릿에서는 다음과 같이 사용한다.

  <p>{{ title }}<p>

이 중괄호는 Twig에게 title 변수에 저장된 값을 표시해야 한다는 것을 알려준다.

템플릿 엔진으로 Twig를 사용하는 것은 다음과 같은 이유로 사이트의 보안도 향상된다.

  • Twig는 XSS 공격의 위험을 제거하기 위해 HTML의 모든 예약된 문자를 엔티티로 자동 교체한다. 이것은 사용자가 생성한 값을 출력할 때마다 htmlspecialchars()를 사용해야 하는 것을 프런트엔드 개발자의 기억에 의존하지 않아도 된다.

  • 템플릿 안의 모든 PHP는 무시되므로, 프런트엔드 개발자가 안전하지 않은 PHP 코드를 템플릿에 실수로 추가하는 위험이 없어진다.

템플릿은 상속이라는 기술을 사용하여 코드를 공유할 수 있다. 이것은 파일을 인클루드하는 다른 접근 방식이다. 여는 태그와 닫는 태그가 동일한 파일에 있을 수 있기 때문에, 여러 파일로 분할되지 않아 작업하는 데 도움이 된다.






출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022

0개의 댓글