如何保护传递和设置会话ID?

时间:2010-11-04 20:59:24

标签: php jquery session uploadify session-hijacking

我正在使用uploadify,并且脚本(使用adobe flash)会在请求上传操作网址时创建新会话,而不是使用当前会话。要解决这个问题,我需要提前传递会话ID。

如果没有允许会话固定(劫持),有没有办法做到这一点?

以下是问题的一些细节: Sessions and uploadify

谢谢!

1 个答案:

答案 0 :(得分:2)

在您的脚本中创建一个临时上传会话(未经测试,但您可以了解能够拥有多个不同的会话):

<?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设置一个标记)。