如何转义 SQL 查询的单引号,用于在 cartodb 数据库中的 javascript/jquery 中生成的查询
How do I escape SQL query's single quotes for query generated in javascript/jquery in cartodb database?
我正在使用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 不适用于单引号。 你意识到有些东西需要逃避。 这些是一些注意事项的良好起点,希望这些注意事项将帮助您以安全且可维护的方式构建软件。
-
永远不要直接执行客户端代码/内容 - 从客户端生成SQL或任何类型的代码/指令(javascript,字节码,编译代码)总是一个糟糕的主意,因为它破坏了一些关键概念。
- 它很难维护,因为您无法完全控制输入。 当然,您可以转义 SQL,但这并不能解决您有其他未考虑字符的奇怪情况。
- 它不安全 - 您与变量、输入、CGI 参数、文件内容、值来自上述列表的数据库字段或来自远程系统的任何内容的关系,远程用户永远无法信任。 始终检查、清理和验证输入。 我可以打开页面的源代码,查看您在哪里添加单引号检查并更改它,然后执行代码以删除您的记录,如果某些存储过程可用,请发送电子邮件,在 SQL 后端运行代码,删除数据库(假设查询在适当的权限下运行。
- 它混合/模糊了客户端输入/显示和业务逻辑之间的界限。 研究 MVC、n 层开发和其他概念,了解将业务逻辑与显示/输入分离的概念。 这不仅对于可扩展性和性能至关重要,而且对于减少此类问题的变化导致严重的安全漏洞也至关重要。
-
从坏人的角度处理你的软件开发 - 而不是"我怎样才能转义这个字符串以使其工作",尝试"我如何绕过此页面上的转义以允许我删除记录,查看我应该查看的内容等。
-
不要因为方法错误而感到难过,从中吸取教训。 我看到很多关于你永远不应该这样做的评论(他们是对的),但我们中的许多人都以艰难的方式吸取了这一教训。 我们嘲笑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
- 在窗体中间单击按钮查询数据库
- Php菜单查询数据库并显示文本/链接
- Javascript 刷新查询数据库
- 在调用 ajax 和查询数据库时遇到问题
- ajax sql 和 PHP 查询数据库并返回结果
- 您如何确保在使用猫鼬时仅在我们完成连接后才查询数据库
- 查询数据库并在同一页面上显示结果
- Hexo:如何在插件中查询数据库
- Ajax和PHP:SELECT查询数据库
- 使用Ajax查询数据库
- ECONNRESET一行查询数据库两次写错误[Node.js]
- 查询数据库中的所有文档,而不是查询mongoose中的任何特定集合
- 如何通过javascript(或JQuery)点击查询数据库
- 图表不显示值/使用ajax绘制图表/如何通过查询数据库绘制图表
- 下拉菜单更改后查询数据库,然后输出到表单
- 如何查询数据库而不重新加载网页
- 为HTML超链接创建查询数据库的函数
- 如何使页面上的Javascript可以使用MSSQL查询数据,而无需再次查询数据库
- Sails.js通过外键查询数据库
- 直接从javascript查询数据库