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
函数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