如何使用MySQLdb不转义字符串

2024-06-01 06:56:47 发布

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

使用pymysql(一种MySQLdb替代方法),我想知道用字符串替换数据库或字段名的更好方法是什么。例如:我们想创建一个数据库,它的名称来自一个变量(dbname = "test")。你知道吗

c.execute("CREATE DATABASE `test`;")

想法1

这不起作用,因为添加了引号。你知道吗

c.execute("CREATE DATABASE %s;", (dbname,))

想法2

这很容易受到sql注入的攻击。你知道吗

c.execute("CREATE DATABASE `{}`;".format(dbname))

有更好的主意吗?你知道吗


Tags: 方法字符串test名称数据库formatexecutesql
1条回答
网友
1楼 · 发布于 2024-06-01 06:56:47

无法参数化诸如表或数据库名称之类的标识符,因此唯一可能的方法是执行一些检查,确保名称是安全的,然后使用字符串连接。你知道吗

根据MySQL documentation,引用的标识符可以包含从U+0001U+FFFF的任何Unicode字符。不允许使用NUL字符和U+10000以后的补充字符,因此您需要在任何给定名称中检查它们,如果发现任何异常,则引发异常。如果名称本身包含反勾号,则必须通过加倍对其进行转义。(或者,如果标识符包含任何反记号,则可以选择引发异常。)

此外,标识符不能为空,尽管我很难看到MySQL文档指出了这一点。你知道吗

因此,一个合适的清除标识符的函数可以如下所示(我将由您填写详细信息):

def sanitise_identifier(name):
    # raise exception if name is empty or not a string
    # raise exception if name contains NUL chars
    # raise exception if name contains Unicode supplementary characters (U+10000 onwards)
    return name.replace("`", "``")

那么你可以这样使用它:

c.execute("CREATE DATABASE `{}`;".format(sanitise_identifier(dbname)))

相关问题 更多 >