内容简介:用户有个内部系统,提供基础数据,用户想在不改造改内部系统的前提下将数据文件(txt)内容进行加密,然后copy到我们系统思来想去只能搞一个代理服务器拦截用户的下载请求,解析内容后返回加密后文件
用户有个内部系统,提供基础数据,用户想在不改造改内部系统的前提下将数据文件(txt)内容进行加密,然后copy到我们系统
思路
思来想去只能搞一个代理服务器拦截用户的下载请求,解析内容后返回加密后文件
参考
具体实现代码
import logging;
logging.basicConfig(level=logging.INFO)
import socket, select
import _thread
from io import BytesIO
from Cryptodome.Cipher import AES
class Proxy(object):
def __init__(self, soc):
self.client, _ = soc.accept()
self.target = None
self.is_export = False
self.BUFSIZE = 1024
self.method = None
self.targetHost = None
self.s = None
# 解析请求
def getClientRequest(self):
request = self.client.recv(self.BUFSIZE).decode()
if not request:
return None
cn = request.find('\n')
firstLine = request[:cn]
line = firstLine.split()
self.method = line[0]
self.targetHost = line[1]
return request
# 拦截正常请求
def commonMethod(self, request):
tmp = self.targetHost.split('/')
logging.info(tmp)
targetAddr = self.getTargetInfo(tmp[2])
if len(tmp) > 5 and tmp[5].find('export_delivery') >= 0:
self.is_export = True
else:
self.is_export = False
try:
(fam, _, _, _, addr) = socket.getaddrinfo(targetAddr[0], targetAddr[1])[0]
except Exception as e:
print(e)
return
self.target = socket.socket(fam)
self.target.connect(addr)
self.target.send(request.encode())
self.nonblocking()
def connectMethod(self, request):
print('建立连接')
pass
# 启动方法
def run(self):
request = self.getClientRequest()
if request:
if self.method in ['GET', 'POST', 'PUT', 'DELETE', 'HAVE']:
self.commonMethod(request)
elif self.method == 'CONNECT':
self.connectMethod(request)
# 分析数据
def nonblocking(self):
inputs = [self.client, self.target]
break_flag = False
if (self.is_export == True):
self.s = BytesIO()
while True:
if break_flag == True:
break
readable, writeable, errs = select.select(inputs, [], inputs, 3)
if errs:
print('nonblocking errs')
break
for soc in readable:
data = soc.recv(self.BUFSIZE)
if data:
if soc is self.client:
self.target.send(data)
elif soc is self.target:
if (self.is_export == True):
self.s.write(data)
else:
self.client.send(data)
else:
break_flag = True
break
if (self.is_export == True):
self.parseRequest()
self.client.close()
self.target.close()
# 解析文件内容并加密
def parseRequest(self):
try:
_res = self.s.getvalue().decode("gb2312")
tmp = _res.split('octet-stream\r\n\r\n')
_h = tmp[0] + 'octet-stream\r\n\r\n'
_b = tmp[1]
nb = BytesIO()
nb.write(_h.encode('utf8'))
secret_key = "ThisIs SecretKey"
iv_param = 'This is an IV456'
aes1 = AES.new(secret_key.encode("gb2312"), AES.MODE_CFB, iv_param.encode("gb2312"))
cipher_data = aes1.encrypt(_b.encode("gb2312"))
nb.write(cipher_data)
self.client.send(nb.getvalue())
except Exception as e:
print('Error:', e)
self.client.send(self.s.getvalue())
def getTargetInfo(self, host):
port = 0
site = None
if ':' in host:
tmp = host.split(':')
site = tmp[0]
port = int(tmp[1])
else:
site = host
port = 80
return site, port
if __name__ == '__main__':
host = '127.0.0.1'
port = 8083
backlog = 5
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((host, port))
server.listen(backlog)
while True:
# 多线程
# t = Process(target=Proxy(server).run)
# t.start()
# 单线程
_thread.start_new_thread(Proxy(server).run, ())
复制代码
以上所述就是小编给大家介绍的《Python 之构建代理服务器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 《高性能linux服务器构建实战》
- 使用Freya构建F# Web服务器
- 使用Gulp构建本地开发Web服务器
- 重新思考使用无服务器构建软件的方式
- 使用 Solr 构建企业级搜索服务器
- 利用LXD容器构建共享的GPU服务器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
马云现象的经济学分析:互联网经济的八个关键命题
胡晓鹏 / 上海社会科学院出版社 / 2016-11-1 / CNY 68.00
互联网经济的产生、发展与扩张,在冲击传统经济理论观点的同时,也彰显了自身理论体系的独特内核,并与那种立足于工业经济时代的经典理论发生显著分野。今天看来,“马云”们的成功是中国经济长期“重制造、轻服务,重产能、轻消费,重国有、轻民营”发展逻辑的结果。但互联网经济的发展却不应仅仅止步于商业技巧的翻新,还需要在理论上进行一番审慎的思考。对此,我们不禁要问:互联网经济驱动交易发生的机理是什么?用户基数和诚......一起来看看 《马云现象的经济学分析:互联网经济的八个关键命题》 这本书的介绍吧!