python - 改进SQL INSERT查询以避免sql注入(inject)

标签 python mysql sql sql-injection sql-insert

我正在使用 pymyql/mysql-connector 将消息写入 mysql 数据库。这些消息是在 mqtt 代理的回调(paho.mqtt 回调)上进行处理的。我有 4 个不同的表,并且根据消息类型,我将消息插入数据库。我已经编写了插入查询,如下所示。这种编写方式似乎会导致sql注入(inject)。有什么建议可以改进插入查询语句吗?

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

最佳答案

使您的查询使用参数。注入(inject)的机会要少得多:

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))

信用(和更多信息)在这里:How to use variables in SQL statement in Python?

此外,Dan Bracuk 是正确的 - 如果您尚未验证参数,请确保在执行 SQL 之前验证您的参数

关于python - 改进SQL INSERT查询以避免sql注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60063077/

相关文章:

mysql - 如何在 Laravel 中编写这个查询(包含子查询中的 group by 和 join)?

php - 获取推荐人 ID

mysql - 基于mySql中列值的一部分分组

java - 如何不将数据字段发送到数据库 Java 和 Microsoft Access

python - 确定 pandas 数据框中另一列的列最大值

python - 如何在Python 3.6上使用conda或pip安装pygraphviz?

mysql - 如何在 MySql 连接中转换纪元时间

python - 在 Pandas (python)中包含和排除

python - 检查 CSV 中的正则表达式

sql - 在Where子句中使用GUID