是Ajax令牌“;更多”;如果会话仅在管理员登录时启动,则安全


Is Ajax token "more" secure if session is ONLY started on admin login?

经过数小时的研究以确保Ajax请求的安全性,我遇到了PHP Session。我生成一个令牌并将此值传递给会话,如下所示:

session_start(); 
$token = "test".rand(1,10);
$_SESSION['token'] = $token;

这显然是一个测试场景。我的令牌是以不同方式加密和生成的。我使用这个会话从表单向同一服务器中的外部文件发出XMLHttpRequest,echoes是我只想让管理员看到的一些文本。包含文本的文件具有以下url http://127.0.0.1:8888/demo-site/content,如下所示:

session_start();
if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    if (@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == "http://127.0.0.1:8888/demo-site/ajax") {
        
        if ($_GET["token"] == $_SESSION["token"]) {
            echo "Successful";
        }
    }
}

正如您从上面的代码中看到的,它首先检查它是否是AJAX调用,然后检查请求来自哪里,最后比较令牌。我以链接参数的形式将令牌传递给外部php文件,因此$_GET["token"]来自http://127.0.0.1:8888/demo-网站/内容?token=xxx。

我曾经检查用户是否登录,如果是true,则检查用户是否是管理员,如果也是true,则检查内容为echo。如果执行session_start()及其相应形式的php代码ONLY显示给以管理员身份登录的用户,这会增加额外的安全层吗。

我的意思是,如果黑客想访问外部文件的内容,他必须首先破解管理员的密码,然后再破解令牌吗

我假设,如果没有人以管理员身份登录,并且只是内容没有显示,则不会启动会话。我不想依赖这个基于令牌的文件的安全性,但用户也必须是管理员。

或者,如果黑客知道令牌是什么,无论用户是否以管理员身份登录,他都可以访问文件的内容吗

我指的是,黑客知道令牌,但没有session_start()。我已经考虑了很多,但我不确定这个假设是否正确。

我认为你把事情搞得过于复杂了。PHP具有良好的会话安全性-请参阅http://php.net/manual/en/session.security.php并实现那里推荐的设置。"session.hash_function"特别重要,这意味着会话令牌不能被"破解"或猜测。

一般来说,用自己的安全系统来代替常用的安全系统是个坏主意。在PHP会话之上添加新的安全层可能是不明智的,除非你真的知道自己在做什么。

首先,使用SSL。这将确保您的数据在传输过程中的安全。接下来,不要对令牌或密码使用GET,因为这会将它们暴露给代理和服务器日志。一旦管理员登录,他们就会收到一个安全的PHP会话令牌作为cookie。PHP透明地使用此cookie来使用session_start()获取会话。在会话变量中,您定义了例如$_session['admin']=1,这意味着此会话是admin。访问Admin数据时,请检查$_SESSION['Admin']==1。

客户对自己的安全负责。你对此无能为力(除了使用像MFA这样的动态功能)。我的意思是:如果客户端的计算机被泄露,任何黑客都可以键入登录凭据或读取cookie等,所以你在服务器端所做的任何事情都是可以被黑客攻击的。你可以添加一层又一层的安全性,但这是膨胀的。

那么这会被黑客入侵吗?是的,如果黑客可以访问客户端计算机。但是所有的东西都可能被黑客入侵。如果客户端计算机上没有漏洞,SSL将保护通信。