使用Windows客户端应用程序防止跨站点请求伪造攻击

时间:2014-06-19 08:19:52

标签: c# asp.net security asp.net-web-api asp.net-web-api2

我通过web api2开发了一个Web应用程序。

我的客户端应用程序是由C#,。net 4.0开发的Windows应用程序。 客户端应用程序将一些Json数据发送到Web api应用程序,应用程序将数据存储在数据库中。

现在的问题是使用除我的应用程序之外的其他方法发送请求并将转储数据发送到服务器。我在服务器上进行了身份验证,但这还不够,我需要一些令牌来处理这个问题。

经过一些搜索后,我找到this article并阅读它,但客户端是一个Web应用程序。 我可以在我的Windows客户端应用程序中使用此方法吗?如何?

2 个答案:

答案 0 :(得分:4)

底线:您不应该这样做。

根据定义,CSRF攻击只会影响跨域共享Cookie的客户端应用程序。例如如果您使用浏览器访问www.bank.com,然后打开另一个标签www.evil.com,如果www.bank.com无法防止CSRF,则www.evil.com可以将表单提交到{{ {1}}当您登录后,通过将请求伪造到转帐单上的www.bank.com form网址来转帐。

如果您的客户端是Windows应用程序,则HTTP客户端不应为您的Web API以外的任何其他服务存储Cookie。

请注意,上述内容仅适用于将cookie用作会话管理机制(即不使用Kerberos,NTLM,Basic Auth等)。

  

。我在服务器上有身份验证,但还不够

这应该足够了,因为攻击者无法伪造对您的API的HTTP请求,因为由于存在不同的Web客户端实例,因此cookie将与受害者的Cookie一起发送。就像在Chrome上登录谷歌,然后在Firefox上访问Google一样 - 您将不会共享相同的登录会话。

当然,使用HTTPS保护您的API,以便在传输过程中对信息进行加密。请注意,这不能防止您的源代码反编译,这是不容易防止的。在一天结束时,您不能信任不受您控制的客户。你可能会很难,但并非不可能阻止某人锻炼或改变发送给你的API。

答案 1 :(得分:1)

跨站点防伪标记是一种身份验证形式。它对发送请求的客户端进行身份验证:客户端必须访问某个页面才能从服务器获取令牌,因此它不能是任何未访问该页面的客户端,而是一些如何将随机数据发送到该服务器。

身份验证的目的是让服务器对客户端进行身份验证(也可以采用其他方式,但暂时不要忘记)。您设置系统时,其他人很难假装成您的Windows窗体应用程序。注意它可能非常困难,但理论上它总是可以伪造。因此,目标是设置一个身份验证,以便攻击者认为发起攻击是不切实际的。

此身份验证不应与身份验证混淆以验证人员用户。它们是不同的。应用程序可以为人类用户提供登录UI,但该应用程序不是您编写的。所以你需要验证两件事:

  1. 请求实际上来自您的应用,如果成功,那么
  2. 人类用户是他声称的人,否则
  3. 拒绝请求