【问题标题】:Securing an ajax request保护 ajax 请求
【发布时间】:2011-02-11 04:14:33
【问题描述】:

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

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

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

很明显,当我发送 ajax 请求时,我将不得不传递会话数据。任何人都对这样做的最佳方式有任何提示吗?我以前从未这样做过,我宁愿使用受信任的方法也不愿自己编造。

【问题讨论】:

    标签: ajax security session


    【解决方案1】:

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

    【讨论】:

    • 我需要帮助,避免重复评论,请参考 Rook 的 cmets XD 谢谢kibbee
    【解决方案2】:

    拥有 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 查看数据。

    【讨论】:

    • 我在这里有一个问题,我认为有必要创建新的 SO 问题。 XD 我通常使用退出;。那么在这种情况下,使用 die 更好还是 exit 更好?有什么推荐我读的吗?关于 die 和 exit 之间的区别。谢谢。还有一个,我很困惑,如果只检查用户登录,这是否容易受到 xss 的攻击?因为任何人都可以欺骗登录用户到 xss 站点来获取数据。或者我对 xss 完全错误。再次感谢 Rook XD
    • @Tian Loon 我不知道你在问什么。为什么死亡和退出之间会有区别?还是在回声和打印之间?是的,xss 可以用来劫持会话。我的帖子与xss无关。
    • 哎呀。谢谢,我刚刚找到stackoverflow.com/a/1795031/805373 解释死和退出是一样的。得到它。谢谢Rook
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-25
          • 1970-01-01
          • 2010-10-25
          • 2017-03-13
          • 1970-01-01
          • 1970-01-01
          • 2015-10-06
          • 2011-01-21
          相关资源
          最近更新 更多