我想使用post来更新数据库,并且不希望人们手动执行,也就是说,只能通过客户端中的AJAX实现。在这种情况下是否有一些众所周知的加密技巧?
假设我发出了一个GET请求,要求site.com/adduser/<userid>
将新用户插入我的数据库。有人可能通过发出虚假请求来填补我的数据库。
答案 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
}