Python 改进SQL插入查询以避免SQL注入

Python 改进SQL插入查询以避免SQL注入,python,mysql,sql,sql-injection,sql-insert,Python,Mysql,Sql,Sql Injection,Sql Insert,我正在使用pymyql/mysql连接器将消息写入mysql数据库。消息在mqtt broker的回调(paho.mqtt callback)上处理。我有4个不同的表,根据消息类型,我将消息插入数据库。我已将插入查询编写如下。这种编写方式似乎导致了sql注入。有什么建议可以改进insert查询语句吗 # callback attached to paho.mqtt.client def on_message(self, client, userdata, msg): if m

我正在使用pymyql/mysql连接器将消息写入mysql数据库。消息在mqtt broker的回调(paho.mqtt callback)上处理。我有4个不同的表,根据消息类型,我将消息插入数据库。我已将插入查询编写如下。这种编写方式似乎导致了sql注入。有什么建议可以改进insert查询语句吗

# callback attached to paho.mqtt.client    
def on_message(self, client, userdata, msg):

    if  msg.topic.startswith("topic1/"):
        self.bulkpayload += "(" + msg.payload.decode("utf-8") + "," + datetime + "),"
    elif msg.topic.startswith("topic2/"):
        self.insertStatement += "INSERT INTO mydatabase.table1 VALUES (" + msg.payload.decode("utf-8") + "," + datetime + ");"
    elif msg.topic.startswith("topic3/")   
        self.insertStatement += "INSERT INTO mydatabase.table2 VALUES (" +msg.payload.decode("utf-8") + "," + datetime + ");"
    elif msg.topic.startswith("messages"):
        self.insertStatement += "INSERT INTO mydatabase.table3 VALUES ('" + msg.topic + "',"  + msg.payload.decode("utf-8") + "," + datetime + ");"
    else:
    return  # do not store in DB

    cursor.execute(self.insertStatement)
    cursor.commit()

使您的查询使用参数。注射的机会要小得多:

cursor.execute(“插入表值(%s,%s,%s)”,(var1,var2,var3))

此处的信用卡(及更多信息):


此外,Dan Bracuk是正确的-如果在发送查询和使用查询参数之前尚未验证用户输入,请确保在执行SQL之前验证参数。我不太熟悉Python语法,但您能将insert语句参数化吗?这将有助于我像这样使用cursor.execute(“插入表值(%s,%s,%s)”,(msg.payload.decode(“utf-8”),var3))我想是的……我不是Python语法专家……无论如何,试试吧!到时候你就能为自己找到最好的解决方案。注意:该示例有三个
%s
占位符,但您只考虑其中的两个。
msg.payload.decode(“utf-8”)
保存前两个(%s,%s)占位符的值。我不确定这是否有效。我试试看。否则,我必须拆分负载中包含的值并映射到占位符。谢谢。啊,好的,那它是数组吗?无论哪种方式,我都非常确定您将需要获取值/值并对其进行处理,以便您的SQL语句分别为占位符1和占位符2指定一个值。