CakePHP3.6使用PostgreSQL加密函数保存文件时,函数被解析为文本如何解决?
解决CakePHP中PostgreSQL加密函数被误当文本的问题
最近踩了个坑:我尝试用PostgreSQL的pgp_pub_encrypt_bytea函数加密文件并存储到数据库,结果生成的SQL里这个函数被包裹在单引号里当成纯文本了,完全没执行加密操作。
一开始的错误写法
我最初是直接把函数调用写进数据数组的file字段里:
$file_base64= base64_encode(file_get_contents($file['file']['tmp_name'])); $data = [ 'some_id' => $some_id, 'name' => $file['file']['name'], 'mime' => $file['file']['type'], 'code'=>$code, 'file' => "pgp_pub_encrypt_bytea(decode('$file_base64', 'base64'), dearmor('$pgp_public_key'))" ];
这时候CakePHP会把整个函数调用当成普通字符串,生成的SQL里file的值就是带单引号的这个字符串,PostgreSQL根本不会执行加密逻辑。
正确的解决方式:用CakePHP的SQL函数API
后来查了CakePHP文档里的「使用SQL函数」章节,发现需要用框架提供的func()方法来明确标记这是要执行的SQL函数,而不是普通文本。修改后的代码如下:
$data = [ 'some_id' => $some_id, 'name' => $file['file']['name'], 'mime' => $file['file']['type'], 'code'=>$code, 'file' => $table->query()->func()->pgp_pub_encrypt_bytea([ "decode('$file_base64', 'base64'), dearmor('$pgp_public_key')" => 'literal' ]) ];
通过$table->query()->func()->pgp_pub_encrypt_bytea()这种方式,CakePHP会正确识别这是一个SQL函数调用,生成的SQL会直接执行加密操作,完美解决了问题。
内容的提问来源于stack exchange,提问作者hug0
相关产品推荐
相关产品推荐

