2010-10-24 4 views
0

Я довольно новичок в сеансах.PHP-сессии; Как я могу решить эту большую проблему безопасности?

У меня есть сайт для объявлений, и пользователи могут выбрать «ИЗМЕНИТЬ» свои объявления.

Все, что им нужно ввести, это пароль, который они выбрали при создании классифицированных.

На странице "edit.php", если пароль верен, отображаются секретные данные. Существует инструмент загрузки изображений, который перезагружает страницу, но одновременно загружает изображение и просматривает пользователя.

Проблема заключается в том, что при загрузке pic я не хочу, чтобы страница запрашивала пароль снова. (это потому, что перезагрузка страницы) Не так приятно, если для каждой загрузки pic требуется пароль.

Так что я установить переменную сеанса, как это:

if($pass==$row['pass']){ $_SESSION['correct_pass']=1; } 

затем в edit.php на перезагрузку, я проверяю против этого условия:

if($pass==$row['pass'] || $_SESSION['correct_pass']==1){ 
    EDIT AD HERE 
} 

проблема (большая проблема) является то, что после того, как пользователь вводит правильный пароль, создается СЕССИЯ ['correct_pass'] и устанавливается в 1.

После этого пользователь может нажать «назад» в браузере и ввести другой номер объявления в URL-адрес, d Сессия PHP будет считать, что пароль все еще в порядке.

Так, другими словами, можно изменить другие народы, если вы это понимаете.

Как это решить?

Если вам нужно больше ввода, дайте мне знать ...

Ниже приведены несколько строк кода, который дополнительно описывает edit.php файл (не проверено):

//FIRST VISIT TO "EDIT.PHP?ad_id=ID_OF_CLASSIFIED_HERE" 
if($todo==0){ 
    //User is shown 2 radios, and a password form, and choses either to remove classified, or change classified 
} 

//REMOVE CLASSIFIED 
if($todo==1){ 
    //User has chosen to remove a classified 
    if($pass==$row['pass']){ 
     //DELETE CLASSIFIED 
    } 
    if($pass!=$row['pass']){ 
     //SHOW WRONG PASSWORD WARNING 
    } 
} 

if($todo==2){ 
    //User has chosen to change a classified 
    if($pass==$row['pass'] || $_SESSION['correct_pass']==1){ 
     if(!isset($_SESSION['correct_pass'])){ 
      $_SESSION['correct_pass']=1; 
     } 
    //EDIT AD HERE 
    } 
    else { 
    //SHOW WRONG PASSWORD WARNING 
    } 
} 

Благодаря

+0

Чтобы сохранить идентификатор пользователя вместо глупого «1», все проблемы решались. –

ответ

2

Вместо того, чтобы хранить флаг, введенный пользователем правильный пароль или нет, сохраните хэш пароля в сеансе. Затем, когда они пытаются редактировать классифицированные данные, сравните хэш пароля в сеансе с хешем пароля, используемого для создания классифицированного.

Соль пароль с идентификатором пользователя (если он у вас есть), и это должно защищать от столкновений дерьмовых паролей.

+0

Хорошо, звучит хорошо. Выбрав пароль, вы хотите солить хешированный пароль, который хранится в сеансе справа? – 2010-10-24 11:46:46

+0

Простым способом является его компонент хэш-функции, например 'function hash ($ userid, $ password) {return md5 ($ userid. $ Password); } '- обратите внимание, что использование UserID - довольно простой пример. Еще более безопасное решение состоит в том, чтобы генерировать случайное значение соли для каждого пользователя (например, 'Q5%'), поэтому вы добавляете значение соли для пользователя на свой пароль, прежде чем вы его используете. –

+0

Прежде всего, md5 следует использовать, sha1 гораздо более безопасен. Sha256 гораздо безопаснее, чем это. 2-й из всех соления с помощью userid не имеет никакого смысла, соль настолько мала, что общий альфа-цифровой радужный стол собирается сломать ее. – rook

0

Почему не просто хранить список предметов, которые они имеют право на такие, как:

$_SESSION['authorizedPages']['pageID']; 



if (isset($_SESSION['authorizedPages']['pageID']) == false) 
{ 
    echo loginForm; 
} 
else 
{ 
    echo editForm; 
} 
+0

Вы доверяете пользователю никогда не изменять свои переменные сеанса. –

+1

вы уверены, что не думаете о $ _COOKIE вместо $ _SESSION? Сессия хранится локально на вашем сервере, и пользователь не имеет возможности ее изменить. Все, что хранится на их компьютере, - это хэш сеанса, который сообщает вашему веб-серверу (Apache): «Эй, сеанс ABC мой, так загрузите для меня». Если бы это был файл cookie, он мог бы его модифицировать, но изменение их переменной сеанса в основном просто дало бы им новую сессию –

1

Позвольте мне предложить один возможный подход к такого рода proplems.

Вы можете создать длинную случайную строку (uploadId), запомнить ее на стороне сервера (в базе данных/сеансе) и передать в качестве дополнительного параметра запроса в скрытый элемент ввода.

Затем, когда изображение загружается, вы можете сравнить эти значения и проверить, было ли какое-либо изображение уже загружено с помощью этого «uploadId».Если это первый раз с этим uploadId, вы должны помнить на стороне сервера, что этот файл uploadId уже использовался один раз и принимает загрузку.

Уже используемые значения uploadId могут быть удалены после некоторого таймаута/после выхода пользователя из системы.

Смежные вопросы