我在MySQL数据库中有一个表,它使用UUID v1作为主键。UUID存储为优化的16字节字符串,如中所述https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/。该列的MYSQL数据类型为二进制(16(。所有UUID都以相同的方式生成,使用PHP库。MySQL版本为v5.0.12。
我从表中检索行,如下所示:
$where = sprintf("'%s'", $bytestring_uuid);
$wpdb->get_results(
"
SELECT *
FROM $my_table
WHERE id = $where
"
);
现在这通常是有效的,但奇怪的是,对于一些UUID,查询失败了,我不知道为什么。
以下是查询使用的一些UUID(原始格式,因此您可以读取它们(:
c80615fc-e441-11e8-b328-002522a6b241
d4c94f0c-e441-11e8-9316-002522a6b241
df11cade-e441-11e8-b3a5-002522a6b241
这个失败了:
27c049c4-e67f-11e8-9e6f-002522a6b241
错误日志:
WordPress数据库错误您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册在"附近使用正确的语法?我在第3行查询选择*自my_table其中id=‘AäAÉü³(
知道发生了什么吗?
27是单引号,22是双引号。因此,迫切需要对二进制字符串进行转义。是的,这个链接告诉你如何只拿16个字节来存储它
或者。。。而不是说
WHERE uuid = '?IÄžo...'
捕获十六进制并说
WHERE uuid = UNHEX('27c049c4e67f11...');
也就是说,将$byte_string
设为32位十六进制数字。
解决SQL注入问题还可以解决二进制格式的某些字符在PHP插值字符串中无法很好地展开的问题。
使用PDO或mysqli解决方案可以解决这两个问题。
还有MySQL-5.0.12,它目前还没有处于任何维护状态。如果唯一的解决方案是升级,你就会遇到麻烦。越快越好。