PHP拼接含AES加密的UPDATE SQL时仅输出WHERE条件的问题排查
问题根因
问题出在PHP运算符优先级不匹配:字符串拼接符.的优先级高于三元运算符?:,你的代码没有给整个三元运算逻辑加括号包裹,实际执行顺序和你预期的完全不一致。
实际执行逻辑拆解
你写的代码结构等价于:
// 先把前面所有UPDATE字符串和is_array返回的布尔值拼接,得到临时字符串 $temp = "UPDATE customers SET ..." . (is_array($customers_to_obfuscate)); // 再用临时字符串做三元运算的判断条件,非空字符串判定为真,最终返回WHERE子句 $sql = $temp ? " WHERE id IN (...)" : " WHERE id = '...'";
这就是为什么你最终只拿到了WHERE部分的内容,前面的UPDATE语句全部被当作了条件判断的中间值,没有进入最终结果。
修复方案
把整个三元运算逻辑用括号包裹,保证三元运算先执行完成再和前面的UPDATE字符串拼接即可,修复后代码如下:
$sql = "UPDATE customers SET customers.name=AES_ENCRYPT('" . self::PII_OBFUSCATE_NAME . "','" . AES_CRYPT_KEY . "')" . ", address1=AES_ENCRYPT('" . self::PII_OBFUSCATE_ADDRESS1 . "','" . AES_CRYPT_KEY . "')" . ", day_phone=AES_ENCRYPT('" . self::PII_OBFUSCATE_PHONE . "','" . AES_CRYPT_KEY . "')" . ", nite_phone=AES_ENCRYPT('" . self::PII_OBFUSCATE_PHONE . "','" . AES_CRYPT_KEY . "')" . ( is_array($customers_to_obfuscate) ? " WHERE id IN (" . implode(",", $customers_to_obfuscate) . ")" : " WHERE id = '" . addslashes($customers_to_obfuscate) . "'" );
额外优化建议
当前拼接逻辑存在SQL注入风险,尤其是当$customers_to_obfuscate不是数组的场景下直接拼接字符串,建议改用PDO预处理语句传参,避免注入风险。
内容的提问来源于stack exchange,提问作者CodeForGood
相关产品推荐
相关产品推荐

