我正在研究将托管在“Internet上”而不是LAN上的服务器上的Web应用程序。AJAX安全性和用户管理
该应用程序使用相当多的AJAX调用,并具有约12个函数的ajax处理程序文件。
我的问题是,不要问任何人在这里写AJAX安全教程,有没有人知道任何可以帮助我保护这些文件的好资源(网站,书籍,任何)。
现在,只要您知道变量名称就可以从数据库中自由获取数据。
我在想也许会话验证,或沿着这些行登录用户的东西。
无论如何,如果你有任何好的资源,我会自己做作业。
感谢
我正在研究将托管在“Internet上”而不是LAN上的服务器上的Web应用程序。AJAX安全性和用户管理
该应用程序使用相当多的AJAX调用,并具有约12个函数的ajax处理程序文件。
我的问题是,不要问任何人在这里写AJAX安全教程,有没有人知道任何可以帮助我保护这些文件的好资源(网站,书籍,任何)。
现在,只要您知道变量名称就可以从数据库中自由获取数据。
我在想也许会话验证,或沿着这些行登录用户的东西。
无论如何,如果你有任何好的资源,我会自己做作业。
感谢
AJAX调用通常用于访问网络服务,这是它似乎使用的是他们在这里。如果是这种情况,那么您需要关注的是您使用的服务器端脚本语言提供的安全层(看起来就像您使用PHP的问题标签一样)。
就像您对网站上的其他页面进行身份验证和保护的方式一样,这些页面不能通过您可以为Web服务实现的AJAX调用进行访问。例如,如果您需要对您的应用程序进行身份验证,那么您可以将用户的ID存储在$ _SESSION中。从那里你可以检查,以确保用户通过$ _SESSION登录,只要你的一个Web服务被请求。
这里是一个很好的资源。 Securing Ajax Applications: Ensuring the Safety of the Dynamic Web
但是,一个非常简单的方法是使用带有私钥的MD5散列。例如USER_NAME + PRIVATE_KEY。如果您知道网站/登录名上的用户名,则可以将该密钥提供给设置为JavaScript变量的MD5哈希值。然后,只需在您的AJAX请求中传递用户名,REST服务就可以采用相同的私钥和用户名,并比较两个哈希值。您只需发送一个散列,然后输入用户名。它简单而有效。除非你有一个简单的私钥,否则几乎不可能逆转。
因此,在你的JavaScript,你可能有这一套:
var user='username';
var hash='925c35bae29a5d18124ead6fd0771756'
然后,当你发送请求发送这样的事情:
myService.php?user=username&hash=925c35bae29a5d18124ead6fd0771756&morerequests=goodthings
当你选择了它,在服务你会做这样的事情
<?php
if(md5($_REQUEST['user']."_privatekey")==$_REQUEST['hash']){
echo 'passed validation';
}else{
echo 'sorry charlie';
}?>
显然你需要使用PHP或东西els e用私钥生成散列,但我认为你得到了一般想法。 _privatekey应该是复杂的,如果你有一个巨魔试图破解它。
我之前编写了一个哈希程序,并且正在考虑尝试找到某种类型的哈希数据来使其不太可猜测..我会明天也要阅读这些资源。感谢您的意见。 – guyfromfl
我经常看到AJAX调用检查X-REQUESTED-WITH
HTTP头以“验证”请求源自AJAX。根据您发送AJAX呼叫的方式(使用XmlHttpRequest
或JS库),您可以使用此标头的标准值,也可以将其设置为自定义值。这样一来,你可以做类似这样的PHP中的东西是否与AJAX请求的页面:
http://davidwalsh.name/detect-ajax
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
需要注意的是,因为它是一个HTTP标头,它是可以被欺骗是很重要的,所以它绝不是完整的证明。
你是什么意思?“现在,只要你知道变量名就可以从数据库中自由地获取数据。” –
也可以在使用ajax访问的文件上使用PHP'$ _SESSION'标识,只需确保将'session_start()'放在php文件的顶部 –
@Johnny您可以发出一个假请求并发送它到ajax_file.php?id = 32122&动作=删除(用于演示目的),它会删除行32122或任何...我还没有使它验证请求来自哪里.. – guyfromfl