如何转义SQL字符串(不是参数化查询)

时间:2013-07-01 04:44:18

标签: javascript sql sqlite escaping

我正在尝试编写一个面向对象的层来为NodeJS创建SQL查询,就像Zend的DB组件一样。所以我希望能够逃避价值观。是的,我知道参数化查询是理想的。但我想逃避的原因是:

  • 我想允许创建的查询以驱动程序的方式执行(在创建特定于平台的SQL字符串方面,而不是依赖于一个库的接口进行参数化查询),尽管我将添加对常用的准备查询的支持驱动程序
  • Zend's Db component does escaping,所以看起来应该可以(安全)
  • 我所知道的NodeJS并没有这样的东西,所以我找不到任何例子或使用其他库的转义功能

自Zend使用它以来,我开始使用这种方法。我找到了为MySQLPostgresSQL转义字符串的示例,但没有为Sqlite3找到任何内容。

我尝试跟踪PHP的Sqlite3::escapeString函数,最后在sqlite3.c,第19016行的sqlite3VXPrintf结束,这是一个庞大的printf函数。我甚至不确定我应该在哪里结束。无论如何,我没有运气试图理解它:P

所以我希望有人可以给我更多关于如何做到这一点的指示。 我需要注意什么才能使我的逃避功能安全?为什么不用'安全替换所有\\'?我知道像二阶SQL注入这样的缺陷,但这仍然是因为有人忘了逃避某些事情。除非开发人员明确说“这是安全的”

,否则创建SQL查询的接口可以自动引用值

虽然我对此有所了解,关于早期MySQL question中的解决方案,它看起来很简单(没有特殊情况?)。那是真的有它吗?假设unsafeinput 总是转义。 mysqli_real_escape_string转义为NUL(ASCII 0),\ n,\ r,\,',“和Control-Z。Sqlite3's documentation只提到单引号,但像NUL这样的某些字符看起来很腥。我可以随时随地了解更多相关信息?

PostgresSQL在libpq中的转义函数看起来似乎只是用转义引号替换引号。我想我只是确保这是可以的,因为我总是听到“使用参数化查询!”就像逃避功能一样无用。


TLDR : 我有两个主要问题

  1. 如果查询在任何地方正确完成,是否可以安全地转发特殊字符?
  2. 我在哪里可以找到Sqlite3转义代码的示例?官方文档只提到文字的单引号(想要确定),我没有运气跟踪PHP源。

0 个答案:

没有答案