SQL 注入 - Python - MySQL

问题描述 投票:0回答:1

基本上, 我正在尝试寻找方法来探索下面代码中的 SQL 注入漏洞。该代码还有另一层,即表示层,它要求用户输入 board_name。 Table_name 是一个内部变量,用户无法控制它。

    def find_board_by_name(cls, connector, board_name, table_name: str):
        query = "SELECT * FROM {} WHERE name = '{}'".format(table_name,board_name.title())
        print(query)
        try:
            connector.mycursor.execute(query)
            res = connector.mycursor.fetchone()
            if res:
                return res[1]
            return None
        except Exception as e:
            raise e
        

尝试过:

1- board_name 为:' OR '1'='1

它起作用了,程序将桌子上的第一个项目返回给我(这是不应该的,因为我没有提供任何名称)

2- 尝试将 board_name 设置为:';Delete Table BoardGames; 它不起作用,向我呈现了 mysql.connector.errors.InterfaceError: Use multi=True whenexecuting multiple statements。

所以我的问题是“mysql.connector”正在保护我免受大多数 SQL 注入的攻击吗?因为我没有将代码中的“multi”标签设置为True?您能告诉我其他方法来探索此代码中的漏洞吗?除了1和2之外。

我想我知道如何解决 SQL 注入问题: “connector.mycursor.execute(query, value)” 可能会完成这项工作。但是,我试图更好地了解如果没有此修复,这个原始代码会出现什么样的 SQL 漏洞。

mysql python-3.x sql-injection
1个回答
0
投票

SQL 注入并不总是恶意的。它可能会导致一个简单的错误,而不是删除所有学生记录。

例如,如果您网站的某个合法用户名为“O'Reilly”,那么您的代码格式将出现不平衡的引号,这将是语法错误:

SELECT * FROM tablename WHERE name = 'O'Reilly'
                                       ^ wtf

使用参数可以避免此类问题。查询参数不仅仅是插入变量的快速方法。它们要么转义动态内容中的特殊字符(默认情况下 Python 会这样做),要么成熟的参数将值与 SQL 查询分开,直到它被 SQL 服务器解析为止。因此任何特殊字符都不会导致语法错误。

但是表名和其他标识符不能作为参数。您只能使用参数来代替 SQL 值,就像示例中带引号的字符串一样。

© www.soinside.com 2019 - 2024. All rights reserved.