如何防止discord bot python中的SQL注入攻击

时间:2021-01-27 07:58:42

标签: python sql discord.py sql-injection discord.py-rewrite

对于我的不和谐机器人,我使用 sqlite 作为我的数据库。很多人说用sqlite不好,可能会被SQL注入。他们推荐我使用 aiosql。

我知道 sql 注入如何在网站上工作,但我不知道如何在 discord bot 中完成。我想知道这种 SQL 攻击对不和谐机器人的工作方式。我也想知道有什么方法可以防止以后发生这种攻击。

这是我的代码示例。

@client.command()
@commands.has_permissions(administrator=True)
async def setwelcome(ctx , channel:discord.TextChannel):
    db = sqlite3.connect('Smilewin.sqlite')
    cursor = db.cursor()
    cursor.execute(f"SELECT welcome_id FROM Main Where guild_id = {ctx.guild.id}")
    result = cursor.fetchone()
    if result is None:
        sql = ("INSERT INTO Main(guild_id, welcome_id) VALUES(?,?)")
        val = (ctx.guild.id , channel.id)

        embed = discord.Embed(
            colour= 0x00FFFF,
            title = "ตั้งค่าห้องเเจ้งเตือนคนเข้าเซิฟเวอร์",
            description= f"ห้องได้ถูกตั้งเป็น {channel.mention}"
        )

        message = await ctx.send(embed=embed)
        await message.add_reaction('✅')

    elif result is not None:
        sql = ("UPDATE Main SET welcome_id = ? WHERE guild_id = ?")
        val = (channel.id , ctx.guild.id)
        
        embed = discord.Embed(
            colour= 0x00FFFF,
            title= "ตั้งค่าห้องเเจ้งเตือนคนเข้าเซิฟเวอร์",
            description= f"ห้องได้ถูกอัพเดตเป็น {channel.mention}"
        )
        
        message = await ctx.send(embed=embed)
        await message.add_reaction('✅')

    cursor.execute(sql, val)
    db.commit()
    cursor.close()
    db.close()

完整代码将在以下链接中: https://github.com/reactxsw/Smilewinbot/blob/main/SmileWinbot.py

1 个答案:

答案 0 :(得分:0)

cursor.execute(f"SELECT welcome_id FROM Main Where guild_id = {ctx.guild.id}")

这一行几乎是唯一令人担忧的来源,

可能没问题,但使用 f-string 仍然是不好的做法 构造SQL语句时。

否则所有其他查询似乎都已正确清理,并且您不易受到 SQL 注入的影响