来自加密表的Psycopg2查询



我遇到了一个问题w。使用psycopg2从表中选择加密列。使用创建测试表之后

create table users (
id BIGSERIAL NOT NULL PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
secret_val_1 BYTEA,
secret_val_2 BYTEA
);

我可以将加密的值插入其中。
现在我正尝试使用psycopg2和从表中查询值

cur.execute("""
SELECT PGP_SYM_DECRYPT(%s::BYTEA, 'compress-algo=1, cipher-algo=aes256')
FROM users;
""",
('secret_val_1',))

现在,这引发了一个错误:

ExternalRoutineInvocationException: Wrong key or corrupt data

有趣的是,当这样传递值时,它是有效的:

def query_users_decrypt(col):
cur.execute("""
SELECT PGP_SYM_DECRYPT({}::BYTEA, 'compress-algo=1, cipher- 
algo=aes256') FROM users;
""".format(col),
(col,))

但是这对于sql注入攻击是不安全的,对吧?
有人知道怎么做吗?谢谢

format()之所以有效,是因为当您传入secret_val_1时,它最终看起来像:

SELECT PGP_SYM_DECRYPT(secret_val_1::BYTEA, 'compress-algo=1, cipher-algo=aes256')
FROM users;

您正在寻找的只是一个直接的查询:

select pgp_sym_decrypt(secret_val_1, 'compress-algo=1, cipher-algo=aes256')
from users;

参数绑定适用于希望传入查询所使用的值的情况。secret_val_1不是一个值,因为它是列的名称。

将参数绑定用于以下内容:

cur.execute("""select pgp_sym_decrypt(secret_val_1, 'compress-algo=1, cipher-algo=aes256' 
from users 
where username = %s""", ('joeuser',))

相关内容

  • 没有找到相关文章

最新更新