1

有一个有趣的错误——对我来说——。

请按照我执行的查询。

一切正常。

mysql> select hex(current_user());
Result : 726F6F74406C6F63616C686F7374

一切正常。

mysql> select substring(hex(current_user()),1,15);
Result : 726F6F74406C6F6

我将空字符串添加到子字符串方法的第二个和第三个参数。一切正常。

mysql> select substring(hex(current_user()),''+1,''+15);
Result : 726F6F74406C6F6

当我将空字符串添加到子字符串的第一个参数时.. 只返回 726.:S 我期待我最新查询的相同结果。

mysql> select substring(hex(current_user())+'',1,15);
Result : 726

mysql> select substring(hex(current_user())+'',2,15);
Result : 26

mysql> select substring(hex(current_user())+'',3,15);
Result : 6

mysql> select substring(hex(current_user())+'',4,15);
Result : NULL

我用 Mysql 5.0.95 和 5.1.61 测试过,同样的问题..!我用中间函数而不是子字符串测试了相同的查询..再次相同。

任何的想法 ?我正在研究某种 Web 应用程序防火墙规则绕过,我意识到了那个错误。

4

2 回答 2

1

当您应用“+”运算符时,它将十六进制转换为整数(通过从十六进制获取字符直到第一个非数字字符:726)。并且空字符串也被转换(到整数:0)。

例子:

''+1 => 0+1=1
726F6F74406C6F63616C686F7374+'' => 726+0 = 726

concat()函数应该用于连接字符串。

于 2012-11-29T22:07:32.513 回答
0

如果你想要可靠的结果,你应该使用 concat ......

SELECT hex(current_user()),
    hex(current_user())+'', 
    substring(hex(current_user())+'',1,15),
    concat(hex(current_user()), ''), 
    substring(concat(hex(current_user()), ''),1,15); 
于 2012-11-29T21:50:14.743 回答