如何阻止外部的http请求? (固定电话AJAX)(How to block external

2019-06-24 13:35发布

我想用后更新数据库,并且不希望人们做手工,也就是说,它应该只通过AJAX可以在客户端。 有一些众所周知的加密伎俩在这种情况下使用?

说我发出GET请求,在插入一个新的用户到我的数据库site.com/adduser/<userid> 有人可能会通过发布虚假请求overpopulate我的数据库。

Answer 1:

有没有办法避免这种情况下,伪造请求,为客户端浏览器已经拥有一切必要措施,使请求; 它只是一些调试恶意用户的问题弄清楚如何使任意请求你的后端,甚至可能使用自己的代码,使其更容易。 你不需要“密码招数”,你只需要模糊处理,而只会使锻造有点不方便,但仍然不是不可能的。



Answer 2:

它可以实现的。
每当你渲染这是应该做出这样的请求的页面。 生成一个随机令牌并将其存储在会话(认证用户)或数据库(如果该请求被允许公开)。
和,而不是调用site.com/adduser/<userid>呼叫site.com/adduser/<userid>/<token>
每当你收到这样的请求,如果令牌是否有效(从会话或数据库)
如果令牌是正确的,处理请求,并从会话/分贝取下旧令牌
如果令牌不正确,拒绝该请求。



Answer 3:

我并不真的需要限制访问服务器(尽管这将是巨大的),我正在寻找一个加密伎俩,将允许服务器知道当事情从应用程序,而不是来自通过使用用户伪造闻令牌。

你不能做这个。 这几乎与客户机/服务器应用程序的基本问题之一。 这也是为什么它不工作:假设你有你的客户端应用程序验证自己到服务器的方式 - 无论它是一个秘密口令或其他方法。 该应用程序需要的信息是必要的应用程序(该密码是隐藏在那里的某个地方,或其他)访问。 但是因为它运行在用户的计算机上,这意味着他们也有机会获得这样的信息:他们需要的是看源,或二进制,或者你的应用和服务器之间的网络流量,并最终他们会找出通过您的应用程序进行身份验证,并将其复制机制。 也许他们甚至会复制它。 也许他们会写一个聪明的黑客攻击,使您的应用程序做繁重的(你可以随时发送伪造的用户输入的应用程序)。 但不论如何,他们已经得到了所有需要的信息,也没有办法从拥有它,不会也有它阻止你的应用程序阻止他们。



Answer 4:

防止直接访问文件,称为阿贾克斯功能似乎为解决这一问题。

您可以(其它解决方案之一,我敢肯定)...

  • 使用会话管理(登录创建一个会话);
  • 发送一个唯一的密钥到需要它到期之前要返回的客户端(不能被重新使用,并且不能被存储以供以后使用);
  • 和/或设置头作为链接的答案。

但是,任何事情都有可能,如果人们足够努力被欺骗。 唯一的完全安全的系统是其中之一,没有人可以访问的。



Answer 5:

这是同样的问题CSRF - 和解决方案是一样的:在你perviously存储eslewhere AJAX请求(或可再生,例如,通过使用sessin id作为一个关键的参数加密)使用的令牌。 CHRISS Shiflett有这方面的一些明智的笔记,有一个OWASP项目与PHP检测CSRF



Answer 6:

这是一些授权问题:应导致建立一个新用户的唯一授权的请求。 所以接到这样的要求时,你的服务器需要检查是否从被授权创建新的用户客户端的。

现在主要的问题是如何确定被授权有什么要求。 在大多数情况下,这是通过用户的角色和/或一些售票系统完成。 随着用户角色,你将有更多的问题需要解决,如用户身份和用户身份验证。 但是,如果已经解决了,你可以很容易地将用户映射到角色就像爱丽丝是一个管理鲍勃是一个普通用户和管理员只被授权创建新用户。



Answer 7:

它的工作原理就像任何其他网页:登录验证,检查引用。



Answer 8:

该解决方案是增加粗线到Ajax请求。 你也应该看看基本的身份验证,这将不会是唯一的保护者。 你能赶上这些代码的收入从您的AJAX页面

AJAX调用

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
}


文章来源: How to block external http requests? (securing AJAX calls)