繁体   English   中英

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

[英]asp.net, c#, User provided Connection string and Query

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

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

我对此有一些严重的安全问题,并想知道如何保护此页面,以便我们阻止用户指向localhost数据库或其他类型的黑客,这些黑客可以使他们能够访问我们的数据库。 任何人都可以建议吗?

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

此外,还会针对某些不应允许的关键字检查它们提供的查询。 同样,我认为如果没有正确实施,这将留下很多开放。 (我们基本上希望它们只能从自己的DB中进行SELECT)。

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

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

谢谢!

在不了解您所处情况的所有细节的情况下,我认为您的方法不一定是最好的。 “通常”您的数据库服务器不会暴露给全世界,它位于防火墙后面,并且不允许来自外部世界的直接连接。 将使用您的网页的人可能也将他们的数据库放在防火墙后面,因此,即使没有尝试做任何恶意的事情,您的网络服务器将无法直接连接到他们的数据库服务器,因为它可能在其后面自己的防火墙 他们必须要将它暴露给世界,要么知道服务器的IP地址,以便在防火墙中挖出一个洞以允许服务器连接。

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

如果您必须直接连接到客户端的数据库,那么我会执行以下操作来增强安全性。

首先是将主机名解析为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。

还要确保该地址无法解析为您自己的公共地址。

第二件事至少只是因为这个功能不使用可信连接。 而是使用用户名/密码并在数据库上分配该用户的安全权限,以尽可能完成上传数据的任务。 并且在导入数据时仍然使用参数化调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM