1

假设我构建了一个 Web 服务,以及一个调用该 Web 服务的客户端应用程序。

有什么办法可以阻止我以外的其他软件调用网络服务?

例如,想象一个游戏,玩家可以通过点击一个图标来获得一些钱,该图标每小时只能使用一次。如果用户已连接,那么。如果用户没有连接,他会“松开”获取钱的时间窗口。

在标准的 Web 服务 + 客户端中,任何青少年都可以轻松构建脚本/假应用程序来执行 Web 服务。

我怎样才能避免这种情况?我知道没有神奇的解决方案,但至少,我怎样才能提高编写此类工具的难度?

PS:我正在使用 Microsoft .Net 平台 + SilverLigth,但我觉得这个问题比 MS 技术更广泛。

[编辑]澄清一下,我不问如何添加身份验证,而是问如何避免用户自动调用 Web 服务。没有什么可以阻止拥有帐户的用户使用其帐户来自动执行呼叫;例如,我想要避免的是拥有一个具有实际身份验证的假应用程序,而不是每 5 秒执行一次用户输入。在游戏中,这样可以避免农夫机器人

4

2 回答 2

0

您会希望服务器更加了解游戏状态。例如,在您概述的情况下,服务器应该知道那个钱图标是否在屏幕上供用户点击。当收到“点击钱”的请求时,它应该检查钱是否真的在屏幕上。也许只需为每个用户添加一个“最后一次点击金钱”变量就足够了。但这将允许机器人“点击钱”,即使他们不在游戏中,尽管您可以限制频率。也许你可以选择更强大的东西。比如在屏幕上显示金钱图标时,包含一个随机键值(GUID 或类似的东西),您可以通过有效调用将其发回,以验证他们是否实际点击了实际显示在其屏幕上的真实货币图标,而不是仅点击货币图标,您确切地知道他们在点击什么。这使得编写脚本更加困难,因为他们必须查看游戏的内存内容以确定附加到金钱图标的 GUID 并将其与请求一起提交。这仍然是可能的,尽管要困难得多。

于 2011-06-15T14:00:26.653 回答
0

WCF Web 服务方法可以使用安全要求进行修饰。这包括 Silverlight 的 RIA 服务(基本上只是 WCF 服务)。

您可以要求基本身份验证,甚至要求用户必须是特定角色的成员才能使用特定方法。

这当然意味着您的应用程序必须使用身份验证(即用户必须登录)。

替代方案是提供您自己的身份验证系统(例如使用令牌),但这仍然需要应用程序(至少)首先登录到服务以获取新令牌。

[编辑]在回答您的后续行动时,机器人检测通常是记录呼叫之间的持续时间或平均持续时间,如果超出限制则简单地禁止访问。(或者如果您真的很刻薄,请取消他们的帐户或开始返回垃圾数据)

于 2011-06-15T12:52:10.653 回答