我编写了一些JavaScript来在asp.net应用程序中执行ajax调用。这会触发一个调用URL的方法,在POST中发送一些参数。
接收页面处理数据并更新我们的数据库。
我们将向客户提供此代码,以便他们在结帐流程中向我们发送每笔交易所需的数据。
有人能告诉我是否有办法防止未经授权访问此网址?否则,不道德的开发人员可以使用此URL将数据添加到数据库中,而不应该将数据添加到数据库中。
感谢您的任何指示。
这里的问题是我将向客户提供代码,他们将把它添加到他们的网站。因此,除了在他们的网站上添加几行代码之外,我没有选择执行任何更复杂的操作。
但是,代码需要以某种方式安全地向我们的服务器发送数据吗?
这是不可能的情况,还是我需要在处理完成后进行某种审核?
谢谢大家的一些好建议。
答案 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服务。