经过几个小时的研究以确保Ajax请求安全,我来到了PHP Session
。我生成一个令牌并将此值传递给会话,如下所示:
session_start();
$token = "test".rand(1,10);
$_SESSION['token'] = $token;
这显然是一个测试场景。我的令牌已加密并以不同方式生成。我使用此会话从表单到同一服务器中的外部文件进行XMLHttpRequest echoes
我想让管理员看到的一些文本。包含文本的文件具有此网址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调用,然后是请求来自哪里,最后它比较了令牌。我以link参数的形式将令牌传递给外部php文件,因此来自http://127.0.0.1:8888/demo-site/content?token=xxx的$_GET["token"]
。
我曾经检查用户是否已登录,如果true
,则检查用户是否为管理员,如果还是true
,则echo
内容。可能是这样,如果以session_start()
及其各自形式的php代码 ONLY 向以管理员身份登录的用户显示,则会增加额外的安全层。
我的意思是,如果黑客想要访问外部文件的内容,他必须首先破解管理员的密码,然后是令牌?
我假设没有会话,如果没有人以管理员身份登录而且内容没有显示。我不想基于令牌依赖此文件的安全性,但用户也必须是管理员。
或者黑客是否可以访问该文件的内容,如果他知道什么是令牌,无论用户是否以管理员身份登录?
我指的是,黑客知道令牌,但没有session_start()
。我已经考虑了很多,但我不确定这个假设是否正确。
答案 0 :(得分:2)
我认为你过分复杂了。 PHP具有良好的会话安全性 - 请参阅http://php.net/manual/en/session.security.php并实施其中推荐的设置。 " session.hash_function"特别重要,并且意味着会话令牌无法被破解'或者猜到了。
一般来说,酿造自己的安全系统代替普遍使用的安全系统是一个坏主意。除非你真的知道自己在做什么,否则在PHP Sessions之上添加新的安全层可能是不明智的。
首先,使用SSL。这样可以保护您的传输数据。接下来,不要将GET用于令牌或密码,因为这会将它们暴露给代理和服务器日志。管理员登录后,会收到一个安全的PHP会话令牌作为cookie。 PHP透明地使用此cookie来使用session_start()获取会话。在会话变量中,您已定义了例如$ _SESSION [' admin'] = 1,这意味着此会话是管理员。访问管理员数据时,请检查$ _SESSION [' admin'] == 1。
客户对自己的安全负责。你不能对此做任何事情(除了使用像MFA这样的动态内容)。我的意思是:如果客户的计算机遭到入侵,任何黑客都可以密钥登录凭证,或读取cookie等,所以你做服务器端的任何东西都是可以破解的。您可以添加图层和安全层,但它很臃肿。
这可以被黑客攻击吗?是的,如果黑客可以访问客户端计算机。但是一切都可以被黑客入侵。如果客户端计算机上没有泄露,SSL会保护通信。