【问题标题】:SQL Injection using Python使用 Python 进行 SQL 注入
【发布时间】:2021-03-06 02:36:39
【问题描述】:

我有以下问题:我需要一个动态创建语句,这取决于我的对象具有哪些属性。

它的以下对象:

class Table:

    columns = []

    def __init__(self, name, columns):
        self.columns = columns
        self.name = name

    def columnsNumber(self) -> int:
        return self.columns.__len__()

这是插入的样子:

sql = "INSERT INTO tableOverview (tableName, columns, datum) VALUES(%s, %s, CURRENT_TIMESTAMP);"
            val = (table.name, table.columns.__len__())
            await cursor.execute(sql, (val))


for x in table.columns:
        sql = "ALTER TABLE %s ADD COLUMN %s VARCHAR(100) UNIQUE " % (table.name,x)
        await cursor.execute(sql)

现在我不知道如何防止 SQL 注入。

【问题讨论】:

    标签: python mysql sql-injection


    【解决方案1】:

    对于ALTER TABLE 语句,您可以使用反引号引用标识符名称,如here 所述。

    for x in table.columns:
        sql = "ALTER TABLE `%s` ADD COLUMN `%s` VARCHAR(100) UNIQUE " % (table.name,x)
        await cursor.execute(sql)
    

    在插入语句中,代码已经正确使用参数替换来确保插入的值被正确引用。

    sql = "INSERT INTO tableOverview (tableName, columns, datum) VALUES(%s, %s, CURRENT_TIMESTAMP);" 
    val = (table.name, table.columns.len()) 
    await cursor.execute(sql, val)
    

    【讨论】:

    • 一种风格:我们一般不会在python中直接调用__len__(),或者创建名为len的方法:如果一个类需要提供获取其长度的方法,请定义__len__()但通过len(obj) 调用它,而不是obj.__len__()
    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多