And*_*ter 4 python mysql twisted
我使用Twisted来异步访问Python中的数据库.我的代码看起来像这样:
from twisted.enterprise import adbapi
from MySQLdb import _mysql as mysql
...
txn.execute("""
INSERT INTO users_accounts_data_snapshots (accountid, programid, fieldid, value, timestamp, jobid)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s')
""" % (accountid, programid, record, mysql.escape_string(newrecordslist[record]), ended, jobid))
Run Code Online (Sandbox Code Playgroud)
这一直有效,直到我遇到这个字符:®,这导致线程抛出异常: `exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 7: ordinal not in range(128)
但是,如果我不使用MySQLdb_mysql.escape_string(),当输入包含引号等(当然)时,我会收到数据库错误.在访问数据库之前发生异常,因此数据库的整理似乎根本不重要.
在不对unicode字符抛出异常的情况下,逃避此内容的最佳方法是什么?理想的解决方案是我可以传递unicode字符,不会干扰查询以及MySQL不受干扰; 然而,剥离unicode字符串,用问号替换它们,修改它们或其他任何可以阻止崩溃的东西都是可以接受的.
Gly*_*yph 11
不要格式化这样的字符串.这是一个巨大的安全漏洞.不能自己正确引用.别去尝试.
使用第二个参数来"执行".简单地说,而不是txn.execute("... %s, %s ..." % ("xxx", "yyy"))做txn.execute("... %s, %s ...", ("xxx", "yyy")).请注意逗号而不是百分号.在其他数据库中或使用不同的数据库绑定,您可能使用不同的字符而不是"%s",例如?或者:1, :2, :3或者:foo:, :bar:, :baz:想法是相同的.(如果您对备选方案感到好奇,可以在DB-API 2.0文档中查看paramstyle的文档.)
我过去写过这篇文章.关于该职位的讨论可能对您特别感兴趣.
还请让我强调,这是唯一正确的方法.您可能已经看到MySQL文档讨论以各种方式引用字符串.您可能在PHP中编写了应用程序,缺少适当的传递数据库参数的工具.我保证所有这些信息源都不正确并导致严重且持续的安全问题:不要将参数插入到SQL字符串中.
| 归档时间: |
|
| 查看次数: |
4752 次 |
| 最近记录: |