HTML Entity

DATE : 2024/1/11

Problem Definition

그 원인을 생각해보면, 공격자가 스크립트를 삽입할 수 있기 때문이었다.

이때 스크립트를 삽입한다는 건 다양한 형태로 이루어질 수 있지만

근본적으로 봤을 때, HTML tag를 이용해 실행하고자 하는 코드를 작성하는 형태가 대표적이다.

따라서 스크립트를 삽입하지 못하게 해야 한다는 관점에서 봤을 때

HTML 특수 문자를 스크립트로서 효력을 가지지 못하도록 처리하자! 라는 생각을 하게 될 것이다.

이런 개념을 적용해 HTML 문자를 대체 문자로 치환하는 방법을 HTML Entity라고 한다.

What is HTML Entity?

HTML Entity는 앞에서 말했듯이 HTML에서 사용하는 특수 기호를 대체 문자로 바꿔버리는 걸 말한다.

기호에 해당하는 대체 문자는 검색해 보면 쉽게 찾아볼 수 있을 것이다.

예를 들어 사용자가 입력한 HTML 코드를 HTML Entity 처리하여

화면에 출력해주는 사이트가 있다고 가정해 보자.

사용자의 입력 값을 가져다 처리하는 PHP code는 아래와 같다.

<?php
    $script = $_GET['script']; //사용자가 입력한 값이 $_GET['script']로 넘어온다.
    $result = htmlentities($_GET['script']);

    echo "Script : ".$script."\n";
    echo "Result : ".$result;
?>

사용자가 이와 같이 <p> tag를 작성해 넣으면

$script는 아무런 처리도 하지 않았기 때문에 화면에 p tag를 만들어 내고

$result는 HTML Entity 처리를 했기 때문에

사용자가 입력한 내용이 HTML code로써 동작하지 못하고 문자열 그대로 출력 되고 있음을 알 수 있다.

이때 Packet을 확인해보면 < 기호는 &lt;로, > 기호는 &gt;로 치환된 걸 확인할 수 있다.

이처럼 HTML에서 사용하는 특수 기호에 대해 상응하는 대체 문자를 정해두고

기호를 발견했을 때 짝꿍인 대체 문자로 치환하는 걸 HTML Entity라고 한다.

이런 방식으로 특정 기호들이 효력을 잃게 되면 이와 같이 스크립트를 작성했을 때도

$script에는 스크립트가 그대로 전달되기 때문에 팝업 창을 띄우게 되지만

$result에는 HTML Entity를 처리했기 때문에 사용자가 입력한 스크립트가 실행 되지 않고

그대로 출력 되는 걸 볼 수 있다.

Packet에서는 대체 문자를 이용해 화면에 보여줄 내용을 적어두었지만

브라우저는 대체 문자를 보고 "화면에는 원래 기호대로 보여줄게"라고 약속 했기 때문에

화면 상에 보여주는 데에는 문제가 없는 것이다.

따라서 사용자의 파라미터에 HTML Entity 처리를 하게 되면

스크립트가 그대-로 서버에 저장되거나 응답으로 들어가는 일은 없도록 만들 수 있게 된다! 👍

Last updated