als*_*air 5 python tuples mysql-python
我有一些通过 python mysqldb 到我的 mysql 数据库的 sql 查询,但我想让它们少一点 sql 注入漏洞,这样小 bobby 表就不会尝试添加数据。
例如:
原文:(
这有效,所以 ListID 等绝对有效)
sql="SELECT NAME FROM ListsTable WHERE ID=%s"%(ListID)
c.execute(sql)
Run Code Online (Sandbox Code Playgroud)
尝试使用元组:
sql="SELECT NAME FROM ListsTable WHERE ID=%s"
c.execute(sql,(ListID,))
Run Code Online (Sandbox Code Playgroud)
作品:
sql="SELECT NAME FROM ListsTable WHERE ID=%s"
c.execute(sql, ListID)
Run Code Online (Sandbox Code Playgroud)
我不知道为什么第二次尝试不能作为元组工作,而是将其作为单个参数接受,但无论哪种方式,对于另一个语句,我都需要传递多个参数,因此这不起作用:
原来的:
sql="SELECT * FROM ListsTable ORDER BY ID DESC LIMIT %s,%s"%(Page, (Page*20)+20)
c.execute(sql)
Run Code Online (Sandbox Code Playgroud)
这是可行的,但是如果我尝试将参数作为元组发送,那么这又不行了:
sql="SELECT * FROM ListsTable ORDER BY ID DESC LIMIT %s,%s"
var1=Page
var2=(Page*20)+20
params=(var1,var2)
c.execute(sql,params)
Run Code Online (Sandbox Code Playgroud)
甚至只是
sql="SELECT * FROM ListsTable ORDER BY ID DESC LIMIT %s,%s"
c.execute(sql,(Page,(Page*20)+20))
Run Code Online (Sandbox Code Playgroud)
我最近在我的网络服务器日志上遇到了这个错误,但请注意,这可能是一个错误,因为我一直在尝试许多不同的事情,因为它之前没有出错:(该错误是指上面传递“的尝试”参数”变量)
File "process.py", line 98, in main
c.execute(sql,params)
File "/var/www/cgi-bin/MySQLdb/cursors.py", line 159, in execute
query = query % db.literal(args)
TypeError: not enough arguments for format string
Run Code Online (Sandbox Code Playgroud)
编辑:如果它有帮助,我正在使用 mysqldb 版本 1.2.3,以防它不接受该版本的元组,但不要让我开始了解 mysqldb 文档是多么垃圾。
我无法用 MySQLdb 复制这个。我正在使用 1.2.2 Final。也许尝试一个简单的调试,以确保问题出在您所指出的位置:
In [13]: cur.execute('select %s + %s', (1,2))
Out[13]: 1L
In [14]: cur.fetchall()
Out[14]: ((3L,),)
Run Code Online (Sandbox Code Playgroud)
更新 1:所以我抓取并安装了 1.2.3 Final,这是我的记录:
In [1]: import MySQLdb
In [2]: MySQLdb.version_info
Out[2]: (1, 2, 3, 'final', 0)
In [3]: con = MySQLdb.connect(user='root', db='inventory')
In [4]: cur = con.cursor()
In [5]: cur.execute('select %s + %s', (1,2))
Out[5]: 1L
In [6]: cur.fetchall()
Out[6]: ((3L,),)
Run Code Online (Sandbox Code Playgroud)
如果我能复制你的问题,那么也许我就能提供解决方案!?那么我们的两个环境之间还有什么不同呢?
$ mysql --version
mysql Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (x86_64) using readline 6.1
Run Code Online (Sandbox Code Playgroud)
更新2:你也许可以比上面更进一步地分解事情。请注意 MySQLdb-1.2.3 源代码中的以下片段:
139 def execute(self, query, args=None):
...
158 if args is not None:
159 query = query % db.literal(args)
160 try:
161 r = self._query(query)
162 except TypeError, m:
163 if m.args[0] in ("not enough arguments for format string",
164 "not all arguments converted"):
165 self.messages.append((ProgrammingError, m.args[0]))
Run Code Online (Sandbox Code Playgroud)
第 159 行是您的参数被转换/转义然后插入到查询字符串中的地方。所以也许你可以这样做:
In [24]: con.literal((1,2,))
Out[24]: ('1', '2')
Run Code Online (Sandbox Code Playgroud)
在与查询字符串合并之前,查看驱动程序如何转换参数。
In [26]: "select %s + %s" % con.literal((1,2,))
Out[26]: 'select 1 + 2'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9202 次 |
| 最近记录: |