如何阻止外部http请求? (确保AJAX通话)

时间:2012-05-17 14:43:27

标签: ajax security http ring

我想使用post来更新数据库,并且不希望人们手动执行,也就是说,只能通过客户端中的AJAX实现。在这种情况下是否有一些众所周知的加密技巧?

假设我发出了一个GET请求,要求site.com/adduser/<userid>将新用户插入我的数据库。有人可能通过发出虚假请求来填补我的数据库。

8 个答案:

答案 0 :(得分:6)

在这种情况下,无法避免伪造请求,因为客户端浏览器已经拥有了发出请求所需的一切;对于恶意用户来说,只需要进行一些调试就可以弄清楚如何向后端发出任意请求,甚至可能使用自己的代码来简化它。你不需要“加密技巧”,你只需要混淆,这只会使伪造有点不方便,但仍然不是不可能。

答案 1 :(得分:3)

可以实现。
每当您呈现一个应该发出此类请求的页面时。生成随机令牌并将其存储在会话(针对经过身份验证的用户)或数据库中(如果此请求是公开允许的话) 而不是致电site.com/adduser/<userid>来电site.com/adduser/<userid>/<token> 无论何时您收到此类请求,如果令牌有效(来自会话或数据库)
如果令牌正确,请处理请求并从session / db中删除使用过的令牌 如果令牌不正确,请拒绝该请求。

答案 2 :(得分:2)

  

我真的不需要限制对服务器的访问(尽管那会很棒),我正在寻找一种加密技巧,让服务器知道什么时候来自应用程序并且不是由用户使用嗅探令牌。

你不能这样做。这几乎是客户端/服务器应用程序的基本问题之一。这就是为什么它不起作用:假设您有一种方法让您的客户端应用程序向服务器验证自己 - 无论是密码还是其他方法。应用程序所需的信息必须是应用程序可访问的(密码隐藏在某处,或其他任何地方)。但是因为它在用户的计算机上运行,​​这意味着他们也可以访问这些信息:他们所需要的只是查看源,二进制或应用程序与服务器之间的网络流量,最终他们会弄明白您的应用程序进行身份验证和复制的机制。也许他们甚至会复制它。也许他们会写一个聪明的黑客来让你的应用程序做繁重的工作(你总是可以向用户发送虚假的用户输入)。但无论如何,他们都获得了所需的所有信息,并且没有办法阻止他们拥有它也不会阻止你的应用程序拥有它。

答案 3 :(得分:1)

Prevent Direct Access To File Called By ajax Function似乎解决了这个问题。

你可以(除了其他解决方案,我敢肯定)......

  • 使用会话管理(登录创建会话);
  • 向客户端发送一个唯一的密钥,该密钥在到期之前需要返回(不能 被重复使用,以后不能存储使用);
  • 和/或设置标题,如链接的答案。

但如果人们努力尝试,任何事情都可能被欺骗。唯一完全安全的系统是任何人都无法访问的系统。

答案 4 :(得分:1)

这与CSRF的问题相同 - 并且解决方案是相同的:在AJAX请求中使用您以前存储过的eslewhere(或者可以重新生成,例如通过使用sessin id作为密钥加密参数) 。 Chriss Shiflett对此有一些明智的注释,并且有OWASP project用于检测带有PHP的CSRF

答案 5 :(得分:1)

这是一些授权问题:只有授权的请求才会导致创建新用户。因此,当收到此类请求时,您的服务器需要检查它是否来自有权创建新用户的客户端。

现在主要问题是如何决定授权的请求。在大多数情况下,这是通过用户角色和/或某些票务系统完成的。使用用户角色,您将需要解决其他问题,例如用户标识和用户身份验证。但是,如果已经解决了这个问题,您可以轻松地将用户映射到 Alice是管理员 Bob是常规用户等角色,并且只有管理员才有权创建新用户。

答案 6 :(得分:0)

它的工作方式与其他任何网页一样:登录验证,请检查引荐来源。

答案 7 :(得分:0)

解决方案是将粗线添加到ajax请求中。您还应该查看基本身份验证,这不是唯一的保护程序。您可以从ajax页面中获取这些代码的收入

Ajax Call

function callit()
{
 if(window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();}else{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
 xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4&&xmlhttp.status==200){document.getElementById('alp').innerHTML=xmlhttp.responseText;}}
 xmlhttp.open("get", "call.asp", true);
 **xmlhttp.setRequestHeader("X-Requested-With","XMLHttpRequest");**
 xmlhttp.send();
}

PHP / ASP请求页面答案

ASP

If Request.ServerVariables("HTTP_X-Requested-With") = "XMLHttpRequest" Then
 'Do stuff
Else
 'Kill it
End If

PHP

if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) )
{
 //Do stuff
} else {
 //Kill it
}