MySQL子串和中间解析错误

时间:2012-11-29 21:35:54

标签: php mysql linux substring

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

请按照我执行的查询进行操作。

一切都很正常。

mysql> select hex(current_user());
Result : 726F6F74406C6F63616C686F7374
一切都很正常。

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

我将null字符串添加到substring方法的第二个和第三个参数。一切都很正常。

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

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

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以及同样的问题..!我用mid函数测试相同的查询而不是substring ..再次相同。

有什么想法吗?我正在研究某种Web应用程序防火墙规则绕过,我意识到了这个错误。

2 个答案:

答案 0 :(得分:1)

当你应用'+'运算符时,它正在将HEX转换为整数(通过从HEX中取字符直到第一个非数字字符:726)。并且空字符串也被转换为(整数:0)。

示例:

''+1 => 0+1=1
726F6F74406C6F63616C686F7374+'' => 726+0 = 726
应该使用

concat()函数来连接字符串。

答案 1 :(得分: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);