2009-02-02 86 views
2

我编写了一些JavaScript以在asp.net应用程序中执行ajax调用。这会触发一个调用URL的方法,在POST中发送一些参数。保护远程ajax方法调用

接收页面处理数据并更新我们的数据库。

我们将向客户提供此代码,以允许他们在每次交易的结帐过程中向我们发送我们所需的数据。

任何人都可以告诉我是否有办法阻止未经授权访问此URL?否则,一个不择手段的开发人员可能会使用这个URL将数据添加到我们的数据库中。

感谢您的指点。


这里的问题是我会向客户提供代码,他们会将其添加到他们的网站。所以我没有选择比向他们的网站添加几行代码更复杂的选项。

虽然代码需要执行一个数据发送到我们的服务器,以某种方式安全?

这是不可能的情况,还是在处理发生后我需要进行某种审计?

谢谢大家的一些很好的建议。

+1

为什么你需要使用Javascript和AJAX做到这一点?为什么不只是为您的客户提供服务,然后将他们的代码与服务端集成到服务器端。这样,您可以选择任何有意义的认证机制。 – laz 2009-02-02 15:24:43

回答

3

您可以使用SOAP通过请求传递用户名/密码。应该使用SSL来加密通过线路传输的数据。下面是一些代码,我们使用:

这是将持有与该请求一起发送证书类:

Imports System.Web.Services.Protocols 
Public Class ServiceCredentials 

Inherits SoapHeader 

Private _userName As String 
Public Property UserName() As String 
    Get 
     Return _userName 
    End Get 
    Set(ByVal value As String) 
     _userName = value 
    End Set 
End Property 


Private _password As String 
Public Property Password() As String 
    Get 
     Return _password 
    End Get 
    Set(ByVal value As String) 
     _password = value 
    End Set 
End Property 

Public Sub New() 

End Sub 

Public Sub NewUserInfo(ByVal ServiceUser As String, ByVal ServicePassword As String) 
    Me.UserName = ServiceUser 
    Me.Password = ServicePassword 

End Sub 

添加属性到您的Web服务的定义:

<WebMethod()> _ 
<SoapHeader("CredentialsHeader")> _ 
    Function MyWebMethod(ByVal paremetersPassed as String) 
    'check permissions here 
    If PermissionsValid(CredentialsHeader) then 
    'ok! 
     ....... 
    else 
     'throw a permission error 
    end if 
End Function 

然后从那里,只需创建一个函数(在我的例子,PermissionsValid)检查权限:

Function PermissionsValid(byval Credentials as ServiceCredentials) as boolean 

    'check Credentials.Username and Credentials.Password here and return a boolean 
End Function 

这可能看起来像一堆工作,但通过这种方式,当他们发送请求时,可以根据数据库或其他任何你想要的方式来检查它。您也可以在最后关闭用户名。

更简单的方法是限制允许访问服务页面的IP地址。但是,那么你遇到IP地址变化等问题。

顺便说一句,这很多都是因为我做了这个帖子,所以你可能需要检查代码,以确保它编译。 :)

1

你应该确保你的服务使用SSL

编辑:我忘了最“基本”:HTTP验证(使用登录/密码) 我找到了一个链接,但它从2003年:http://www-128.ibm.com/developerworks/webservices/library/ws-sec1.html

编辑2:正如评论中所说,我认为这里的问题符合REST Web服务的目的......我对asp.net一无所知,但您应该期待REST教程,并看看您从HTTP身份验证到完整的WS-Security实施

+0

SSL加密流量,但对授权没有影响。 – 2009-02-02 15:07:24

0

您可以检查y我们接收的页面是用户已登录,即

if User.IsAuthenticated 

0

您的域名是否都是您的客户?
如果不是,您将无法使用XMLHttpRequest对象从其站点发送数据。 XHR受Same Origin Policy的约束。
您可以在iframe中从服务器发布到页面。您需要提示用户输入用户名和密码,以便这些详细信息不会暴露在您的脚本中,并且目标应该通过ssl提供。

1

像往常一样设置用户登录系统 - 即用户登录时,在会话或cookie中存储用户名和密码散列。

POST页面或处理程序可以简单地检查所需的凭据 - 如果丢失或不正确,则可以返回权限错误。

0

对不起,我不能添加评论,因为我还没有足够的重复。

我不完全理解你的问题。你问你是否给了用户名/密码的开发者决定滥用网络服务?

如果是这种情况,您可能需要在系统中包含某种日志记录。 (实际上,无论如何,你应该可以这么做)。

你可以在PermissionsValid函数中写入一些条目到某种日志(文件,事件日志,sql表等)中。这可以显示IP地址和用户名以及完成时间戳的时间戳。通过这种方式,您可以查看是否有人试图“黑客入侵”。

在验证记录用户发送的数据的权限后,您还可以在MyWebMethod函数中添加某些内容。通过这种方式,您可以知道是谁发送的,何时发送的。如果你想多走一步,你甚至可以在更新之前记录数据。这将使您能够回滚任何恶意更改。

0

假设follwing:

Browser <-(1)-> ASP/.NET App (`https://123.com/app`) <-(2)-> Web Service (`https://456.com/ws`) 

1)保护经由证书交换+基本认证使用SSL的web服务。这样你就知道唯一允许的消费者是.net应用程序。

2)在.net应用程序上创建代理,如https://123.com/webservicecall,将您的请求转发给Web服务。

通过这种方式,您不会在Web应用程序域外拨打电话,您将知道登录的用户,并且您可以通过查看和访问来保护ws端点。

但实际上,它听起来像你不应该使用代理,而是使用ajax和.net应用程序调用.net应用程序,然后直接进行Web服务调用。