我需要使用 C# 让计算机通过网络进行通信。网络上说要使用套接字。
网络上还说,有很多恶意的人愿意给我们一半的机会来搞砸我们的工作,而通过开放端口,我们给了他们一半的机会。
在 Windows 7/8/Server 2012 机器上使用 .NET 4.5、C# 中的套接字会引入哪些漏洞,如何最好地缓解这些漏洞?
什么是危险的?开放端口真的可以让恶意黑客破坏我们的工作吗?
虽然@jwd 在他所说的大部分情况下是正确的,但在许多情况下,通过沙盒或其他安全层限制网络应用程序的访问权限的概念可能既不可行也不可取。
网络应用程序的最大问题是它们如何处理(或无法处理)网络流中的格式错误的数据。99% 的时间(或大约)这是因为创建网络代码的开发人员很懒惰。时期。
网络黑客的圣杯是远程代码执行。在这方面,过去有两种相当成功的主要方法:
传统上,最大的问题是缓冲区溢出。
当您使用 C# 的托管对象时,这不太可能成为问题。您必须非常努力地使 C# 应用程序容易受到这种类型的攻击。自从 C 中单个堆栈上的静态缓冲区的美好时光以来,我们已经走了很长一段路。
紧随其后的是各种注入攻击的问题。
阅读一般的SQL 注入和代码注入。始终绝对确定您正在检查用户提交给您的系统的每一个值,如果有疑问,请始终拒绝问题消息。
文件系统访问。
鉴于对任意路径的访问,攻击者可能能够将文件上传到可以执行的位置。如果您允许上传,请始终确保它们只能到达特定文件夹或一组文件夹。
当然,还有代码执行设计。
这是您的代码被设计为允许远程代码执行但没有得到充分保护以限制恶意内容的地方。无论如何,这通常是一个坏主意,但如果您必须允许这样做,请确保您的安全性尽可能强大。
在代码执行之后,安全漏洞是下一个大问题。您可以找到许多关于敏感数据通过安全性差的系统泄露的新闻报道,而且大多数情况下是因为系统的“安全性”特别差。
端到端加密(例如通过 SSL)在您可能传输敏感数据时是必须的……包括用户名和密码。数据包嗅探器可以监视未加密的数据流并提取登录详细信息。假设您对实际的敏感登录数据进行哈希处理...如果我使用该确切的哈希值登录自己会发生什么?
有很多这样的问题,你必须做很多阅读才能掌握这一切。例如,SQL 注入攻击会让您非常头疼。
最后,当所有其他方法都失败时,攻击者可能会满足于仅仅关闭您的系统。当您的网络代码失败时,请确保它会优雅地这样做。
故事的寓意:
一个开放的端口只有在监听它允许的情况下才危险。
通常,最薄弱的环节是您的应用程序,而不是底层库。
当然可能存在以下问题:
但大多数情况下,当恶意数据到达时,事情会变得很糟糕
当然,最后一个完全取决于您的应用程序的性质。
例如,如果您的应用程序监听任意命令,例如在服务器上运行程序,那么攻击者基本上可以执行您的应用程序有权执行的任何操作 - 删除文件等。
降低风险的一种方法是在操作系统级别为您的应用程序提供非常小的权限。这样,受感染的应用程序就无法删除系统文件。
另一种降低风险的方法是在沙盒环境中运行您的应用程序,例如 chroot 或 FreeBSD 监狱。这也取决于操作系统。
简而言之,有些事情可能会超出您的控制范围(例如:操作系统漏洞),还有其他事情,更有可能是您的应用程序出现问题。有一些方法可以减轻这种风险。