我正试图围绕会话劫持以及使用令牌进行CSRF保护。 我在每个脚本中使用此对象方法来检查会话变量是否已设置或令牌是否与会话令牌匹配。
public function admin_index(){
session_start();
if(!isset($_SESSION["user"]) || $_GET['token']!=$_SESSION['token']) {
header("location: login/login_form.php");
session_destroy();
exit();
}
我是新手,我的问题是: 如果我的会话ID以某种方式被劫持,他将能够在session_start之后的短时间内读取我的变量$ _SESSION ['token'],并且获取会话数据并在$ _SESSION中填充或者它仍然是安全的服务器?
即使获得了有效的会话,会话变量通常也是安全的吗?
别介意$ _GET ['token']而不是POST。我还在努力。
由于
修改
我要问的是。如果一个令牌也帮助我按照我使用它的方式保护我的会话。如果我的脚本中的每个查询,链接或视图都需要一个有效的令牌而且攻击者只获得了我的session_id,那么令牌将成为另一层保护因为他/她需要id和令牌在脚本中执行任何操作,对吗?
即使攻击者获得了我的session_id,令牌在服务器上也是安全的吗?
答案 0 :(得分:2)
会话劫持和CSRF攻击是两个完全不同的事情,一旦有人访问您的会话,他们就是“您”并可以访问您帐户中的所有内容。
CSRF攻击是一种迫使最终用户执行的攻击 在他/她当前的Web应用程序上执行不需要的操作 认证
这是一个社交工程和验证问题,使用令牌显然可以解决,因为可以证明数据是从您的表单合法发送的。使用POST而不是GET会使攻击变得非常困难。
另一方面,会话劫持是有人可以使用你的 会话,成为'你'并使用你的帐户,这将允许他们这样做 无论他们喜欢什么。
一旦恶意用户访问此会话,CSRF攻击几乎无用,因为它不需要。
如果您担心会话ID被劫持,那么您可以采取一些预防措施,例如在将用户会话ID提升到更高级别的访问权限后重新生成用户会话ID。这可以使用session_regenerate_id()PHP函数完成。您还可以检查浏览器的用户代理以检查是否有更改,如果有,则可以简单地要求用户登录并重新生成ID,以便攻击者不知道。显然,他们总是有可能成为同一个用户代理,但它确实显着地限制了风险。诸如SSL / HTTPS之类的加密也是您可能想要查看的选项
有关更多信息,请查看此链接以获取一些示例:http://phpsec.org/projects/guide/4.html。希望这已经解决了你的问题:)
答案 1 :(得分:0)
如果我错了,请纠正我,但我确信你根本无法劫持$_SESSION
值,因为这些值与$_COOKIE
不同,保存在服务器而不是webbrowser中。< / p>
因此他们也无法改变它。他们可以关闭他们的web浏览器来删除它,但不能编辑它。
答案 2 :(得分:0)
会话变量存储在服务器上。他们无法阅读。但是,会话通常可以被攻击者访问另一个用户的会话ID而被劫持,然后可以使用该会话ID来模仿他们(劫持)他们的会话。
CSRF是一个完全不同的问题。 CSRF攻击让用户无意中以类似于xss漏洞的方式执行操作:我可能会发布一个虚假的img链接,其中src实际上是一个url,它将参数传递给您的浏览器代表您运行的脚本。在这种情况下,攻击者只是让您的浏览器发出您不想要的请求。 CSRF保护应该停止,因为用户不知道令牌是什么,因此他们无法将其嵌入到URL中。