安全的Javascript/Sql连接

安全的Javascript/Sql连接,javascript,Javascript,我试图用HTML/CSS和Javascript创建一个简单的网站。基本上,用户应该能够在文本字段中输入一个数字,并用一个按钮“发送”。当按下按钮时,我想运行一个Javascript函数,在sql数据库中搜索数字。 创建所有这些东西对我来说应该不是什么大问题,但我不知道如何在JS和SQL之间创建安全连接。我读到,与javascript的直接连接是非常不安全的 有些人建议使用java或c来构建sql连接。那怎么办?基本上只是一个Javascript代码,运行java/c应用程序(构建sql连接)并返

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

有些人建议使用java或c来构建sql连接。那怎么办?基本上只是一个Javascript代码,运行java/c应用程序(构建sql连接)并返回所需的sql数据? 还听说可以使用node.js创建sql连接,这样安全吗?还是另一种方法更合适


问候语

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

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

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

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

这可能会带来很多安全风险,不值得这么做

(旁白:您不能使用浏览器端JavaScript进行任意套接字连接,因此无论如何都不可能从它连接到大多数数据库服务器)


如果您想将数据公开给在web浏览器中运行的JavaScript,那么标准方法是编写web服务

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


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

尽管我建议使用webservice路由,因为这样更容易确保安全。在数据库中使用javascript是非常危险的,除非您有一个非常好的系统,并且完全了解自己在做什么;但是,如果您真的想这样做,并且有一个需要它的应用程序,那么可以使用与CouchDB连接的PockDB

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

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


PockDB有一些巧妙的用途:

您需要任何服务器端语言(包括Node.js)的服务器端代码。使用JavaScript连接SQL并不是不安全的。但是,使用在客户端运行的代码(可以是JavaScript)直接连接到您需要的登录数据不应该被任何人知道的服务是不安全的,因为您不能在客户端隐藏此类登录数据。您不应该盲目地从用户输入构建SQL字符串,而不管后端系统如何。同意@SLaks,您需要某种服务器端应用程序。你永远不应该直接公开数据库。你唯一能做的就是使用服务器端方法(Web服务、微设备等),没错!任何答案都是浪费时间。JavaScript可以在服务器(nodejs)上运行,并且不是专门在客户端上使用的语言。挑剔:如果您的JavaScript是在服务器上运行的node.js,这并不不安全。问题是从用户控制的环境(浏览器)直接不受限制地访问数据库。我投了赞成票,这以某种创新的方式正确地回答了这个问题。同时建议仍然坚持传统方式。@Halcyon只是好奇而已。“除非你有一个非常好的系统,并且确切地了解你在做什么”,你会如何看待这种情况?我认为,如果javascript(或任何其他代码)运行clientside,那么数据库连接永远不会安全。可能是在一个只有人有权访问数据库的私有网络上。但这仍然是一个糟糕的设计,我认为我所设想的工作方式是,他们需要在客户端输入自己的凭据,因此您有单独的用户(由CS手动创建或在不同的流程或服务中以某种方式分离),供需要访问它的任何人使用。如果你真的需要的话,你可以将它们存储在本地存储中,以方便返回--但是,对于一个面向公众的网站来说,在页面中通过网络加载任何类型的凭据都是灾难,我完全同意。尽管我可能无论如何都不会这样做,即使这是可能的,因为开发人员很容易不小心滑倒并做一些可怕的事情(不管是原来的人还是下一个维护它的人…),所以最好把它分开。我很难想象任何应用程序仅仅拥有一个后端都不会带来好处,尽管PockDB列表中确实有一些东西,比如需要离线访问的医疗用户。