如何在 python 中安全地转换 SQL 占位符?
How to safely convert SQL placeholders in python?
总结/TLDR:
我如何安全地(没有 空间进行 sql 注射)转换 sql 占位符?
像 make SELECT * FROM
go from SELECT * FROM ?
(正则表达式替换适用于模式 $\d{1,}
但它有非常明显的缺陷,比如捕获用引号括起来的文字值)
反之亦然,从 SELECT * FROM ?
到 SELECT * FROM
也很有帮助
我想做什么:
我有一个缓慢的 IO 绑定 postgres 连接,它很慢并且想要一个缓存系统,我希望这个缓存接受 sql 并提供输出,所以我决定克隆整个远程数据库并将其转换为本地磁盘 bount sqlite3
space 每次我的应用程序启动时它都充当“缓存”(我预计这会比 redis 更快,因为在本地有一些东西比不会更快)
我正在使用 asyncpg
与远程数据库进行交互,此模块接受 $n
占位符(其中 n
表示从 1 开始的占位符数量)
并使用 sqlite3
,它使用 ?
作为值的占位符,并希望使用单个查询并在这两者之间进行转换。
如前所述,我尝试使用正则表达式和字符串模板,但它们不够安全,是否有内置于 asyncpg
或 sqlite3
本身的方法?
SQLite on parameters 的文档提到了两个要点:
Named parameters are also numbered
...
A dollar-sign followed by an identifier name also holds a spot for a named parameter with the name $AAAA
换句话说,您可以在 SQLite 中使用来自 PostgreSQL 的 SELECT * FROM foo WHERE bar =
查询,反之亦然。
这并不是说所有可能的查询都是可以互换的,它们当然不是,但在这种情况下,您可以限制查询以对参数使用
样式语法并传递它们未修改。
总结/TLDR:
我如何安全地(没有 空间进行 sql 注射)转换 sql 占位符?
像 make SELECT * FROM
go from SELECT * FROM ?
(正则表达式替换适用于模式 $\d{1,}
但它有非常明显的缺陷,比如捕获用引号括起来的文字值)
反之亦然,从 SELECT * FROM ?
到 SELECT * FROM
我想做什么:
我有一个缓慢的 IO 绑定 postgres 连接,它很慢并且想要一个缓存系统,我希望这个缓存接受 sql 并提供输出,所以我决定克隆整个远程数据库并将其转换为本地磁盘 bount sqlite3
space 每次我的应用程序启动时它都充当“缓存”(我预计这会比 redis 更快,因为在本地有一些东西比不会更快)
我正在使用 asyncpg
与远程数据库进行交互,此模块接受 $n
占位符(其中 n
表示从 1 开始的占位符数量)
并使用 sqlite3
,它使用 ?
作为值的占位符,并希望使用单个查询并在这两者之间进行转换。
如前所述,我尝试使用正则表达式和字符串模板,但它们不够安全,是否有内置于 asyncpg
或 sqlite3
本身的方法?
SQLite on parameters 的文档提到了两个要点:
Named parameters are also numbered
...
A dollar-sign followed by an identifier name also holds a spot for a named parameter with the name $AAAA
换句话说,您可以在 SQLite 中使用来自 PostgreSQL 的 SELECT * FROM foo WHERE bar =
查询,反之亦然。
这并不是说所有可能的查询都是可以互换的,它们当然不是,但在这种情况下,您可以限制查询以对参数使用 样式语法并传递它们未修改。