我想使用POST方法更新数据库,不希望用户手动操作,即只能通过客户端的AJAX进行。在这种情况下,是否有一些众所周知的密码学技巧可供使用?
比如,我向
比如,我向
site.com/adduser/<userid>
发送GET请求以将新用户插入到我的数据库中。但是,有人可能会通过发出虚假请求来过度填充我的数据库。site.com/adduser/<userid>
发送GET请求以将新用户插入到我的数据库中。但是,有人可能会通过发出虚假请求来过度填充我的数据库。在这种情况下,无法避免伪造请求,因为客户端浏览器已经拥有了发出请求所需的一切;对于恶意用户来说,只需要进行一些调试就可以弄清楚如何向后端发出任意请求,甚至可能使用您自己的代码让它变得更容易。你不需要"加密技巧",你只需要混淆,这只会使伪造变得有些麻烦,但仍然不是不可能的。
site.com/adduser/<userid>
,请调用site.com/adduser/<userid>/<token>
。每当您接收到这样的请求时,请检查令牌是否有效(从会话或数据库中),如果正确,则处理请求并从会话/数据库中删除已使用的令牌;如果不正确,则拒绝请求。请注意保留HTML标记。防止通过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
}
它的工作方式与其他网页相同:登录验证,检查引荐者。