3

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

像这样的东西:

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

storeName当用户从​​ html 中选择时通过 jquery 生成)

所以什么时候 storeName“杰克逊熟食店”这样的查询运行得很好。

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

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

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

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

编辑:哎哟!通常,是的,我意识到在客户端生成查询的危险。
所以这里有更多的上下文。我正在使用cartodb并遵循他们的文档。这是他们的回购中的一个示例,它与我正在谈论的类似(他们也有其他示例):

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

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

4

5 回答 5

5

不要在客户端生成 SQL ......永远

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

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

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

编辑:为了强调而使警告更大。

于 2013-09-06T14:39:37.367 回答
2

FYI, CartoDB does not allow you to execute a query that changes something in the table, it's read-only.

于 2013-09-06T15:39:05.563 回答
2

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

你问的问题很好。您认识到 SQL 不适用于单引号。你意识到有些事情需要逃避。这些是一些考虑因素的良好起点,有望帮助您以安全和可维护的方式构建软件。

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

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

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

为了让您开始这一旅程,我建议您阅读以下内容: SQL 注入解释

作为XSS的额外奖励 ,例如转义源自外部系统或人的 OUTPUT。例如一个评论条目,它包含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,浏览器将执行它。

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

于 2013-09-06T15:06:37.623 回答
0

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

PHP 上的 addlashes() 命令

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

于 2013-10-20T13:20:06.090 回答
-1

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

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

于 2013-12-18T13:37:55.430 回答