C# 如何防止任何人向我的web服务发送请求

C# 如何防止任何人向我的web服务发送请求,c#,xml,web-services,httpwebrequest,C#,Xml,Web Services,Httpwebrequest,我在C#中有一个应用程序,它将一个对象序列化为xml,并将其转换为一个http流发送到我的服务器。服务器有一些php,它在mysql中运行一个存储过程,xml数据是其唯一参数 问题是,有人很容易发送一个相同格式的xml,包含大量的实体,这会用垃圾数据破坏数据库。我有什么办法防止这种情况发生 我对网络请求非常陌生,所以我甚至不知道从哪里开始 您应该使用某种形式的身份验证和授权。在基于SOAP的服务中有扩展。下面是另一个解释这是如何工作的。但是,我不知道PHP方面对这些标准的支持是什么。如果您使用的

我在C#中有一个应用程序,它将一个对象序列化为xml,并将其转换为一个http流发送到我的服务器。服务器有一些php,它在mysql中运行一个存储过程,xml数据是其唯一参数

问题是,有人很容易发送一个相同格式的xml,包含大量的实体,这会用垃圾数据破坏数据库。我有什么办法防止这种情况发生


我对网络请求非常陌生,所以我甚至不知道从哪里开始

您应该使用某种形式的身份验证和授权。在基于SOAP的服务中有扩展。下面是另一个解释这是如何工作的。但是,我不知道PHP方面对这些标准的支持是什么。如果您使用的是某种自定义协议,则只需在请求时发送用户名/密码,并在服务器端进行验证。

我们要求在处理请求之前,将用户名和密码提供给所有输入参数列表,并根据后端用户登录系统进行验证。技术含量低,但对我们有用。

你打算让这个客户在互联网上公开吗?如果是这样,就不可能阻止人们使用不同的软件,因为他们总是可以对应用程序进行反向工程,以了解您使用的是什么安全机制。因此,您唯一的防御措施将是在服务器上彻底验证数据

您可以通过修改客户端以要求使用HTTPS将用户名和密码与数据一起发送到服务器来解决此问题,这样至少您知道是谁造成了损害。但是,如果您有一个更封闭的受众,您可以使用某种客户端证书系统或IP过滤。

我们的解决方案(在这方面我们太天真了)是,我们以非统一的方式在服务器上为每个会话生成一个唯一的密钥(即,很难预测“下一个”值是什么),并将其作为登录过程的一部分提供给客户端代码。然后需要将该值作为第一个参数传回每个请求使用

这可确保:

  • 注销将使身份验证密钥无效
  • 对于web服务请求,不会以明文形式发送用户名和密码
这并不能确保:

  • 只有我们的应用程序代码可以与服务器通信(用户可以拦截请求、复制密钥并生成自己的请求,只要密钥仍然有效)

您将发现,只要用户计算机上的代码与您的服务器通信,您就无法控制该计算机上的代码,只能控制该服务器上的代码。因此,如果用户机器向您发送来自不同程序的请求,这看起来就像是您的代码生成的请求一样,您将很难弄清楚这是怎么回事。

据我所知,客户端是C#,服务器是PHP,当然,在HTTPS上——它仍然容易受到数据包嗅探的攻击吗?@Herbie博士,不,HTTPS不容易受到数据包嗅探的攻击。我曾想过类似的事情,但不确定它会有多有效。如果它有效的话,可能就是我所需要的。Chearsyeah会有很多客户(希望,如果它卖得好的话…)让我想,数据的存储方式,通过擦除单个用户的数据来修复攻击会很简单。我会检查它,我试着用soap来做,但我的头脑不能像暂时的一样去想它,对吗?我考虑过可能在一行中有两个http请求,其中一个只请求一个nonce或像您这样的密钥,它只在短时间内有效,并与xml以及用户和密码一起发送回来。仍然允许有人请求一把钥匙并将其发回,但我想这至少是另一种措施