我最近在一个程序中发现了一个有趣的错误,它使用他们的私钥为特定客户选择数据。考虑以下:
SELECT `id` FROM (`customers`) WHERE `authenticationKey` = '#09209!ko2A-' LIMIT 1
密钥在请求时提供,并在查询之前进行了适当的清理。但是,未能提供密钥(应该在之前捕获;忽略它),将产生类似于以下的查询:
SELECT `id` FROM (`customers`) WHERE `authenticationKey` = 0 LIMIT 1
它将从customers
-table 返回一行 - 尽管它存储了正确的字符串键,例如在第一个示例中。
authenticationKey
-field 的类型为VARCHAR(1024)
。
我的猜测是,这与松散的比较有关。是什么导致了这个问题,如何正确避免?