无法使用Python和SQL Server执行参数化SQL

2024-09-28 20:47:23 发布

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

我正在尝试运行一个包含许多参数的存储过程。为此,我正在使用pyodbc库及其cursor.execute函数

以下是我正在尝试执行的查询:

executionStr = "EXEC ? @ImportJSON= ?, ?=?, ?=?, ?=?",procName, data, param1, param1Value, param2, param2Value, param3, param3Value

当我运行查询时,它会给我一个错误

TypeError: The first argument to execute must be a string or unicode query.

当我尝试按如下方式运行查询时,它会成功执行,并且我可以看到数据进入

executionStr = "EXEC "+procName+" @ImportJSON='"+data+"', "+param1+"='"+param1Value+"' , "+param2+"='"+param2Value+"' , "+param3+"='"+param3Value+"';"

我正在尝试以前面的格式运行查询,以便保护代码不受SQL注入的影响

我还尝试使用如下参数运行查询,但给出了相同的错误:

preexe = "EXEC ? @ImportJSON= ?, "+param1+"=?, "+param2+"=?, "+param3+"=?"
procedure_cursor.execute(preexe,(procName, data, param1Value, param2Value, param3Value))

我不知道我做错了什么,也不知道我会做错什么。任何帮助都将不胜感激

先谢谢你


Tags: executedata参数错误cursorexecparam1procname
1条回答
网友
1楼 · 发布于 2024-09-28 20:47:23

您上次的尝试是正确的,但参数只能用于传递数据值(例如字符串、数字、日期等),而不能用于传递数据库对象名称(例如表名、列名、存储过程名等)。因此,您需要执行以下操作:

preexe = f"EXEC {procName} @ImportJSON= ?, {param1}=?, {param2}=?, {param3}=?"
procedure_cursor.execute(preexe, (data, param1Value, param2Value, param3Value))

如果代码能够完全控制procNameparam1param2param3的值,那么这不会造成SQL注入的重大风险

相关问题 更多 >