为什么从Javascript连接SQL数据库是一种不好的做法?

3
根据这个问题,似乎从JavaScript连接SQL数据库被强烈反对并存在安全问题。
请说明具体的问题和原因是什么?

4
在浏览器中使用JavaScript是一个不好的想法,因为:通过“查看源代码”可以查看连接信息或查询内容,并且可以创建自己的查询并删除所有数据。 - epascarello
如果SQL语句是客户端的,那么你的数据库将会对任何选择向你的DB发送任何SQL语句的人敞开大门。 - adeneo
"从JavaScript连接SQL数据库是强烈不推荐的。" 你的意思是:强烈反对吗? - Tim Schmelter
如果我发送查询时附带其(自定义/加密)哈希值,接收方会确保查询未被修改或甚至完全不需要?潜在的入侵者将不知道要使用哪个哈希值来发送他们的“删除所有用户”请求。我曾经看到过这种方法在缩略图URL中使用,其中缩放选项在地址中,而完整大小则在付费墙后面。您可能想更改分辨率以免费获取其中一个,但哈希值不匹配。 - Seedmanc
3个回答

4
delete all_users

不,说真的!你真的想让任何人都可以访问你的数据库并随意编辑吗?如果你只是给予任何人访问权限,那么没有任何方法可以保护访问安全!你的用户名和密码会被暴露,使每个人都能够修改你的数据库。JavaScript 不安全,不能用于保存密码!

用户无法从sqlcmd中运行它吗? - YAKOVM
从网络上来的话,我希望不是这样。否则你应该检查你的DMZ,类似于现在这样的东西。 - Patrick Hofman
1
@Yakov - 你需要一个数据库用户名/密码才能访问数据库。通常情况下,你会将它保存在中间件上。但是如果你的JavaScript访问数据库,你就需要在客户端中使用你的用户名/密码。因此,即使你的防火墙允许访问数据库,凭证也需要保持私密。 - Neil Smithline
2
@lloydm 我很想看到那个发生 ;) - Patrick Hofman
@Yakov:需要更多帮助吗? - Patrick Hofman

3
让我们来分析一下吧。
所以你有一个需要数据的应用程序。这些数据需要从某个地方获取。你可以从SQL数据库中获取这些数据。
现在,虽然SQL具有基于权限的访问等功能,但要正确保护“向公众开放”的东西,你必须将其锁定得非常严格。与其他技术相比,这在SQL中并不特别容易,并且可能会让你暴露于一些风险之中。
SQL服务器是设计为处于封闭环境中的,只有服务器端代码才能与其通信。要从中获取数据,您需要一个用户名/密码。因此,这将必须存储在客户端上。现在你可以获取你的数据了。而且你只会得到你需要的数据。但是,有什么阻止任何真实用户试图获取更多的数据呢?除非你锁定了每个表、每个存储过程和所有其他的东西,否则什么也不能阻止他们。还有,有什么阻止用户窃取整个数据库的呢?根据我对SQL的了解,你无法限制用户获取一定数量的行。
代理服务、Web服务或任何面向公众使用的前端服务提供了一种方法,让你可以过滤或设置访问限制。如果你的应用程序只需要某些数据,那么服务将只提供那些数据。调用是固定的-getUserProfile()。服务器已经知道当前用户,所以它只会获取该用户的详细信息。如果有一个getUserProfile(65),你怎么知道用户“65”是否真的是请求者呢?
SQL不理解cookie或会话变量的复杂性,它只会说“嘿,这里有一个有效的用户名和密码,请给他们所有可以访问的东西!”它并没有设计为仅基于用户返回一行。
因此,总结一下,你不能控制用户可以访问多少数据,所以你使用了一个理解用户应该看到什么的Web服务,并仅提供该信息。
......而这只是从数据库中读取-写入是一种全新的痛苦和折磨。
简而言之,这是一个坏主意。

1
你能否说出:JavaScript在哪里执行? 如果你说:用户的浏览器,那么你的答案是正确的。 因此,您已经向所有使用者发送了带有连接字符串的代码,遍布全球。 许多人不知道如何使用它,但许多人非常了解它。他们有锁和钥匙。 希望这对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接