相关疑难解决方法(0)

在HTTP Basic Auth用户名中损坏了UTF-8字符

我正在尝试使用Ruby on Rails构建Web服务.用户通过HTTP Basic Auth进行身份验证.我想在用户名和密码中允许任何有效的UTF-8字符.

问题是浏览器在将它们发送到我的服务之前在基本身份验证凭据中修改了字符.为了测试,我使用'カタカナカタカナカタカナカタカナカタカナカタカナカタカナカタカナカタカナカタカナ'作为我的用户名(不知道它意味着什么 - AFAIK它是我们的QA家伙想出的一些随机字符 - 请原谅我,如果它有点冒犯).

如果我把它看作一个字符串,并做username.unpack("H*")将其转换为十六进制,我得到:"3e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a83e28ba3e28fb3e28ba3e38a8"这似乎是对适合32个汉字字符(3个字节元/ 6个十六进制数字).

如果我使用通过HTTP Basic auth进入的用户名执行相同的操作,我会得到:'bafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaacbafbbaac'.它显然要短得多.使用Firefox Live HTTP Headers插件,这是发送的实际标头:

Authorization: Basic q7+ryqu/q8qrv6vKq7+ryqu/q8qrv6vKq7+ryqu/q8o6q7+ryqu/q8qrv6vKq7+ryqu/q8qrv6vKq7+ryqu/q8o=
Run Code Online (Sandbox Code Playgroud)

看起来像'bafbba ...'字符串,高低字节交换(至少当我将其粘贴到Emacs中时,基本64解码,然后切换到hexl模式).这可能是用户名的UTF16表示,但我没有任何东西可以将其显示为除了胡言乱语之外的任何东西.

Rails将内容类型标头设置为UTF-8,因此浏览器应该以该编码发送.我获得了表单提交的正确数据.

问题出现在Firefox 3.0.8和IE 7中.

那么......是否有一些神奇的功能让网络浏览器通过HTTP Basic Auth发送UTF-8字符?我在接收端处理错误了吗?HTTP Basic Auth是否不适用于非ASCII字符?

ruby-on-rails http utf-8 http-headers

28
推荐指数
2
解决办法
1万
查看次数

标签 统计

http ×1

http-headers ×1

ruby-on-rails ×1

utf-8 ×1