确定,
我开发了这个WinForms客户端,它通过WCF调用与服务器(ASPX Application)交互。我现在想将服务器部署到我的共享webhost,但我对WCF不熟悉,尤其是它背后的安全可能性。
目标是保护WCF服务,以便不是每个知道或发现端点地址的人都可以调用它。相反,只有我的WinForms客户端必须能够调用WCF服务。
我不需要基于用户进行身份验证,因此客户端用户无需进行身份验证。 但我只想让这个WinForms客户端的实例能够与服务进行交互。服务器和客户端之间传递的信息不是很敏感,所以它并不是真正需要保护它,但它是一个加号如果它可以很容易地完成。
这是否可以使用共享主机(IIS)环境(不支持HTTPS)?我应该使用哪些绑定和选项?我想wsHttpBinding,但我如何设置安全选项?
使用.NET 4.0
由于
答案 0 :(得分:3)
根据我的理解,您有一个面向互联网的服务,您希望仅限于您的客户端应用程序才能调用 - 正确吗?或者您是否想要其他客户(如PHP,Ruby等)也希望在某个时候调用您的服务?
为了保护您的邮件,您在WCF中有两个选项 - 邮件或传输安全性。在互联网上,您的客户端和服务之间的跳数不明,运输安全性不起作用 - 您将保留邮件安全性(在邮件通过网络时加密邮件)。为此,您通常会向服务(仅服务器端)添加数字证书,客户端可以发现并使用该证书加密消息。只有您的服务才能解密它们 - 所以您在这方面是安全的。
下一点是:谁可以打电话给你的服务?如果你想对任何人完全开放,那么是的,你需要wsHttpBinding
(或RESTful变体 - webHttpBinding
)。如果你想允许non-.NET客户,你通常限制在不认证(任何人都可以调用),或用户名/密码方案,您将验证在对合法用户的数据库服务器端。
如果您只想允许自己的.NET客户端,那么您可以做几件事:
停用您服务的元数据;这一点,你就“隐藏”您的端点和它们所提供的服务 - 一个人在使用“元数据扫描仪”(如果存在)将无法在您的服务只是绊倒,并找出方法提供然而,等等。这此外,组织外的其他开发人员也无法为您的服务添加服务引用。
您可以定义和使用自定义二进制http绑定 - 只有具有此设置的其他客户端甚至可以调用您的服务。二进制http绑定也会带来一些速度提升。有关如何执行此操作,请参阅此blog post。
您需要以某种方式标识在那些允许呼叫者 - 一个可能的方法是把一个额外的头到你的WCF的消息,您再检查在服务器端。这只会确保发现您的服务并找出二进制http绑定的随意黑客仍然会被拒绝(至少在一段时间内)。有关如何为WCF实现此类消息检查器扩展,请参阅此blog post here。
最终的步骤是在客户端计算机上安装数字证书以及您的服务。然后,您将设置客户端代理,以使用该证书对服务进行身份验证。只有拥有该证书的客户端计算机才能调用您的服务。
这实际上取决于你想要走多远--WCF为你提供了很多选择,但你需要决定你想投入多少努力。
答案 1 :(得分:2)
首先要问自己的是:“如果他们连接了自己的定制客户端,有什么人可以对你的WCF服务做些什么?”查看通过WCF公开的所有功能,并假设可以随意访问它。 您完全无法控制客户端,您将永远无法拥有此功能。
HTTPS非常漂亮,你真的很容易受到OWASP A9: Insufficient Transport Layer Protection的攻击。如果它取决于我,我会转移到一个关心安全的不同主机。如果您通过网络投掷用户名和密码,那么您的用户将处于危险之中。
我在WCF服务中遇到的最大问题之一是它们有一个暴露的“executeQuery()”函数。开发人员允许客户端构建由服务器执行的查询。这种方法存在根本缺陷,因为您只是将数据库交给攻击者。此类漏洞不是SQL注入,它属于CWE-602: Client-Side Enforcement of Server-Side Security。
与CWE-602相同的是OWASP A4: Insecure Direct Object References。攻击者是否可以通过提供不同的用户ID来欺骗您的WCF服务以考虑其他用户?你是否相信客户说实话?
您必须考虑的下一个漏洞分类是OWASP A1: Injection,其他被称为“Taint and Sink”。例如,如果您正在公开一个函数,其中一个参数正在调用CreateProcess()
的{{1}}中使用。此参数可以由攻击者控制,并且对于此变量“受污染”,对cmd.exe
的调用是“接收器”。这些行中存在多种类型的漏洞,包括但不限于; SQL注入,LDAP注入,XPATH注入。这些类型的漏洞会影响所有 Web应用程序。