保护远程ajax方法调用

时间:2009-02-02 14:58:59

标签: javascript ajax security

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

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

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

有人能告诉我是否有办法防止未经授权访问此网址?否则,不道德的开发人员可以使用此URL将数据添加到数据库中,而不应该将数据添加到数据库中。

感谢您的任何指示。


这里的问题是我将向客户提供代码,他们将把它添加到他们的网站。因此,除了在他们的网站上添加几行代码之外,我没有选择执行任何更复杂的操作。

但是,代码需要以某种方式安全地向我们的服务器发送数据吗?

这是不可能的情况,还是我需要在处理完成后进行某种审核?

谢谢大家的一些好建议。

7 个答案:

答案 0 :(得分: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 :(得分:1)

您应该使用SSL保护您的服务

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

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

答案 2 :(得分:1)

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

POST页面或处理程序只需检查所需的凭据 - 如果丢失或不正确,您只能返回权限错误。

答案 3 :(得分:0)

您是否可以登录您的接收页面,用户已登录,即

if User.IsAuthenticated

答案 4 :(得分:0)

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

答案 5 :(得分:0)

抱歉,我无法添加评论,因为我还没有足够的恢复。

我不完全理解你的问题。您是否询问开发人员是否提供用户名/密码来决定滥用网络服务?

如果是这种情况,您可能希望在系统中包含某种日志记录。 (事实上​​,无论如何,你都应该这样做。)

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

在验证了用户正在发送的数据的权限后,您还可以在MyWebMethod函数中添加一些内容。通过这种方式,您可以知道发送者的时间,地点,地点以及发送的内容。如果您想加倍努力,您甚至可以在进行任何更新之前记录数据。这将使您能够回滚任何恶意更改。

答案 6 :(得分:0)

假设下列内容:

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应用程序的域外进行调用,您将知道登录的用户,并且您正在查看和访问ws端点。

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