사용자의 입력을 믿지 말아야 한다. 이것은 정말 중요합니다. html을 사용자의 입력으로부터 build 하는 것도 마찬가지입니다. 위험한 문자들은 적절하게 escaping을 시켜 주어야 합니다. 그것을 도와주는 것이 python html escape 함수입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_9.png)
먼저 인자들은 아래와 같습니다.
- s
- 문자열을 의미합니다.
- quote
- default 값은 true 입니다.
- “와 ‘를 escape 시킬 것인지 여부를 나타냅니다.
이 함수가 왜 필요한지 간단한 예제를 보면서 알아보겠습니다.
믿지 못하는 입력
사용자로부터 받는 입력은 믿으면 안 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_1.png)
예제 1번 프로그램을 보겠습니다. html 파일을 build 하는 프로그램입니다. Hello html에 입력 받은 문자열을 끼워 넣는 형식임을 알 수 있습니다. 대부분의 경우는 별 문제가 안 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_2.png)
그런데, script 태그와 alert 문을 입력받으면 어떻게 될까요? 위 스크립트는 Hello 라는 메세지를 띄우는 스크립트입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_3.png)
hello! 가 띄워졌습니다. 여기서 문제는 <와 >, “와 같은 것들이 escape가 되지 않았다는 것입니다. 그랬기 때문에 그대로 script가 해석되었고, hello 라는 메세지가 뜬 것입니다. 왜 이런 상황이 발생했을까요? 사용자의 입력을 믿었기 때문입니다.
어떻게 해결하면 될까요? escape를 하면 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_4.png)
5번째 줄은, html의 escape를 이용해서 위험 문자들을 적절히 다른 것으로 치환 하는 것입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_5.png)
아까와 마찬가지로 <script> alert(“hello”) </script> 라는 문자열을 입력했습니다. 그렇지만, 아무런 alert 메세지가 뜨지 않았습니다. 이는, 몇 개의 위험 문자들이 escape 되었기 때문입니다.
html의 escape
이 함수의 내부를 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_6.png)
기본적으로 이 함수는 &와 <, >를 escape 합니다. 각각 &, <, >로요. 만약에 quote가 있으면 추가로 “와 ‘도 같이 escape 합니다. 기본적으로 quote는 True이기 때문에, 5개의 문자가 escape 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_7.png)
그러면 위 프로그램의 결과는 어떻게 나올까요? escape의 quote에 아무 것도 주지 않았으므로, ‘와 “, <, >, &가 모두 escape 된 결과가 나오게 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_8.png)
프로그램의 실행 결과는 위와 같습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_10.png)
반면, quote를 False로 두면 어떤 결과가 나올까요? “와 ‘가 escape가 되지 않습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/esc_11.png)
실행 결과를 보면 ‘와 “는 그대로 나오고, <, >, &가 각각 <, >, &로 나왔음을 볼 수 있습니다. 정리하면, 5개의 문자 “, ‘, <, >, &를 escape를 하려면 python html의 escape를 사용하면 된다는 것입니다.