2

假设我们有一个 WCF Web 服务。其链接如下;

http://www.example.com/service/?api=62383581

62383581 是这里的 API 密钥。我们如何保护服务不被循环通过以找出它的 API 密钥?

4

4 回答 4

3

我认为讨论应该是“如何让它变得困难”而不是阻止它,因为如果你要将你的服务公开给你,你很容易受到攻击。

使其变得困难的可能性可能是:

  • 如果您要向一组密切的客户提供对您服务的访问权限,那么您可以在您的服务器上应用 IP 限制以防止来自任何其他服务的调用,这将再次阻止来自客户端脚本(例如 JavaScript)的任何调用,并将向IP欺骗

  • 您也可以在您的服务中设置 IP 限制。在 Message Inspector 中,您可以验证 IP,如果它不在您的范围内,则抛出异常以防止进一步访问。

  • 使用包含特殊字符的 Alpha Numeric API 密钥,使其非常复杂且难以循环(蛮力)(我可以考虑最适合您的场景)

  • 您可以给您的客户端一个公钥(每个客户端都不同)要求他们附加一些带有密钥的标识符,例如 api&customerID 并用您的密钥对其进行加密,因为在服务器端您拥有该特定客户端的私钥,反之亦然..(这个包含加密解密的开销)

如果你中间有人,那么这可能会影响上述所有内容。这些都是为了让事情变得困难,可能需要根据您的具体情况重新考虑。

于 2011-06-21T09:42:57.340 回答
2

使用 GUID 而不是 Int 使暴力破解变得更加困难。

于 2011-06-22T06:23:30.617 回答
0

我想检查调用者的 IP 地址并阻止同一个 IP 地址每小时拨打超过 n 次电话是没有意义的,因为攻击者会使用欺骗来阻止这种努力。

我能想到的唯一方法是使用可以检测此类攻击的强大的可配置防火墙,或者使用诸如 Winsnort 之类的入侵防御系统 (IPS)。另见http://www.winsnort.com/index.php?module=News&func=display&sid=41

于 2011-06-21T09:04:52.397 回答
0

根据定义,不受信任的客户端程序中包含的任何 API 密钥都可能被泄露。

于 2011-06-21T09:08:19.997 回答