• 목록
  • 아래로
  • 위로

안녕하세요?


이틀 전 질문 드린 VPS에서 생성한 CSV 파일을 웹호스팅에서 읽는 방법에 대해 제 나름대로 코드를 작성했는데요.


보안상 취약점 등 제가 미처 생각하지 못한 문제는 없는지 마지막으로 질문 드립니다 ^^



말씀해주신 여러 방법들에 관하여 고민을 해봤는데요.


humit 님께서 조언해주신 "csv 파일을 생성하고 있는 서버에서 requests 모듈을 이용해서 파일 업로드를 하는 방식"으로 결정했습니다.



제 생각에는 이 방식은 다음과 같은 장점이 있을 것 같아요 :)


1. HTML의 input 태그와 PHP의 move_uploaded_file 함수를 막지 않는 이상 어떠한 웹호스팅 환경에서도 사용 가능한 방법이며


2. 파일 생성시간으로부터 동기화 될 때까지의 시간이 사실상 0에 가깝고


3. VPS에서 파이썬으로 CSV 파일을 생성하여 업로드하는 것만 crontab에 넣으면 되어서 나중에 데이터 수집 간격을 조정하기 용이합니다.


반면 업로드 용도의 PHP 파일을 제3자가 악용할 수 있는 보안상 취약점이 있다는 것이 가장 큰 단점일 것 같네요 ㅠㅠ



위와 같은 장점이 있다고 생각되어서 최종적으로 requests 모듈로 업로드 하는 방법을 택하게 되었네요.


제 나름대로 공부를 해서 부족한 부분이 많겠지만 서버(웹호스팅) 측의 PHP 파일과 클라이언트(VPS) 측의 python 파일을 작성해봤어요.


매우 허접하지만 일단 제가 의도한 대로 작동하기는 하네요 ^^;



우선 PHP 파일인데요.


보안상 취약점을 보완하기 위해서 제 나름대로 다음과 같은 조치를 취했습니다.


1. 클라이언트의 IP를 체크하여 특정 IP인 경우에만 전체 스크립트가 작동하도록 하고


2. 패스워드를 확인하며


3. 특정 파일명이 아니라면 업로드를 할 수 없도록 했습니다.

(나중에 하나의 CSV 파일을 계속 overwrite 하는 방식으로 실사용할 예정이에요)


<!-- IP, 비번, 파일명을 확인하여 지정된 폴더에 파일을 업로드하는 코드입니다 -->
<?php
if ($_SERVER['REMOTE_ADDR'] == '클라이언트 IP') {
  if(isset($_POST['submit'])) {
     if(is_uploaded_file($_FILES["upload_file"]["tmp_name"])) {
       if ($_FILES["upload_file"]["name"] != 'CSV 파일명' || $_POST["mb_pwd"] != '패스워드')
         exit("Error : You can't access.");
       $upload_dir = "./업로드할 폴더/";
       echo "Uploaded file : " . $_FILES["upload_file"]["name"];
       $file_name = $upload_dir . $_FILES["upload_file"]["name"];
       if(move_uploaded_file($_FILES["upload_file"]["tmp_name"], $file_name))
         echo " - Success";
       else
         exit(" - Upload failed.");
     } else {
         echo "No file was selected.";
     }
  }
?>
<!-- 이하 패스워드를 입력하고 파일을 선택하는 HTML form 부분입니다 -->
<!DOCTYPE html>
<html>
  <body>
    <form enctype="multipart/form-data" method="post" accept-charset='UTF-8'>
      <fieldset>
        <input type="password" name="mb_pwd" /><br />
        <input type="file" name="upload_file" /><br />
        <input type="submit" value="OK" name="submit"/>
      </fieldset>
    </form>
  </body>
</html>
<?php } ?>


(코드 하이라이터에서 input 태그 다음에 br 태그를 입력했는데 태그가 보이지 않고 게시글에 그대로 작동하는군요 ㅜㅜ)



파이썬 파일은 너무 장황해서 requests 모듈을 이용한 업로드 부분 위주로 편집해서 올립니다 ㅠㅠ


import requests

# CSV 파일의 내용와 관련된 부분은 중략합니다

f = open("CSV 파일명", 'wt')
count = -len(리스트)
while (count < 0):
    f.write(str(리스트[count]) + ',' + str(리스트[count]) + '\n')
    count = count + 1
f.close()

url = 'http://URL/upload_form12345.php'
data = {'mb_pwd':'패스워드', 'submit':'submit'}
files = {'upload_file':('CSV 파일명', open('CSV 파일명', 'r'))}
r = requests.post(url, data=data, files=files)

print(r.content)



매우 허접하지만 일단 작동하는 데에 의의를 두겠습니다 ㅠㅠ


PHP 파일과 파이썬 파일에서 보안상 취약점을 비롯하여 제가 놓치고 있는 문제점은 없는지 여쭤봅니다.


답변 달아주실 분께 미리 감사드려요 ^-^


그럼 스포어 회원님들께서도 10월의 마지막 불금을 뜻깊게 보내세요~!


작성자
이니스프리 119 Lv. (1%) 2799190/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 2

네모
profile image
+1

1. PHP 파일에서 HTML 태그를 출력해야 할 이유가 있을까요?

파이썬 코드에서도 requests 모듈을 통해 곧바로 post 요청을 하는 것 같은데, 굳이 HTML Form 이 또 필요하지는 않아 보이네요.

 

2. mb_pwd 를 비교할때 해시값을 사용하시는 게 좋을것 같네요.

사용 용도에 따라 다르겠지만, 평문값을 넣어두기보단 해시값을 넣어서 해당 값을 비교하는게 안전하지 않을까 싶습니다.

 

3. HTTPS?

HTTP / HTTPS 의 문제가 있을수도 있겠네요.

comment menu
2018.10.27. 00:25

신고

"네모님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → 네모
profile image

네모 님~ 바쁘신데 댓글 정말 감사합니다!! 손목은 좀 어떠신지요?

역시 제가 미처 생각하지 못한 부분이 많네요 ㅠㅠ

바로 실사용을 할까도 생각했었는데 제가 사용 전에 여쭤보길 정말 잘 했네요~!

 

1. HTML form 부분을 모두 삭제하고 PHP 부분만 남겨두어도 돌아간다는 말씀이시죠?

저도 이 스크립트를 짜면서 HTML form이 굳이 필요한지 약간 의문이 들기는 하더군요 ^^;

제가 HTML과 PHP에 대한 이해가 부족하다고 생각하긴 했는데 역시 그랬네요 ㅠㅠ

말씀해주신대로 20번째 줄 이하의 HTML 태그는 모두 삭제할게요~

 

2. 해시값에 대해서는 제가 전혀 고려를 하지 못했어요 ㅠㅠ

실은 제가 로그인 폼을 만들어 본 것이 이번이 처음인 것 같네요.

이에 대해서는 제가 이번 주말에 좀 더 공부를 해보겠습니다!

 

3. 제가 아직 SSL을 적용하지 못했는데 앞으로 적용하려구요 ^^

일단 파이썬 파일 14번째 줄의 URL에서

http vs https 부분을 제외하고 "//URL/upload_form12345.php"형태로 변경할게요.

 

그럼 네모 님께서도 편안한 밤 되시고 10월의 마지막 주말 뜻깊게 보내세요~!

네모 님께 항상 여러모로 감사드립니다!! ^-^

comment menu
2018.10.27. 00:59

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [1차 해결 및 추가] 서버 접속 불가 문제 안내 14 마스터 24.06.20.15:22 940
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 2907
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 6673
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4723
226 메일 서버 구축과 관련해 질문 있습니다! 13 갱생협스 20.05.10.14:24 440
225 글쓰기 포인트 차감을 우회하여 도배하는 스팸에 대해 질문드려요~! 22 이니스프리 20.05.31.00:25 440
224 MySQL 실행이 안됩니다. title: 황금 서버 (30일)하루살이 17.01.28.11:55 441
223 Autoset에서 제작한 홈페이지를 아메트린 서버에 올릴 때 주의할 점이 있을까요? 6 이니스프리 17.09.30.01:35 442
222 미디어위키 리버티 스킨 도구 설정 1 image 박재식품 18.02.28.12:36 443
221 Cloudflare와 관련하여 질문 드려요 ^-^ 7 이니스프리 20.03.30.14:48 443
220 [해결함] [스포어]지속적인 반달리즘적 행위 때문에 DB를 4월 이전으로 되돌리고싶습니다. 260578 18.04.29.19:07 444
219 그누보드 로고? 등록.. 5 title: 맛스타의 자물쇠에듀 16.10.16.17:51 445
218 [신서버] 저만 이런 문제가 발생하나요? 5 image title: 은메달도다 16.12.27.15:23 447
217 미디어위키 섬네일 생성 에러 4 Kongjak 17.08.02.20:56 448
216 Tiny Tiny RSS 사용하시는 분께 장단점에 대한 질문 드립니다 이니스프리 17.10.22.00:29 448
215 프로그래머스의 코딩테스트 연습과 COS PRO 난이도에 대해 질문 드립니다. 5 이니스프리 19.12.08.22:26 448
214 타 호스팅 업체에 있는 것들 옴기는 방법이 있나요? 4 BlackTeddyBear 16.11.12.17:23 449
213 스마트폰 지문인식 과정에서 에러가 덜 발생하는 방법을 질문 드립니다 6 이니스프리 19.10.25.20:08 450
212 음.? 도와주세요 첫 글인가요? SSD 마이그레이션 관해 3 베가리안 16.08.25.01:51 451
211 [스터디포어스] 호스팅사용자 제한, XE 설치 | 입문 도와드립니다. 3 title: 황금 서버 (30일)어코 16.10.17.19:35 453
210 국내 뉴스 API 중에 검색기간 설정이 가능한 것이 있을까요?? 6 이니스프리 20.05.14.00:19 453
209 Set up the wiki 18 Whitetiger0423 20.12.07.10:37 455
208 일본어 시험 초급(?)을 따야되는데 조언을 부탁드립니다 ㅠㅠ 6 이니스프리 19.10.04.12:06 458
207 ftp마운트좀 해주세요 마스터님 11 djdisodo 16.10.28.22:15 459