mySQL 来自 Python 代码的错误

mySQL Error from Python Code

class Database(object):
    def __init__(self,ip_address,datetime_now):
        self.db_connec = mysql.connector.connect(user = DATABASE_USER, password = DATABASE_PASS, host = DATABASE_HOST, database = DATABASE)
        self.ip = ip_address
        self.datetime_now = datetime_now

def run_query(self, query):
    if db_connec == None:
        raise mysql.connector.DatabaseError
        return None

def log_threat(self):
    lol = "ass"
    self.cursor = self.db_connec.cursor()
    self.cursor.execute("INSERT INTO unauthorized_clients (ip_address, time) VALUES ({}, {})".format(self.ip, lol))

#INSERT INTO unauthorized_clients (ip_address, time) VALUES ("trtr", "test")

我正在调用 log_threat 函数并收到此错误。 当我 运行 在 mysql 终端(navicat)中进行非盲查询时,它工作正常,但在这里我收到此错误。

check the manual corresponds to your MySQL server version for the right syntax to use near '0.1, ass)' at line 1

为什么ip被剥离了?

当我打印(self.ip)时,我得到 127.0.0.1

大概 self.ip 是一个字符串。当它用于构造查询字符串时,不会插入引号,因此生成的查询将是:

>>> "INSERT INTO unauthorized_clients (ip_address, time) VALUES ({}, {})".format('127.0.0.1', 'ass')
'INSERT INTO unauthorized_clients (ip_address, time) VALUES (127.0.0.1, ass)'

注意字符串值没有被引用。

在创建查询时不要使用字符串函数,因为它可能导致 SQL 注入漏洞,以及您在此处遇到的那种错误。相反,使用参数化查询来防止 SQL 注入并正确引用字符串值:

lol = 'ass'
self.ip = '127.0.0.1'

self.cursor.execute("INSERT INTO unauthorized_clients (ip_address, time) VALUES (%s, %s)", (self.ip, lol))

这里的值是在一个元组中提供的,该元组作为第二个参数传递给 execute()

我的代码的解决方案,已修复。 在 {} 周围添加引号 - > '{}' 以及添加 self.db_connec.commit()

class Database(object):
    def __init__(self,ip_address,datetime_now, ):
        self.db_connec = mysql.connector.connect(user = DATABASE_USER, password = DATABASE_PASS, host = DATABASE_HOST, database = DATABASE)
        self.ip = ip_address
        self.datetime_now = datetime_now

    def run_query(self, query):
        if self.db_connec == None:
            raise mysql.connector.DatabaseError
            return None

    def log_threat(self):
        self.cursor = self.db_connec.cursor()
        print("Logging Threat... ")
        self.cursor.execute("INSERT INTO unauthorized_clients (ip_address, time) VALUES ('{}', '{}')".format(self.ip, self.datetime_now))
        self.db_connec.commit()


if __name__ == "__main__":
    client_connect()