1.访问安全性
我们来举个例子,例如:中国移动公司对外提供了一个发送手机短信的WebService接口,并此请求地址已被公开。那任何一个客户端都可以请求这个WebService。当这个接口没有验证请求的客户端身份的话,那就意味着任何客户端都可调用此接口进行发送短信。这样移动不亏死才怪。所以它就会在每个客户端请求过来时先验证请求的客户端是否是跟此接口达成了一种合法请求协议的客户端。如果是合法请求则为此请求提供服务,否则对请求一概否决。
那我们如何来判断这些请求中哪些是合法、哪些是非法呢?以本人对WebService的开发,总结了以下比较好的三种方式验证,并每种验证处于不同安全级别,也可说不同使用场合。
1.级别:低
public bool SendSms( string authString, string mobiles, string smsContent, DateTime? sendTime, ref string error)
{
// 根据客户端发送的验证码进行根服务器的验证码进行匹配
if (authString != " 980017891ff67cf8a20f23aa
{
// 不是合法客户端请求时,将拒绝对此请求提供服务
error = " 非法请求,验证身份失败 ";
return false;
}
// 如果是合法请求,则继续为此请求提供服务
using (SmsFacade smsFacade = new SmsFacade())
{
if (!smsFacade.SendSms(smsContent, mobiles, sendTime))
{
error = smsFacade.PromptInfo.CustomMessage;
return false;
}
}
return true;
}
2.级别:中上
具体说明:我们可以将合法请求的客户端IP保存在服务端(可存入数据库等方式保存),当客户端发送请求过来时,可根据客户端的IP在服务端保存的IP中验证是否为合法请求。例如:
/// 发送短信服务
/// </summary>
/// <param name="mobiles"> 接收的手机号码 </param>
/// <param name="smsContent"> 短信内容 </param>
/// <param name="sendTime"> 发送时间,为空则立刻发送 </param>
/// <param name="error"> 当请求失败时的详细失败原因 </param>
/// <returns></returns>
[WebMethod(Description = " 发送短信 ")]
public bool SendSms( string mobiles, string smsContent, DateTime? sendTime, ref string error)
{
// 根据客户端请求的IP进行跟服务端所配置的IP进行验证(IP可配置在文件中或数据库)
if (Context.Request.UserHostAddress != " 218.18.69.86 ")
{
// 不是合法客户端请求时,将拒绝对此请求提供服务
error = " 非法请求 ";
return false;
}
// 如果是合法请求,则继续为此请求提供服务
using (SmsFacade smsFacade = new SmsFacade())
{
if (!smsFacade.SendSms(smsContent, mobiles, sendTime))
{
error = smsFacade.PromptInfo.CustomMessage;
return false;
}
}
return true;
}
3.级别:高
使用场合:提供第三方平台使用,完全开发性
验证方式:身份登陆验证
具体说明:我们可以在服务端建一张第三方用户信息表,包含用户账号和密码等相关信息。客户端请求时,必须将账号和密码发送到服务端进行登陆,来验证是否为合法请求。例如:
public bool SendSms( string userCode, string userPwd, string mobiles, string smsContent, DateTime? sendTime, ref string error)
{
// 先根据客户端发送用户账号和密码登陆
UserFacade userFacade = new UserFacade();
if (!userFacade.Login(userCode, userPwd))
{
// 登陆失败,将拒绝对此请求提供服务
error = " 非法请求,登陆失败 ";
return false;
}
using (SmsFacade smsFacade = new SmsFacade())
{
if (!smsFacade.SendSms(smsContent, mobiles, sendTime))
{
error = smsFacade.PromptInfo.CustomMessage;
return false;
}
}
return true;
}