保护ajax请求

时间:2010-04-22 16:50:58

标签: ajax security session

我有一个网站使用会话cookie来保证安全。它工作正常,但是现在任何ajax请求都不安全。例如,假设用户在页面上。如果他们使用会话登录,他们只能访问此页面 - 到目前为止一切顺利。但现在他们要求的ajax请求是

ajaxpages/somepage.php?somevar=something&anothervar=something

如果任何其他用户自己决定只去那个链接(没有会话),他们仍然会获得与登录人员相同的ajax输出。

所以显然我必须在发送ajax请求时传递会话数据。有没有人提出最好的方法呢?我以前从来没有这样做过,宁愿使用可靠的方法而不是自己制作。

5 个答案:

答案 0 :(得分:5)

ajax请求的工作方式与您网站的任何其他请求一样,并且应该返回与非Ajax请求相同的会话cookie。这在this question中有所指出。如果您没有获得会话cookie,可能还有其他错误。

答案 1 :(得分:4)

拥有ajax输出不一定是漏洞。这完全取决于传输的数据。我不确定您使用的是哪个平台,但大多数Web应用程序开发平台都有一个会话变量,可以在请求之间维护状态。

所具备的内容是将用户标记为从服务器端登录的方式。我的php看起来像:

if(login($user,$password)){
   $_SESSION['logged_in']=true;
}

然后,如果允许他们访问该页面,您可以签入一个头文件:

if(!$_SESSION['logged_in']){
   header("location: http://127.0.0.1/");
   die();
}

(如果未设置变量,则也为假。)

您需要记住一些事项。这是一个漏洞:

if(!$_COOKIE['logged_in']){
   header("location: http://127.0.0.1/");
   die();
}

用户可以控制$ _COOKIE,这样他们就可以告诉您他们已登录。

另一个漏洞:

if(!$_COOKIE['logged_in']){
   header("location: http://127.0.0.1/");
}

header()不会终止脚本。实际上它仍然运行,所以它仍然会输出,但它不会显示在浏览器中,你仍然可以使用netcat / telnet / wireshark来查看数据。

答案 2 :(得分:2)

在处理ajax请求的页面上使用相同的安全检查。

答案 3 :(得分:2)

由于这是一个PHP页面,我不明白为什么你不能在PHP端执行身份验证。如果验证成功,则发回数据。否则,发回错误消息。 AJAX与任何其他请求没有什么不同。

答案 4 :(得分:0)

让ajax携带会话cookie,没有问题,但你必须检查用户是否在最后登录,并且你可能想为你的请求添加一些CSRF令牌,以防万一。 ..

并尝试验证引荐来源,以便您可以检查请求是否是从您的网站和您的网站发送的,让用户在浏览器中打开ajax的请求网址并不是一个好习惯.... / p>

如果你的脚本中有查询,要从数据库中获取一些数据,或者......不要忘记根据所需的数据类型,再次清理输入并转义输出以防万一......