【发布时间】:2010-02-09 14:39:17
【问题描述】:
我正在为用户注册编写自己的验证码系统。所以我需要创建一个合适的 URL 来接收生成的验证码图片。生成看起来像这样:
_cipher = cipher.new(settings.CAPTCHA_SECRET_KEY, cipher.MODE_ECB)
_encrypt_block = lambda block: _cipher.encrypt(block + ' ' * (_cipher.block_size - len(block) % _cipher.block_size))
#...
a = (self.rightnum, self.animal_type[1])
serialized = pickle.dumps(a)
encrypted = _encrypt_block(serialized)
safe_url = urlsafe_b64encode(encrypted)
然后我试图通过视图函数中的 GET 请求接收此密钥,它在 urlsafe_b64decode() 上失败,并出现“字符映射必须返回整数、无或 unicode”错误:
def captcha(request):
try:
key = request.REQUEST['key']
decoded = urlsafe_b64decode(key)
decrypted = _decrypt_block(decoded)
deserialized = pickle.loads(decrypted)
return HttpResponse(deserialized)
except KeyError:
return HttpResponseBadRequest()
我发现在 urlsafe_b64encode 的输出上有一个 str,但是 GET 请求返回一个 unicode 对象(尽管它是一个正确的字符串)。 Str() 没有帮助(它在 django 深处返回解码错误),如果我使用 key.repr 它可以工作,但解密器无法使用错误“输入字符串必须是倍数长度为 16”。 在一个测试文件中,所有这些构造都完美运行,我不明白,有什么问题?
【问题讨论】:
-
加密有必要吗?验证码的生成不能在会话数据服务器端存储正确的答案吗?还是您想避免这种情况?
-
只是还没想好。但这个问题很有趣,我想了解它发生的原因。
-
key = str(request.REQUEST['key'])不起作用? -
它返回一个错误:文件“/usr/lib/pymodules/python2.6/django/http/__init__.py”,第 365 行,在 _get_content return smart_str(''.join(self. _container), self._charset) TypeError: sequence item 0: expected string, int found
标签: python django encryption encoding base64