如何转义 SQL 查询的单引号,用于在 cartodb 数据库中的 javascript/jquery 中生成的查询

How do I escape SQL query's single quotes for query generated in javascript/jquery in cartodb database?

本文关键字:查询 数据库 cartodb javascript jquery 何转义 转义 单引号 SQL 用于      更新时间:2023-09-26

我正在使用javascript/jquery来生成sql查询。我有一个在javascript/jquery脚本中生成和使用的sql查询。

像这样:

var storeName;
var query = "SELECT * FROM stores where storeName = '" + storeName + "';";

storeName是当用户从HTML中选择时通过jQuery生成的)

因此,当storeName"Jackson Deli"之类的东西时,查询运行良好。

但是当storeName"杰克逊的熟食店"时,它不起作用,这似乎是因为杰克逊的撇号被视为结束语。 我知道如果我对查询进行硬编码,我可以通过加倍来逃避报价......所以

SELECT * FROM stores where storeName = 'Jackson''s Deli'; 

应该工作。 但我没有对查询进行硬编码。 相反,它是由用户输入生成的,名称中可能有也可能没有撇号。 在这种情况下,我将如何逃脱这个角色'? 我需要它在Javascript/jquery中工作。

我是否需要编写一个 if 语句来查找storeName中的'并将其替换为 ''?还是有其他方法可以解决这个问题?

编辑:哎哟! 通常,是的,我意识到在客户端生成查询的危险。
所以这里有更多的背景。 我正在使用 cartodb 并遵循他们的文档。 这是他们的 repo 中的一个例子,它做了类似于我所说的(他们还有其他例子):

https://github.com/CartoDB/cartodb.js/blob/develop/examples/layer_selector.html

您不能在 cartodb 中运行允许您以任何方式修改数据的查询 - 您只能运行允许您检索数据的查询。 所以我仍在思考摆脱这个引号字符的最佳方法是什么。

不要在客户端生成 SQL...曾

话虽如此,如果要使用动态查询,最好转义用户输入并将其绑定到服务器端的预准备语句。

如果您发布有关哪个数据库(MySQL,Postgres等)以及用于服务器处理的语言的更多详细信息 - 您将获得更好的答案。

是的。。。我完全知道这并不能回答这个问题。不过,没有人应该以这种方式创建代码。

编辑:将警告放大以强调。

我看到其他人已经回答了,但我想从几个角度来解决这个问题。

你问的问题是一个很好的问题。 您认识到 SQL 不适用于单引号。 你意识到有些东西需要逃避。 这些是一些注意事项的良好起点,希望这些注意事项将帮助您以安全且可维护的方式构建软件。

  1. 永远不要直接执行客户端代码/内容 - 从客户端生成SQL或任何类型的代码/指令(javascript,字节码,编译代码)总是一个糟糕的主意,因为它破坏了一些关键概念。

    • 它很难维护,因为您无法完全控制输入。 当然,您可以转义 SQL,但这并不能解决您有其他未考虑字符的奇怪情况。
    • 它不安全 - 您与变量、输入、CGI 参数、文件内容、值来自上述列表的数据库字段或来自远程系统的任何内容的关系,远程用户永远无法信任。 始终检查、清理和验证输入。 我可以打开页面的源代码,查看您在哪里添加单引号检查并更改它,然后执行代码以删除您的记录,如果某些存储过程可用,请发送电子邮件,在 SQL 后端运行代码,删除数据库(假设查询在适当的权限下运行。
    • 它混合/模糊了客户端输入/显示和业务逻辑之间的界限。 研究 MVC、n 层开发和其他概念,了解将业务逻辑与显示/输入分离的概念。 这不仅对于可扩展性和性能至关重要,而且对于减少此类问题的变化导致严重的安全漏洞也至关重要。
  2. 从坏人的角度处理你的软件开发 - 而不是"我怎样才能转义这个字符串以使其工作",尝试"我如何绕过此页面上的转义以允许我删除记录,查看我应该查看的内容等。

  3. 不要因为方法错误而感到难过,从中吸取教训。 我看到很多关于你永远不应该这样做的评论(他们是对的),但我们中的许多人都以艰难的方式吸取了这一教训。 我们嘲笑Little Bobby Tables,因为我们都编写过或不得不支持这样做的代码。 关键是要理解为什么这是一个坏主意的基础,然后在设计软件时使用它。 欢迎来到硬敲学校。 我们都是毕业生,值得庆幸的是,您可以从我们的评论中学习,而不是当有人修补和破坏,删除或渗透您的数据库和应用程序时。

为了让您开始这段旅程,我建议您阅读以下内容:SQL 注入说明

作为额外的奖励 XSS,例如转义源自外部系统或人的输出。 例如,包含Hi!!! <script>alert('Thanks to this site not escaping this output I get to run this code under your login. Thanks for the 4000 crates of free tshirts you just ordered for me');</script> how are you???的注释条目,以便在输出它时

得到
Comments:Hi!!! <script>alert('Thanks to this site not escaping this output I get to run this code under your login.  Thanks for the 4000 crates of free tshirts you just ordered for me');</script> how are you???

哪个是"有效"的 HTML,浏览器将执行它。

最后的想法 - 采用座右铭信任但验证,你会没事的

供参考,CartoDB不允许您执行更改表中某些内容的查询,它是只读的。

首先将数据发送到您的服务器,然后使用 addslashes() 命令转义所有需要转义的字符(前提是您使用的是 PHP)。

PHP 上的 addslashes() 命令

完成轻松字符后,您可以使用他们的 API 和您的 API 密钥将数据发送到 cartoDB。

cartoDB确实通过其SQL API提供插入/更新/删除任务。 请参阅此链接:

http://developers.cartodb.com/documentation/sql-api.html