python 代码:pgsql 函数在遇到字符串中的特殊字符时执行抛出错误

python code: pgsql function execute throwing error when encounter special character in string

函数writeToDb接收来自sshd、http和ssl守护进程的连续日志,当日志中遇到任何特殊字符时,它会抛出错误。

def writeToDb(self):
    value_string = "'" + str(self.timestamp) + "'," + self.message + "'"
    query = "insert into syslog (timestamp, message)"
    query = query + "values (" + value_string + ")"
    try:
        conn = psycopg2.connect("dbname='Testdb' user='admin' host='localhost' password=''")
        conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
        curs = conn.cursor()
        curs.execute(query)



curs.execute(query)
psycopg2.ProgrammingError: syntax error at or near "t"
LINE 1: ...','timestamp','File lastlog Couldn't locate...
                                                        ^

我可以使用下面的方法处理异常

except psycopg2.ProgrammingError:
     pass

如果用户输入查询,我可以在字符串中附加 ' 单引号。我是 python 的新手,任何人都可以建议如何处理来自外部日志的任何特殊字符?

您通常不希望仅通过将任何语言的字符串相加来构建查询。这是危险的,因为该字符串可以包含任何有效的 SQL 命令,然后这些命令将被 DB 引擎盲目执行(考虑 message="); DROP SCHEMA public;")。

在大多数语言和数据库库中,都有安全的机制来替换查询中的参数。在 psycopg2 中你会这样做:

query = "insert into syslog (timestamp, message) values (%s, %s)"
curs.execute(query, (self.timestamp, self.message))

%s 标记是位置占位符。 psycopg2 将用作为第二个参数传递给它的元组中的变量安全地替换它们(因此第一个 %s 将变为 self.timestamp...)。我所说的安全是指它将处理 转义 (替换 SQL 中具有特殊含义的字符)。请参阅此处对问题的深入描述以及如何在 psycopg2 中解决问题:https://www.psycopg.org/docs/usage.html#the-problem-with-the-query-parameters