<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<?php
$path = './files/test.txt';
$string = file_get_contents($path);
echo $string;
?>
</body>
</html>
위는 ./files 폴더 내의 test.txt 파일을 읽어서 그 내용을 화면에 보여주는 간단한 php 코드다.
실행해보면 test.txt에 작성한 내용이 잘 출력되는 것을 볼 수 있다.
지금은 정상적인 값이 test.txt에 들어있지만, 보안적 관점에서 만약 이 test.txt에 보안적 위협이 되는 값이 저장돼 있으면 어떻게 될까? 예를들면 script 태그로 감싸져 있는 자바스크립트 코드 말이다.
echo 명령어는 string 변수의 값을 html 코드로 변환해주는 역할을 한다. 그렇기에 script 태그로 감싸진 문자열이 string 변수 안에 들어있다면, html로 변환하는 과정에서 자바스크립트 코드로 인식이 되고 사용자한테 페이지를 보여줄 때 그 문자열이 실행될 것이다.
위에서 말한대로 test.txt에 알림창을 띄우는 간단한 자바스크립트 코드를 저장하니 페이지에 들어갈 때 알림창이 뜨는 것을 볼 수 있다.
지금은 간단한 알림창을 띄우는 코드를 test.txt에 넣었지만, 만약 location.href 같은 코드를 저장한다면 해당 페이지에 접속하는 사용자들은 악성 사이트로 리다이렉트 되어 컴퓨터가 악성코드에 감염되거나, 쿠키를 탈취하여 공격자가 사용자의 계정으로 해당 사이트에 로그인할 수 있을 것이다.
이를 방지하는 방법은 간단하다. php에서 제공하는 htmlspecialchars 함수를 사용하면 된다.
이 함수는 <, >, & 등의 특수문자들을 html 엔티티로 변환해준뒤 바뀐 문자열을 반환해 준다. 변환되는 특수 문자들은 아래 표를 참고하면 된다.
& | & |
"" | " |
'' | ' |
< | < |
> | > |
사용은 htmlspecialchars(<문자열>)로 하면 된다. 이를 사용해 위 예제의 코드에서 echo 부분이나 file_get_contents 함수로 받아오는 파일 내용에서 특수 문자들을 html 엔티티로 변환한다면 <script>에서 '<' -> < , '>' -> > 로 변환되어 읽어들인 문자열이 자바스크립트 코드로 작동하지 않을 것이다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<?php
$path = './files/test.txt';
$string = htmlspecialchars(file_get_contents($path));
echo $string;
?>
</body>
</html>
위는 htmlspecialchars 함수를 사용해, file_get_contents로 반환되는 문자열에서 특수문자들을 html 엔티티로 변환해서 string 변수에 저장하도록 작성한 코드다.
페이지를 열어보면 <script> 태그로 감싸 작성했던 자바스크립트 코드가 문자열 그대로 출력되는 것을 볼 수 있다.
이 htmlspecialchars를 적절히 활용한다면 어느정도의 XSS 공격을 막을 수 있을 것 같다.
하지만 구글링을 해보니 이 htmlspecialchars 함수를 우회하는 XSS 공격 역시 존재하는 것 같다. 본격적으로 웹 해킹 공부를 시작한다면 이 내용에 대해서도 공격자 관점에서 다뤄보겠다.
'Old (2021.01 ~ 2021.12) > Programming' 카테고리의 다른 글
[PHP] 배열, 연관배열(딕셔너리) (0) | 2021.09.21 |
---|---|
[PHP] 조건문 (if, else if, else) (0) | 2021.09.21 |
[PHP] get 방식 처리 in php (0) | 2021.09.21 |
[PHP] php의 기본적인 문법 (0) | 2021.09.21 |
c언어 코딩도장 Unit 58 ~ Unit 59 (0) | 2021.04.11 |