asp.net,c#,用户提供的连接字符串和查询

时间:2018-09-23 20:10:05

标签: c# asp.net sql-server security

我们正在尝试创建一个asp.net页面,使我们的用户能够将信息直接从他们自己的数据库中提取到我们的网站。用户将能够提供:

  • 主机名,端口,数据库名称,用户名,密码和查询。

对此,我有一些严重的安全问题,想知道如何保护此页面,以防止用户指向本地主机数据库或其他类型的黑客,使他们能够访问我们的数据库。有人可以请教吗?

我们正在使用SqlConnectionStringBuilder建立与用户数据库的连接,并进行一些简单的检查以确保主机不能是“ localhost”或指向我们服务器的其他地址。我觉得这样做会留下潜在的安全漏洞。

此外,还根据一些不允许的关键字检查了它们提供的查询。同样,我认为,如果实施不当,这将给我们留下很多空白。 (我们本质上希望他们只能从自己的数据库中执行SELECT。)

最后,我们使用用户查询执行EXEC sp_executesql。

我很想听听其他人如何处理这个问题? Klipfolio是一个具有类似类型功能的组织,所以如果有人知道他们如何解决此问题,那真是太棒了!

谢谢!

2 个答案:

答案 0 :(得分:1)

在不了解您情况的所有细节的情况下,我认为您的方法不一定是最好的方法。 “通常”您的数据库服务器不公开,它在防火墙后面,并且不允许来自外部的直接连接。将要使用您的网页的人也可能会将其数据库也置于防火墙后面,因此,即使不尝试进行任何恶意操作,您的Web服务器也将无法直接与其数据库服务器建立连接,因为它很可能位于其背后自己的防火墙。他们可能不得不将其公开,或者知道您服务器的IP地址以在防火墙上戳一个漏洞,以允许您的服务器进行连接。

每当我允许客户端将数据上传到我的服务器时,都是通过文本或csv文件或Excel文件。这使您可以解决客户端上的所有防火墙问题。现在您需要担心数据中的SQL注入攻击。因此,有两件事要做:首先确保在执行INSERT或UPDATE时使用参数,其次是确保正在执行上载的进程对数据库的权限最低。

答案 1 :(得分:1)

如果您必须直接连接到客户的数据库,那么我将做以下事情来增强安全性。

首先将主机名解析为IP地址。

IPAddress[] addresslist = Dns.GetHostAddresses(hostname);

然后检查地址列表中的结果,使它们无法解析为任何私有地址,因为它们在任何情况下都无法连接到客户端。

10.0.0.0至10.255.255.255。 172.16.0.0至172.31.255.255。 192.168.0.0至192.168.255.255。

还请确保该地址不会解析为您自己的公共地址。

第二件事至少是因为该功能不使用受信任的连接。取而代之的是使用用户名/密码,并在数据库上分配该用户的安全权限,以使其最小程度地完成上传数据的任务。并且在导入数据时仍然使用参数化的调用。