关于安全性:保护ajax请求

Securing an ajax request

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

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

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

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


ajax请求的工作方式与您网站上的任何其他请求一样,并且应该返回与非ajax请求相同的会话cookie。这个问题指出了这一点。如果您没有获得会话cookie,可能还有其他错误。


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

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

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

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

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

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

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

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

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

另一个漏洞:

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

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


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


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


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

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

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