Tornado的日常犯傻(2)

2 篇文章 0 订阅
2 篇文章 0 订阅

Tornado的日常犯傻(2)

问题描述

搭建简单的AESECB攻击试验时,需要直接获取query参数,但是传过去的参数都是自行构建的,如下:

import time

timestamps = int(time.time()).to_bytes(length=4, byteorder='little')
server_id = settings.SERVER_ID.encode(settings.CHARSET)
plaintext = timestamps + server_id
ciphertext = aes.encrypt(plaintext)
response = requests.get(settings.SERVER_ADDRESS, params={'ciphertext': ciphertext})

可以看到,这里传过去的参数是字节型,且无法直接decode('utf-8')对应的参数,因为timestamps我使用了字节存储。如果直接在服务端使用get_argutment('ciphertext')去获取对应的参数,肯定会直接报错的,因为tornado的所有获取参数的方法都会对获取到的参数执行默认的decode操作,如注释所说:

这个方法会在所有get_arguments被调用,而且它也没有提供可以自行设置字符集的参数(decode('latin1')其实是可行的)。所以,需要直接得到url里面的参数,不能使用已经包装好的方法。

问题解决

def get(self, *args, **kwargs):
    ciphertext = self.request.query_arguments['ciphertext'][0]

直接从query_arguments中获取参数

需要注意的是,parse_qs_bytes方法是使用latin1进行编码的

考虑到latin1的编码空间:

Latin1ISO-8859-1的别名,有些环境下写作Latin-1ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

可以看到,latin1的编码空间符合我对timestamp的处理,当然,手动引入from tornado.escape import url_unescape然后对self.request.uri进行url_unescape(self.request.uri)也是可以的,这样可控性更好,只是相对麻烦一点。

小结

没事别瞎折腾。。做个实验都快出花了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值