Как защитить проход и установить идентификатор сеанса?

Я использую uploadify, и скрипт (который использует Adobe Flash) создает новый сеанс вместо использования текущего при запросе URL-адреса действия загрузки. Чтобы исправить это, мне нужно передать идентификатор сеанса.

Есть ли способ сделать это без фиксации сеанса разрешения (угона)?

Вот некоторые подробности проблемы: Сеансы и загрузка

Спасибо!


person Keyne Viana    schedule 04.11.2010    source источник


Ответы (1)


Создайте временный сеанс загрузки в своем скрипте (непроверенный, но вы понимаете, что можете иметь несколько разных сеансов):

<?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 при загрузке).

person Wrikken    schedule 04.11.2010
comment
Здесь у пользователя все еще виден идентификатор сеанса, но используется ли он только для действия загрузки, верно? Чего я не понял, так это того, как это предотвратит захват сеанса, поскольку он будет отображаться в коде. Если сессия перехвачена, пользователь все еще не может войти в систему, поскольку это не настоящая сессия (используется для входа в систему), но он может отправлять файлы. Единственная хитрость, которую я здесь вижу, это флаг «загрузить». Но в этом конкретном случае пользователь может отправить много файлов без перезагрузки всей страницы (это то, что делает uploadify). - person Keyne Viana; 05.11.2010
comment
Кроме того, допустим, что пользователь вошел на страницу загрузки, сеанс был сгенерирован, а затем он по какой-то причине ждет, в этот момент кто-то, кто перехватил сеанс, может отправлять файлы. Это правильно? Я что-то упускаю? - person Keyne Viana; 05.11.2010
comment
Ваша точка зрения была session-fixation, что будет предотвращать (т. Е. Если кто-то будет отправлен на URL-адрес с определенной записью/получением var, это не будет идентификатор сеанса его/ее сеанса, вошедшего в систему). Однако, если вы обслуживаете страницу через не-HTTPS, все ставки сделаны, и да, угонщик может видеть идентификатор сеанса для загрузки, но опять же: он также может видеть файл cookie сеанса в это время, так что он может быть зарегистрировался по-настоящему. Наличие его в HTML на самом деле не менее безопасно, чем в заголовке, и его так же легко взломать. Дело в том, что это предотвращает перехват сеанса путем фиксации, а не другие виды перехвата. - person Wrikken; 05.11.2010
comment
Итак, когда session_id через URL-адрес включен без https, у меня всегда будут проблемы? - person Keyne Viana; 05.11.2010
comment
Без HTTPS у вас всегда будут проблемы, независимо от того, какую схему аутентификации и сеанса вы используете, будь то через URL, POST или COOKIE по умолчанию. Тот факт, что вы не видите заголовки файлов cookie в своем браузере по умолчанию, не означает, что они не отправляются в виде открытого текста по HTTP, как и остальная часть HTML. - person Wrikken; 05.11.2010