python код: pg sql функция запускает ошибку выдачи при обнаружении специального символа в строке - PullRequest
0 голосов
/ 21 апреля 2020

Функция 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, кто-нибудь может подсказать, как обрабатывать любые специальные символы, поступающие из внешнего журнала?

1 Ответ

2 голосов
/ 21 апреля 2020

Обычно вы не хотите создавать запросы, просто добавляя строки на любом языке. Это опасно, поскольку эта строка может содержать любые допустимые SQL команды, которые затем будут слепо выполняться механизмом БД (рассмотрим 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

...