【问题标题】:Safe Javascript/Sql connection安全的 Javascript/Sql 连接
【发布时间】:2018-08-20 14:37:52
【问题描述】:

我正在尝试使用 HTML/CSS 和 Javascript 创建一个简单的网站。基本上,用户应该能够在文本字段中输入数字并使用按钮“发送”。当按钮被按下时,我想运行一个 Javascript 函数来搜索 sql 数据库中的数字。 创建所有这些东西对我来说应该不是一个大问题,但我不知道如何在 JS 和 SQL 之间创建安全连接。我已经读到与 javascript 的直接连接是非常不安全的。

有人推荐使用java或者c#来建立sql连接。那将如何运作?基本上只是一个 Javascript 代码,它运行一个 java/c# 应用程序(它建立一个 sql 连接)并返回所需的 sql 数据? 还听说可以用node.js创建sql连接,这样安全吗?还是其他方法更合适?

问候

【问题讨论】:

  • 您需要任何服务器端语言(包括 Node.js)的服务器端代码。
  • 使用 JavaScript 连接 SQL 并不是不安全的。但是使用在客户端运行的代码(可能是 JavaScript)直接连接到您需要任何人都不知道的登录数据的服务是不安全的,因为您无法在客户端隐藏此类登录数据。跨度>
  • 无论后端系统如何,都不应盲目地从用户输入中构建 SQL 字符串。
  • 同意@SLaks,你需要某种服务器端应用程序。永远不要直接公开数据库。
  • 你唯一能做的就是使用服务器端的方法(网络服务、微服务等),期间!任何答案都是浪费时间。

标签: javascript


【解决方案1】:

我已经读到与 javascript 的直接连接是非常不安全的

危险在于让客户直接访问您的数据库。 JavaScript 最常在 Web 浏览器的客户端运行,因此要访问数据库,您必须在数据库服务器上为浏览器(以及访问者)提供用户名和密码,并让它们运行原始 SQL。

这有很多可能的安全风险,不值得。

(顺便说一句:您不能使用浏览器端的 JavaScript 建立任意套接字连接,因此无论如何都不可能从它连接到大多数数据库服务器)。


如果你想将数据暴露给在 web 浏览器中运行的 JavaScript,那么标准的方法是编写一个 webservice。

您可以使用您喜欢的任何编程语言(包括 JavaScript)编写 Web 服务。它侦听 HTTP 请求,从中读取数据,可能执行 authn/authz,查询数据库(应用有据可查的防御 SQL 注入 攻击)并返回结果(通常格式为 JSON )。

因此,客户端 JavaScript 只需使用在查询字符串或请求正文中传递的参数发出 HTTP 请求(例如使用 XMLHttpRequest 或 fetch),并处理从它返回的数据。

【讨论】:

    【解决方案2】:

    使用客户端 javascript 连接到数据库非常不安全,因为 javascript 需要知道登录详细信息。由于客户端 javascript 在客户端,因此任何用户都可以以纯文本形式查看登录详细信息。

    最好的方法是在服务器上创建一个 web 服务。单击该按钮时,它将使用输入的数字作为参数向 Web 服务发出 GET/POST 请求。几乎可以使用任何语言制作的 Web 服务将创建与数据库的连接并插入行本身。

    【讨论】:

    • JavaScript 可以运行在服务器端(nodejs),并不是客户端专用的语言。
    • Nitpick:如果您的 Javascript 是在服务器上运行的 node.js,那并不是不安全的。问题是从用户控制的环境(浏览器)直接不受限制地访问数据库。
    【解决方案3】:

    虽然我建议使用网络服务路线,因为这样更容易确保安全。除非你有一个非常好的系统并且准确地理解你在做什么,否则使用 javascript 到数据库是非常危险的;但是如果你真的想这样做并且有一个需要它的应用程序,那么可以使用与 CouchDB 连接的 PouchDB。

    PouchDB 在本地运行,可以通过 HTTP 与 CouchDB 同步。

    https://pouchdb.com/ https://couchdb.apache.org/

    这里有一个答案,讨论 pouchDb 与 couchDb 同步的基本安全性。基本上,每个人都需要单独的登录凭据,并且永远不应将凭据存储在页面代码中。 PouchDB security

    pouchDB 有一些巧妙的用途:https://pouchdb.com/users.html

    【讨论】:

    • 我投了赞成票,这是以某种创新的方式正确回答了这个问题。同时建议仍坚持传统方式。
    • @Halcyon 只是好奇。 “除非你有一个非常好的系统并且准确地理解你在做什么”你会如何看待这种情况?我认为如果 javascript(或任何其他代码)在客户端运行,那么数据库连接永远不会安全。也许在一个只有被允许访问数据库的人才能访问的专用网络上。但我认为这仍然是一个糟糕的设计
    • 我设想的工作方式是他们需要在客户端输入自己的凭据,因此您有单独的用户(由 CS 手动创建或在不同的进程或服务中以某种方式分离)对于任何需要访问它的人。如果您真的需要为了方便返回,您可以将它们存储在本地存储中 - 但是在页面中通过网络加载任何类型的凭据对于面向公众的站点来说都是一场灾难,完全同意。
    • 我可能无论如何都不会这样做,即使有可能,因为开发人员很容易不小心滑倒并做一些可怕的事情(无论是原来的人还是下一个人谁维护它...)最好将其分开。尽管 PouchDB 列表确实包含需要离线访问的医疗用户之类的东西,但我很难想到任何应用程序都不会从仅拥有后端中受益。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多