我正在使用mysql和php(Laravel)并面临一个非常奇怪的情况。
我正在尝试获取加密的用户类型和用户ID并对其进行解密。然后找到该用户ID的记录。
我的代码是这样的。我正在使用Laravel框架。
$key = Config::get('app.key');
$decodedUserIDwithType = base64_decode($encryptedUserIDwithType);
$decryptedUserIDwithType = mcrypt_decrypt(XXXXX , $key, $decodedUserIDwithType, XXXXXX);
$userIDwithType = $decryptedUserIDwithType;
我期待解码的值是这样的
id@100
所以我会用@爆炸它并找到用户ID,这里是100。
进行测试我通过手动添加一个或两个字符来更改加密值。当我解密我有类似的东西
id@100������������������������]u甀�+&�fj�W�ZЪS��d��]3�]"
在我爆炸之后我将获得100���]u甀�+&�fj�W�ZЪS��d��]3�]"
现在我选择使用相同ID的所有原始数据。
SELECT * FROM table WHERE id = $ id
即使实际ID为 100���]u甀�+&�fj�W�ZЪS��d��]3�]"
太奇怪了。 id列的类型为INT
可能就是匹配的原因。
但从我的观点来看,这是非常糟糕的,因为我的整个逻辑因此而变得不正确。
我在Laravel和原始MySQL Query中检查了这个查询,结果是一样的。
任何想法,提前致谢。
更新
我理解Shadow提到的观点,但是如何处理 这样的场景,从解密我希望id为100,但如果我 得到类似1ASASAS的东西,如果你把它转换为int它将是1(这个 仅举例)。现在问题是我的数据库有一个用户ID 1 所以现在你可以看到我有多麻烦,因为我会得到一个 错误的用户,遗憾的是这与付款有关:P。有些不正确 用户钱包将加满。哈哈。如何处理这个
答案 0 :(得分:3)
这不是一个错误,这是MySQL手册的Type Conversion in Expression Evaluation部分中描述的MySQL中的一个功能:
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。例如,MySQL会根据需要自动将数字转换为字符串,反之亦然。
当MySQL将字符串转换为数字时,只要字符可以被解释为数字的一部分并且在遇到不能被视为数字一部分的字符时停止,它就会从左侧开始评估字符。 。如果是100���]u甀�+&�fj�W�ZЪS��d��]
,则第一个�
不能被解释为数字的一部分,因此MySQL在100
之后停止。 100之后的字符似乎是某种垃圾,你应该检查你的PHP代码为什么会产生垃圾。