Ограничить доступ пользователей в том же браузере

Я делаю приложение на основе php. Когда два пользователя вошли в систему из одного и того же браузера на разных вкладках, они могут получить доступ к страницам друг друга. Как предотвратить это?


person Tushar Sippy    schedule 10.06.2012    source источник
comment
Почему? Помимо того, что пользователь вводит имя пользователя/пароль для каждого запроса, я не знаю, возможно ли это, а тем более практично.   -  person Jared Farrish    schedule 10.06.2012
comment
Ограничить доступ пользователя в заголовке - можно ли получить доступ???   -  person slash197    schedule 10.06.2012
comment
Что вам действительно нужно сделать, так это убедиться, что вы каким-то образом не позволяете браузеру входить в систему для двух разных пользователей. Обычно именно так работают веб-приложения в этом отношении. IE, если пользователь пытается получить доступ к экрану или форме входа в систему, сначала выйдите из системы или автоматически выйдите из системы другого пользователя, если запрашивается страница входа или форма.   -  person Jared Farrish    schedule 10.06.2012
comment
Почему 2 пользователя используют разные вкладки в одном и том же браузере? Файлы cookie для сайта существуют для всего сеанса браузера, а не для каждой вкладки. Кроме того, что, если я решу нажать на другую вкладку?   -  person Rocket Hazmat    schedule 10.06.2012
comment
Ждать. Как 2 пользователя могут войти на один и тот же сайт с разных вкладок? Это невозможно!   -  person Rocket Hazmat    schedule 10.06.2012
comment
@Rocket - нет ничего невозможного, если вы этого не знаете или вам не повезло. Кто-то проявляет некоторую хитрость и возится с чем-то совершенно несуразным с необычными недостатками? Я видел это у начинающих и младших разработчиков. Удивительно, насколько гениальными могут быть некоторые из их недостатков. :)   -  person Jared Farrish    schedule 10.06.2012
comment
@JaredFarrish: Наверное, но подумайте об этом. Если бы ему удалось создать сайт, на котором 2 пользователя могут войти в систему на разных вкладках одного и того же браузера, разве проблема не решилась бы сама собой? Этот вопрос действительно сбивает с толку ›.‹   -  person Rocket Hazmat    schedule 10.06.2012
comment
@Rocket - они не входят в разные вкладки. Они могли войти в систему, используя разные вкладки для доступа к форме входа, но они не вошли на вкладку. Это спорный вопрос, не так ли?   -  person Jared Farrish    schedule 10.06.2012
comment
Ждать. Под logged in вы подразумеваете, что вы действительно вошли в систему (например, прошли проверку подлинности)? Или logged in как просто просмотр страницы? Можете ли вы объяснить немного больше? Это действительно запутанный вопрос.   -  person Rocket Hazmat    schedule 10.06.2012
comment
@Rocket, вход в систему многих пользователей невозможен (или, по крайней мере, очень сложно), если вы используете файлы cookie для идентификации сеанса. Если вы передаете идентификатор сеанса в качестве параметра GET/POST, вполне возможно, что многие пользователи войдут в систему из одного и того же браузера.   -  person zneak    schedule 10.06.2012
comment
@Rocket - возможно (теперь, когда я об этом думаю) два разных пользователя вошли в один и тот же браузер в разных контекстах приложения / пути, но в контексте общего сайта. Другими словами, если ваше приложение находится в http://example.com/rocketsapp, а мое приложение в http://awesome.example.com/jaredsapp, файлы cookie/сеансы теоретически могут идентифицировать пользователя, который может получить доступ к обоим, если сеанс перекрывает флаг или проверку входа в систему, а файл cookie сеанса установлен на поддомен. а не расширение пути. Возможно... И явно недостаток.   -  person Jared Farrish    schedule 10.06.2012
comment
@zneak: Верно, но если бы это делал ОП, то проблема была бы решена в первую очередь.   -  person Rocket Hazmat    schedule 10.06.2012


Ответы (4)


Я вижу там 4 решения:

  1. Вы можете просто попытаться дать этому окну (в данном случае вкладку) имя, чтобы обнаружить специальное окно с помощью JavaScript:

    if(window.name==4711) {...}
    
  2. Используйте сеанс с параметром GET, а не с файлом cookie.

  3. Используйте случайный поддомен с обычными файлами cookie, которые работают на этом поддомене.

  4. Используйте обычный файл cookie, который ограничен «виртуальным» каталогом, который на самом деле не существует с использованием mod_rewrite. Идея, основанная на этом комментарии.

person rekire    schedule 10.06.2012
comment
Как это помешает кому-то просто выбрать другую вкладку? - person Jared Farrish; 10.06.2012
comment
Я так понимаю вопрос в том, что ищется решение для входа в один браузер с несколькими учетными записями. Это сеансы на основе файлов cookie невозможны. - person rekire; 10.06.2012
comment
@JaredFarrish: Эта концепция делает весь этот вопрос спорным. Я хотел бы знать, почему это проблема, которую, по мнению ОП, ему нужно решить. - person Rocket Hazmat; 10.06.2012
comment
@Rocket - Да, я знаю. Смотрите другие мои комментарии. Я думаю, что беспокойство напрасно, как если бы вы беспокоились о чем-то нереальном или о плохо построенном процессе аутентификации. - person Jared Farrish; 10.06.2012
comment
@JaredFarrish: Кроме того, как 2 пользователя могут одновременно войти в систему на разных вкладках в одном и том же браузере? Как это вообще возможно? - person Rocket Hazmat; 10.06.2012
comment
@Rocket - я не думаю, что это важно. ОП может не осознавать, что это один сеанс браузера, а не сеанс по вкладкам или еще что-то. - person Jared Farrish; 10.06.2012
comment
rekire, в принципе даже наличие этой проблемы является анти - шаблон и результат плохого дизайна. Я не думаю, что ваши решения будут делать что-либо, кроме излишнего усложнения проблемы, и я сомневаюсь, что они работают достаточно надежно, чтобы не раздражать пользователей. Если у ОП нет какого-то откровенного объяснения, которое внезапно обретает смысл, реальное решение состоит в том, чтобы исправить доступ. - person Jared Farrish; 10.06.2012
comment
Это последнее решение (на основе моего комментария) может фактически разрешить более чем одному пользователю входить в приложение, которое может разделять области доступа пользователя по пути URL. Так, например, если у вас есть приложение, и у меня есть область, найденная в http://example.com/app/bigmoney/, и у вас есть область, найденная в http://example.com/app/wonderland/, если бы сеансы не использовали один и тот же метод кэширования пользователя, назначенного пользователю, я мог бы получить доступ ваш район, как вы. Другими словами, эти две области достаточно различны, поэтому им потребуется модель SSO для совместного использования и обеспечения идентификации пользователей. - person Jared Farrish; 10.06.2012
comment
Что ж, тот, что со случайными поддоменами, используется web.de уже много лет. Домены будут выглядеть немного некрасиво, но это прекрасно работает даже без js. На примере web.de у вас могут быть одновременно открыты разные почтовые ящики. Пока я не вижу ничего, что могло бы разозлить пользователя. Ваш последний комментарий не совсем ясен для меня. - person rekire; 10.06.2012
comment
Могут ли два пользователя войти в систему одновременно или требуется, чтобы пользователь вышел из системы, прежде чем предоставить доступ к другой части сайта, принадлежащей другому пользователю? - person Jared Farrish; 10.06.2012
comment
То, что вы описываете, на самом деле является проблемой, которую необходимо контролировать, тщательно управляя процедурой входа в систему, а не разрабатывая эффект. Работайте с первопричиной, а не самим следствием. РЕДАКТИРОВАТЬ: Могут ли два разных пользователя войти на один и тот же сайт в одном и том же браузере? - person Jared Farrish; 10.06.2012
comment
Ну, если они так хотят с этим справиться. Я думаю, что это несправедливо по отношению к пользователям, если это так. - person Jared Farrish; 10.06.2012

Используйте $_SESSION или $_COOKIE для хранения сгенерированного ключа, который создается, когда пользователь входит в систему и обновляет вашу базу данных, чтобы, когда пользователь меняет страницу, вы получали доступ к их информации на основе этого сгенерированного ключа. Также вам может понадобиться создать простой function, который проверяет ключ, а затем использовать другую функцию для вашей страницы, если это похоже на строку меню или окно входа в систему, оберните его внутри if statement, например

if(checkUser($_COOKIE['MYSID'])){
   // User is logged in so show whatever
} else {
   // Login box here
}
person Bobby    schedule 10.06.2012
comment
Насколько я знаю, файлы cookie не привязаны к вкладке или окну. Тем не менее, это не мешает кому-то просто щелкнуть другую вкладку. - person Jared Farrish; 10.06.2012
comment
Вы правы, куки-файлы не основаны только на одной вкладке или окне, но если вы используете куки-файлы в качестве источника входа в систему и добавили часть на сайт, которая проверяет, существует ли куки-файл, таким образом, не позволяя другому человеку войти в систему, предотвратить то, что он просит. - person Bobby; 10.06.2012
comment
Недостаток в том, что, по-видимому / возможно?, ОП построил систему, которая каким-то образом позволяет нескольким пользователям входить в систему из одного и того же сеанса браузера. Исправьте это, не внедряйте какое-то сложное решение проблемы, которой даже не должно быть. ИМО. - person Jared Farrish; 10.06.2012

используйте свойство window.name или установите cookie для каждого пользователя по времени открытия вкладки браузера.

person Maziar Aboualizadehbehbahani    schedule 10.06.2012

ваше приложение не проверяет, вошел ли пользователь в систему в данный момент или нет, поэтому, что вам нужно сделать в первую очередь, когда пользователь вводит учетные данные и входит в систему, установите переменную сеанса

$_SESSION['logged_in'] = "true";

затем вам нужно внести некоторые изменения в свою индексную страницу, как показано ниже в начале страницы.

<?
if($_SESSION['logged_in']=='true'){
header('location:USERS_SPECIFIC_PAGE_AFTER_LOGIN.EXT')
}
else{
header('location:login_page.ext');
}

?>
person sohaan    schedule 10.06.2012