2016-03-11 32 views
-3

我正在与一个远程应用程序似乎做一些神奇的编码。应用程序呈现明确的响应(我将其称为True和False),具体取决于用户输入。我知道两个有效的值,这将会呈现'真',所有其他值都应该是'假'。这种情况是一种奇怪的UTF-8编码转换吗?

我发现(意外)有趣的是,提交损坏的值导致'真'。

示例输入:

USER10 //gives True 
USER11 //gives True 
USER12 //gives False 
USER.. //gives False 
OTHERTHING //gives False 

所以基本上只有这两个第一值呈现真响应。我注意到,令人惊讶的是,USERL0(十六进制\ x55 \ x53 \ x45 \ x52 \ C0 \ xB1 \ x30)被接受为True。 我没有检查其他十六进制字节,没有这样的成功。它使我得出结论:\ xC0 \ xB1可以以某种方式转换为0x31(='1')。

我的问题是 - 它是如何发生的?该应用程序是否执行了从UTF-16(或其他)到UTF-8的奇怪转换?

我会很感激任何意见/想法/提示。

+0

为什么不使用?是不是一个有效的问题,有效的答案? –

回答

2

C0是一个双字节UTF-8序列的无效起始字节,但如果一个错误的UTF-8解码器接受它,C0 B1将被解释为ASCII 31h(字符1)。

引用Wikipedia

...(C0和C1)只能被用于ASCII字符无效“过长编码”(即,试图0之间编码的7位ASCII值和127使用两个字节,而不是一个...

+0

感谢您的一个伟大的,但简短的解释:) –