在 Python 中使用 psycopg2 的正确 SQL 请求

Proper SQL request with psycopg2 in Python

我在使用 Python 中的 psycopg2 库执行 PostgreSQL 查询时遇到问题。

此代码有效:

cols = sys.argv[1:]
cur.execute("SELECT "+', '.join(cols)+" FROM table WHERE a=%s", (a,))

但是,它有一个严重的 SQL 注入漏洞。如果我尝试以正确的方式进行操作:

cur.execute("SELECT %s FROM table WHERE a=%s", (', '.join(cols), a))

匹配过滤器的每一行的输出为 'col1, col2, col3'。所以它只是所有的字符串而不是数据库中的实际值。那么为什么 psycopg2 将字段解释为字符串文字?

好的,看来没有什么好办法了。所以我只是选择根据 SQL standard 的第 4.1.1 节验证用户输入的标识符(以字母开头,然后是字母、数字、下划线、破折号或美元)。

for c in cols:
    if not re.match(r'^[A-Za-z][A-Za-z0-9$_-]+$', c):
            print "Argument is not a valid column name :", c
            sys.exit()