[오늘의 배움] 003 생활코딩 WEB2 Python - 2

이상민·2020년 11월 26일
0

[오늘의 배움]

목록 보기
3/70
post-thumbnail

1. 웹페이지에서 파일 생성하기

  • 파이썬에서 파일을 만들고 웹에서 <form>으로 받은 정보를 쓴다. 이때 데이터가 저장된 폴더와 파일의 권한 설정을 아파치가 쓰기 가능하게 해줘야한다.
opened_file = open(‘data/+파일이름, ‘w’)
opened_file.write(내용)
  • cgi헤더를 통해 생성한 파일로 구성된 페이지로 리다이렉트해준다.
print(“Location: index.py?=id+파일이름+”\n”)

2. 웹페이지에서 파일 변경하기

  • 쿼리 스트링에서 id를 받아 서버에 파일을 불러온다.
form = cgi.FieldStorage()
pageId = form["id"].value
description = open('./data/'+pageId, 'r').read()
  • 불러온 파일 내용을 웹에서 수정 가능하도록 <form>을 통해 표시한다. id와 제목을 분리하여 동일한 파일의 제목도 수정 가능하게 한다.
<form action="process_update.py" method="post">
        <input type="hidden" name="pageId" value="{pageId}">
        <p><input type="text" name="title" placeholder="title" value="{pageId}"></p>
        <p><textarea row="4" name="description"
        placeholder="description">{description}</textarea></p>
        <p><input type="submit"></p>
    </form>

3. 웹페이지에서 파일 삭제하기

  • 쿼리 스트링으로 삭제시 url만으로 삭제하는 등 악용될 수 있으므로 파이썬의 os.remove()로 삭제한다.
#!/usr/bin/python3
import cgi, os

form = cgi.FieldStorage()
pageId = form['pageId'].value

os.remove("./data/"+pageId)

#cgi Redirection 헤더
print("Location: index.py\n")

4. 보안 주의점

이렇게 만든 현재 페이지는 보안상으로 취약하다. 대표적으로 데이터를 받아들이고 표시하는데 있어 아무런 필터링이 없기 때문에 XSS를 막을 수 없다.

XSS란?
Cross Site Scripting의 약자이다. 권한이 없는 사용자가 스크립트를 삽입하고, 이를 이용해 원치 않는 기능을 실행하거나 정보를 탈취해 갈 수 있다.

방법 1. '<', '>'를 막아 해결한다

문자 '<', '>'는 '&lt;', '&gt;'로 표현할 수 있다. 스크립트를 실행하는 <script></script>의 꺽새를 교체하여 XSS를 막을 수 있다.

방법 2. html-sanitizer 모듈을 사용한다

html-sanitizer은 스크립트를 막는 것 이외에도 css를 대체하여 가장 비슷한 html 태그로 수정하는 등 다양한 기능을 제공한다.

from html_sanitizer import Sanitizer
sanitizer = Sanitizer()  # default configuration
sanitizer.sanitize('내용')

5. 느낀점

파이썬과 CGI를 이용해 기본적인 CRUD가 가능한 웹페이지를 만들었다. 강의를 따라하다 보니 능동적인 학습은 하지 못한거 같아 이후 레퍼런스나 도움 없이 동일하게 기능하는 페이지를 만들며 복습하는 시간을 가져야할 것 같다. 어려운 내용은 없었으나 웹페이지를 생성하고 다른 파일로 리다이렉트 하는게 아직 익숙지 않아 개념(?)사고방식(?)이 조금 헷갈렸다. 이부분에 조금 더 집중하며 복습해야겠다. 그 다음으로는 무엇을 공부할지 Django와 Flask 중에 고민이었는데, 인터넷 검색한 결과론 공부 목적이면 Flask부터 해보는게 좋다고 얼핏 봐서 그것부터 해보기로 결정했다.

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글