2011-11-03 77 views
1

我正在研究将托管在“Internet上”而不是LAN上的服务器上的Web应用程序。AJAX安全性和用户管理

该应用程序使用相当多的AJAX调用,并具有约12个函数的ajax处理程序文件。

我的问题是,不要问任何人在这里写AJAX安全教程,有没有人知道任何可以帮助我保护这些文件的好资源(网站,书籍,任何)。

现在,只要您知道变量名称就可以从数据库中自由获取数据。

我在想也许会话验证,或沿着这些行登录用户的东西。

无论如何,如果你有任何好的资源,我会自己做作业。

感谢

+0

你是什么意思?“现在,只要你知道变量名就可以从数据库中自由地获取数据。” –

+0

也可以在使用ajax访问的文件上使用PHP'$ _SESSION'标识,只需确保将'session_start()'放在php文件的顶部 –

+0

@Johnny您可以发出一个假请求并发送它到ajax_file.php?id = 32122&动作=删除(用于演示目的),它会删除行32122或任何...我还没有使它验证请求来自哪里.. – guyfromfl

回答

0

AJAX调用通常用于访问网络服务,这是它似乎使用的是他们在这里。如果是这种情况,那么您需要关注的是您使用的服务器端脚本语言提供的安全层(看起来就像您使用PHP的问题标签一样)。

就像您对网站上的其他页面进行身份验证和保护的方式一样,这些页面不能通过您可以为Web服务实现的AJAX调用进行访问。例如,如果您需要对您的应用程序进行身份验证,那么您可以将用户的ID存储在$ _SESSION中。从那里你可以检查,以确保用户通过$ _SESSION登录,只要你的一个Web服务被请求。

+0

哇,好的,比我想象的要简单多了。我将在明天开始体验... – guyfromfl

+0

并更正服务器端php – guyfromfl

0

这里是一个很好的资源。 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应该是复杂的,如果你有一个巨魔试图破解它。

+0

我之前编写了一个哈希程序,并且正在考虑尝试找到某种类型的哈希数据来使其不太可猜测..我会明天也要阅读这些资源。感谢您的意见。 – guyfromfl

0

我经常看到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标头,它是可以被欺骗是很重要的,所以它绝不是完整的证明。