Сеансы PHP;Как мне решить эту большую проблему безопасности? - PullRequest
0 голосов
/ 24 октября 2010

Я довольно новичок в сессиях.

У меня есть сайт объявлений, и пользователи могут выбрать "РЕДАКТИРОВАТЬ" свои объявления.

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

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

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

Поэтому я установил переменную сеанса следующим образом:

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

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

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

Проблема (БОЛЬШАЯ ПРОБЛЕМА) заключается в том, что, как только пользователь вводит правильный пароль, создается СЕССИЯ ['correct_pass'] и устанавливается на 1.

После этого пользователь может нажать «назад» в браузере и ввести другой идентификатор объявления nr в URL, и 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
   }
 }

Спасибо

Ответы [ 3 ]

2 голосов
/ 24 октября 2010

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

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

1 голос
/ 24 октября 2010

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

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

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

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

0 голосов
/ 24 октября 2010

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

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



if (isset($_SESSION['authorizedPages']['pageID']) == false) 
{
    echo loginForm;
}
else
{
    echo editForm;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...