我正在尝试编写一个面向对象的层来为 NodeJS 创建 SQL 查询,例如 Zend 的 DB 组件。所以我希望能够逃避价值观。是的,我知道参数化查询是理想的。但我想逃避的原因:
- 我希望允许创建的查询以与驱动程序无关的方式执行(就创建特定于平台的 SQL 字符串而言,而不是依赖于一个库的接口进行参数化查询),尽管我将为流行的驱动程序添加对准备好的查询的支持
- Zend 的 Db 组件确实 escaping,所以看起来应该是可能的(安全的)
- 我所知道的 NodeJS 没有任何类似的东西,所以我找不到任何示例或使用另一个库的转义函数
由于 Zend 使用它,我开始使用这种方法。我找到了为MySQL和PostgresSQL转义字符串的示例,但没有找到 Sqlite3 的任何内容。
我尝试跟踪 PHP 的Sqlite3::escapeString函数,并sqlite3VXPrintf
在 sqlite3.c 的第 19016 行结束,这是一个巨大的 printf 函数。我什至不确定那是我应该结束的地方。无论如何,我没有运气试图理解它:P
所以我希望有人能给我更多关于如何做到这一点的指示。我必须注意什么才能使我的转义功能安全?为什么不全部替换'
为\\'
安全?我知道像二阶 SQL 注入这样的缺陷,但这仍然是因为有人忘记逃避某些东西。用于创建 SQL 查询的接口可以自动引用值,除非开发人员明确表示“这是安全的”
虽然我在这里,关于早期MySQL 问题中的解决方案,它看起来很简单(没有特殊情况?)。这真的是它的全部吗?假设 unsafeinput总是被转义。mysqli_real_escape_string转义 NUL (ASCII 0)、\n、\r、\、'、" 和 Control- Z。Sqlite3 的文档只提到了单引号,但像 NUL 这样的某些字符看起来很可疑。我可以在哪里找到更多关于这个的信息?
libpq中 PostgresSQL 的转义函数看起来也只是用转义引号替换引号。我想我只是确保这没问题,因为我总是听到“使用参数化查询!” 好像转义函数没用一样。
TLDR:我有两个主要问题
- 如果在任何地方都正确完成,转义查询的特殊字符是否安全?
- 在哪里可以找到 Sqlite3 转义代码的示例?官方文档只提到了文字的单引号(想确保),我没有运气追踪 PHP 源代码。