【发布时间】:2011-05-05 07:39:30
【问题描述】:
我正在使用uploadify,并且脚本(使用adobe flash)在请求上传操作url时创建一个新会话而不是使用当前会话。要解决这个问题,我需要提前传递会话 ID。
有没有办法在没有允许会话固定(劫持)的情况下做到这一点?
以下是问题的一些细节: Sessions and uploadify
谢谢!
【问题讨论】:
标签: php jquery session uploadify session-hijacking
我正在使用uploadify,并且脚本(使用adobe flash)在请求上传操作url时创建一个新会话而不是使用当前会话。要解决这个问题,我需要提前传递会话 ID。
有没有办法在没有允许会话固定(劫持)的情况下做到这一点?
以下是问题的一些细节: Sessions and uploadify
谢谢!
【问题讨论】:
标签: php jquery session uploadify session-hijacking
在您的脚本中创建一个临时上传会话(未经测试,但您明白能够拥有多个不同的会话):
<?php
//normal session
session_start();
//store sessionid for retrieval
$oldsessionid = session_id();
if($_SESSION['logged_in']){ //or however you check for a valid user
//stop old/normal session
session_write_close();
//create a new sessionname
$oldname = session_name('UPLOADSESSION');
//create a new id (fixed here, you might want a random number/char combo:
session_id('myuploadsessionid');
//start the session
session_start();
$_SESSION['upload'] = true;
$uploadid = session_id();
//now you can use `'data: "artist="+$fi+"&UPLOADSESSION="'.$uploadid` in uploadify
session_write_close();
}
//return to normal name
session_name($oldname);
//set old session id
session_id($oldsessionid);
//resume normal session
session_start();
所以,在您的接收脚本中:
<?php
session_name('UPLOADSESSION');
session_id($_POST['UPLOADSESSION']);
session_start();
if(isset($_SESSION['upload']) && $_SESSION['upload']){
//accept files
//invalidate session after this upload
$_SESSION['upload'] = false;
}
用户仍然有 2 个 cookie,并且可能 UPLOADSESSION 是固定的,但您不会将它用于上传之后的任何其他内容,并且仅用于 1 个上传(尽管您可能希望允许更多)。
或者,您可以在上传后的第一个请求中调用session_regenerate_id();(只需在上传时在$_SESSION 中设置一个标志)。
【讨论】:
session-fixation,这将被阻止(即:如果某人被发送到具有特定帖子/获取变量的 url,它将不是他/她的会话 ID登录会话)。但是,如果您通过非 HTTPS 提供页面,则所有赌注都是,是的,劫持者可以看到要上传的会话 ID,但话又说回来:他当时也可以看到会话 cookie,所以他可以真实登录。把它放在 HTML 中并不比把它放在你的标题中更安全,而且很容易被劫持。要点是:这可以防止通过固定来劫持会话,而不是其他类型的劫持。
HTTPS,无论您使用哪种身份验证和会话方案,无论是通过 URL、POST 还是默认的 COOKIE,您总是会遇到麻烦。默认情况下,您在浏览器中看不到 cookie 标头这一事实并不意味着它们不会像其他 HTML 一样通过 HTTP 以纯文本形式发送。