Python中的MySQL,匹配和注入

2024-03-28 22:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

  1. MySQL中的MATCH是否也容易受到注入攻击? 例如:

    """SELECT * 
         FROM myTable 
         WHERE MATCH(myColumnName) AGAINST(%s) 
         ORDER BY id 
         LIMIT 20""" % query
    

    似乎允许任意字符串,这看起来很糟糕。

  2. 如果是这样的话,我尝试了以下Python文档中的示例-

    ^{pr2}$

    但是没有返回任何内容-即使字符串query返回了上面(1)中的内容。为什么?

  3. 在2中),使用占位符%s而不是?返回结果。为什么这比1更安全(如果有的话)?E、 对于查询字符串,我总是可以用query=')...'关闭字符串和括号,然后继续query=') OR otherColumnName LIKE '%hello%' --

因此,除去罗马字符或数字之外的所有查询字符串就足够了吗?在


Tags: 字符串fromid内容bymatchmysqlmytable
3条回答

当使用带参数的参数化语句时,MySQLdb将转义这些参数,并使用Python字符串格式将这些参数重新插入参数化语句中。然后将一个字符串语句发送到服务器。 您依赖MySQLdb正确转义参数的能力来防止SQL注入:

MySQLdb公司/光标.py公司名称:

def execute(self, query, args=None):
    ...
    if args is not None:
        query = query % db.literal(args)

相反,oursql sends queries and data to the server completely separately。 它不依赖于转义数据。这应该更安全。在

在注入时,使用什么操作符、函数、子句或任何其他host-language术语并不重要。注入是将数据和语言语句混合在一起的问题,当您将数据插入语句时会发生这种情况。Prepared statement参数将数据和语句分开,因此它们不易被注入。在

至于参数的?与{},关于Cursor.execute的MySQLdb文档说明如下:

    execute(self, query, args=None)

[...]

Note: If args is a sequence, then %s must be used as the parameter placeholder in the query. If a mapping is used, %(key)s must be used as the placeholder.

第一个方法是不正确的,因为它使用基本的python字符串格式,它不会转义查询字符串。在

第二种方法是向服务器发送简单查询的首选方法,它将正确地转义查询。在

你只是有一个简单的错误。您需要将AGAINST(?)替换为AGAINST(%s)

该信息也可以在pythonDbApi FAQ中找到

相关问题 更多 >