【问题标题】:How to connect javascript code to database in ASP.NET如何在 ASP.NET 中将 JavaScript 代码连接到数据库
【发布时间】:2021-04-18 14:09:41
【问题描述】:

我有一个 ASP.NET 应用程序,它一直在通过创建上下文来连接到 SQL Server 2016 数据库来工作。到目前为止,它运行良好,但我的任务是在代码中添加 javascript 以从数据库中检索数据并将其显示给用户。我听说通过 Javascript 直接连接到数据库存在安全风险,因为用户能够看到用户名和密码,所以我想知道是否有直接连接的安全替代方法可以让 Javascript 代码调用服务器端代码并检索数据(以 JSON 格式存储在数据库中)。我知道 AJAX 是如何检索代码并且已经了解了很多关于它的知识,但我不知道如何获取 AJAX 需要运行的连接字符串。我听说 Node.js 可以工作,但我们已经建立了一个服务器,所以我很困惑。任何建议将不胜感激!

旁注:我知道为什么直接连接不好here 已经有很好的解释,但是虽然最重要的答案是“连接到 sql 服务器的更好方法是使用一些服务器端语言,如 PHP 、Java、.NET 等。”他们没有解释如何通过服务器端与 .NET 进行连接

【问题讨论】:

  • “我听说通过 Javascript 直接连接到数据库存在安全风险,因为用户可以看到用户名和密码” - 更好的理由是因为您实际上看不到。在网页中运行的 JavaScript无法连接到数据库服务器,因为 JavaScript 无法创建 TCP Socket 连接。
  • 您也不会公开您的数据库让随机的人看到 - 您的数据库应该位于防火墙后面,并且只有来自防火墙内部的其他连接才能访问它。另外——如果 JavaScript 可以对数据库做任何它想做的事情......你不认为攻击者可能会利用它并发出他们想要的任何 SQL 命令吗? UPDATE USERS SET PASSWORD = 'haha'UPDATE PRODUCTS SET PRICE = 1 浮现在脑海中。
  • 一般来说,当您有代码需要与服务器端交互时,您会编写一个 HTTP API(或 REST API)。这可能在 Node 中,但您提到这已经是一个 ASP.NET 站点。微软有 ASP.NET Web API。这会暴露 HTTP 端点供您的客户端代码调用,并且它能够与数据库交互,因为它位于您的防火墙内。 Web API 将处理身份验证和授权,以确保客户端不能只是做他们想做的事,而是只能做你授权他们做的事..
  • 您提到了 ASP.NET,但没有提及您使用的是 WebForms 还是 MVC?

标签: javascript asp.net json .net database


【解决方案1】:

在处理这类事情时,一般的想法是延迟加载数据,以便页面加载速度更快。为此,您首先加载 UI,然后获取数据(通过使用 JavaScript 完成的 AJAX 调用)。

考虑到这一点,一般来说,你会做这样的事情:

  1. 根据您使用的技术,在您的 Web 表单或控制器中编写一个方法,该方法无需调用加载数据即可加载页面。它只是用占位符加载 UI。
  2. 在 UI 端,一旦加载了 DOM,就会触发一个 JavaScript 函数。此函数将调用后端的另一个方法,该方法将提供填充 UI 所需的数据(如果您愿意,甚至可以提供 HTML)。此调用将使用回调函数,当从服务器接收到数据时将触发该回调函数。然后,此函数将使用数据填充 UI。
  3. 回到您的 Web 表单、控制器、Web 服务、Web API 或您决定托管数据检索逻辑的任何位置,您将编写一个服务于 JS AJAX 调用的方法。然后,此后端方法将使用安全存储在您的 Web 应用程序中的连接字符串调用(服务器端)数据库并检索数据,然后将其传递回调用 JS 函数,然后触发前面提到的回调并填充 UI。

那里有很多示例,因为这是当今常见的设计模式。你可以找到一个here

【讨论】:

  • 我实际上从同事那里找到了我正在寻找的答案并将其发布。不过感谢您的帮助!
【解决方案2】:

我实际上在这里找到了我正在寻找的解决方案(由同事建议):

https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/

如果链接失效,解决方案是使用 Microsoft 的 Web API 2 与 ASP.NET 和 EntityFramework。通过在 Visual Studio 中创建模型和控制器,您可以使用 JavaScript 中的 RouteConfig 访问中定义的路由创建可以通过 AJAX 访问的上下文,如下所示:

var ViewModel = function () {
var self = this;
self.books = ko.observableArray();
self.error = ko.observable();

var booksUri = '/api/books/';

function ajaxHelper(uri, method, data) {
    self.error(''); // Clear error message
    return $.ajax({
        type: method,
        url: uri,
        dataType: 'json',
        contentType: 'application/json',
        data: data ? JSON.stringify(data) : null
    }).fail(function (jqXHR, textStatus, errorThrown) {
        self.error(errorThrown);
    });
}

function getAllBooks() {
    ajaxHelper(booksUri, 'GET').done(function (data) {
        self.books(data);
    });
}

// Fetch the initial data.
getAllBooks();

};

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 好点。在一个答案中添加所有内容太多了,但我确实添加了足够多的内容,以便其他人有机会解决问题(或至少知道要寻找什么)以防链接失效。
猜你喜欢
  • 2020-02-13
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2018-09-22
  • 1970-01-01
相关资源
最近更新 更多