【问题标题】:python mysql api apostrophepython mysql api撇号
【发布时间】:2012-07-28 17:33:39
【问题描述】:

众所周知,Python 的 cgi.escape() 函数不会转义引号或撇号。 Python MySQLdb API 也可以这样说吗? 在下面的例子中,O'Reilly 中的撇号是否在进入数据库时​​被转义了?

lastname = O'Reilly
cursor.execute ('INSERT INTO table_name (surname) VALUES (%s)', (lastname,))

谢谢!

【问题讨论】:

    标签: python code-injection mysql-python apostrophe


    【解决方案1】:

    是的(答案至少需要 30 个字符)。

    【讨论】:

    • 我非常喜欢你的回答!我可以麻烦您建议一些文档吗?我相信我已经在网上搜索过此类内容,但您一定找到了我错过的东西。谢谢!
    • 我从事数据库访问已有 15 年了,所以这是经验之谈——这正是所有数据库库的工作方式 :-) 你在 execute() 调用中所做的是将标记 (%s) 绑定到参数。不涉及转义(至少在概念上——你应该忽略 MySQLdb 库在后台所做的事情......)
    • 哈哈,我猜是我的问题;我想知道 Python 在清理数据方面做了什么。您是说 O'Reilly 变成 O"'Reilly 或 O\\\'Reilly 或其他东西在前往 db 表的途中?那么,如果我调用该数据以在 html 文档中使用,我就没有进一步的转义了做什么?在你多年的编码中,你有没有看过任何解决这个问题的 Python 文档?我非常感谢你的回答。
    • 不,O'Reilly 的存储方式与数据库表中的存储方式完全相同。当数据库库按照 DB-api 的预期方式实现参数绑定时,O'Reilly 根本没有任何反应。不幸的是,Python 中有几个 DB-libs 是(或曾经是)“伪造”参数绑定,实际上在客户端中创建 sql 语句之前将参数转换为字符串。但这不是它应该如何工作的,所以我会忘记例外情况(然后他们将使用 sql-dialect 的适当转换)。
    • 关于在 html 文档中使用问题的答案:由于撇号,无需进一步转义(您可能需要转义其他字符,例如 << 等)
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2012-01-02
    相关资源
    最近更新 更多