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()
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()