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并不是一个好习惯....
如果你在脚本中有查询,从数据库中获取一些数据,或者......不要忘记根据你需要的数据来清理输入和转义输出,以防万一...