ASP.NET中的JavaScript Web服务调用:我的实现存在安全问题吗?有没有更好的办法?

时间:2011-12-12 17:32:48

标签: javascript asp.net web-services

我写了一个非常简单的asmx web服务。我在aspx页面中设置了一个脚本管理器,并通过JavaScript调用Web服务。一切都很好:

   function CallMyWebService(sender,args){
        MyClass.WebService1.HelloWorld(args._value.toString(),1,OnSuccess,OnFail,sender._id.toString();  
   }    
   function OnSuccess(returnStringFromWebService,userContext){
        alert(returnStringFromWebService);
   }
   function OnFail(returnString){
        alert(returnString);
   }
...
   public class WebService1: System.Web.Services.WebService
   {
       [WebMethod()]
       public string HelloWorld(string prefixText, int count)
       {
           return prefixText;
       }
   }

问题是类名,asmx文件名和方法名都可以通过“view source”看到。我考虑过RESTful Web服务,但是如果你在项目中放入一个.svc文件(而不是.asmx文件),那么调用是类似的,你可以再次在项目中看到类名等等。

这里有安全问题吗?有没有什么方法可以通过ASP.NET中的JavaScript调用Web服务,而不会暴露这么多?如果RESTful是答案?我希望Web服务(asmx或svc)与aspx文件在同一解决方案中。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

不要过于担心暴露您的API。嗅探器将能够嗅探您的呼叫并自行呼叫。只要确保如果他们自己调用它们,他们只能做他们的用户/会话允许他们做的事情。

答案 1 :(得分:0)

不要担心公开您的服务的网址。没关系。

如果您担心将某些敏感数据暴露给未经过身份验证的人,您可以随时更改您的装饰者:

[WebMethod]

为:

[WebMethod(true)]

这样您就可以在Session来电中引用WebMethod变量了。然后,您可以确保该请求来自成功登录并具有执行该特定WebMethod内所执行的任何操作所需的访问级别的人。

至少,您可以获取当前用户的用户名并将其记录在某处(数据库,日志文件,事件日志等),以便您知道谁正在尝试访问哪些内容。这对于调试WebMethod中的问题很有用,尤其是如果您在同一页面上具有不同权限级别的用户。