尝试在python/django中清理非常基本的mysql select

bwntbbo3  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(330)

这简直让我发疯。我有一个非常基本的查询,它在没有sanitization语句的情况下工作,但会与它中断。我读到的所有东西都说要这样做。

query = "SELECT COL1 FROM A_TABLE %s"
queryUserInput = "WHERE COL1 = 'user input value'"
cursor.execute(query, (queryUserInput,))

我收到错误:
1064(42000):您的sql语法有错误;检查与您的mysql服务器版本对应的手册,以获取在“”附近使用的正确语法,其中。。。
栈顶:c:..\env\lib\site packages\mysql\connector\connection\u cext.py in cmd\u query
原始\u as \u string=原始\u as \u string)
python 3.7 django 2.1.3版
任何建议都非常感谢。

jyztefdp

jyztefdp1#

你可以试试:

queryUserInput = "user input value"
cursor.execute("SELECT COL1 FROM A_TABLE WHERE COL1 = %s", [queryUserInput])

和django doc:
直接执行自定义sql

ttvkxqim

ttvkxqim2#

参数化应该用来对一个变量值进行加密,这个变量值被用来构成完成的sql的一部分,例如 7 在查询中,例如 SELECT * FROM user WHERE ID = 7 . 你不能用你正在做的方式参数化sql的整个部分——实际上不需要这样做。
我不太了解python,但从逻辑上讲,我认为您的代码应该是:

query = "SELECT COL1 FROM A_TABLE WHERE COL1 = %s"
queryUserInput = "user input value"
cursor.execute(query, (queryUserInput,))

为了使它只参数化实际的用户输入,而不是任何sql。
(您的原始代码将生成一个类似 SELECT COL1 FROM A_TABLE 'WHERE COL1 = \'user input value\'' 这显然根本不是有效的sql,因为在字符串文本中包含了一个表之后的所有内容。)
此文档(execute()方法的)向您展示了其他一些正确用法的示例:https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

相关问题