Как ограничить мое приложение одной вкладкой браузера? - PullRequest
5 голосов
/ 21 октября 2011

Честно говоря, в v1.0 просто слишком много хлопот, чтобы иметь функциональность, которая требует трех представлений форм, с $_SESSION данными сеанса, хранящими все промежуточные вещи - только чтобы пользователь запустил операцию, а затем открылвторая вкладка и выполнить вторую операцию, которая попирает данные сеанса.

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

Поскольку я пишу код на PHP, я могу обнаружить существование данных сеанса при отправке формы (как бы я это сделал с JS, если пользователь открывает другую вкладку - я думаю, что мне понадобится Ajax - верно?).

Итак, каждый раз, когда я запускаю операцию, я проверяю наличие флага в данных сеанса и, если установлен, я перезагружаюсь на «Извините, Дейв.Я боюсь, что я не могу этого сделать », иначе я устанавливаю флаг и продолжаю (не забывая очистить его в конце операции).

Я думаю, это будет работать, но:
1) Допустимо ли ограничивать приложения браузера одной вкладкой / экземпляром?
2) Стоит ли пытаться разрешить несколько экземпляров в версии 2.0?

Любые другие комментарии, помощь или советы?

Ответы [ 5 ]

5 голосов
/ 21 октября 2011

Лучше было бы избежать сохранения состояния взаимодействия с пользователем в сеансе. Поместите его в скрытые поля формы или как-нибудь так, чтобы каждый клиентский запрос имел связанное с ним состояние. Если вас беспокоит вмешательство пользователя, используйте HMAC, чтобы предотвратить это, и, возможно, зашифруйте его, если он содержит вещи, которые пользователь не должен видеть.

Только указывайте, что должно быть общим для вкладок - например, идентификатор пользователя или что-то вроде корзины покупок - должно храниться в сеансе.

4 голосов
/ 21 октября 2011

Самое большее, что вы можете - это сохранить список «последней запрашиваемой страницы» в файле сеанса с флагами, указывающими на то, что пользователю не должно быть позволено покинуть его, если это один из этих критических флагов формы.Поэтому, если вы используете form.php, а это no-move-off, то на любой новой загруженной странице должна быть опция «Отменить или закрыть окно».

Вы не можете запретить пользователю открывать другую вкладку /окна, но вы можете предотвратить их перемещение в другое место на вашем сайте в других окнах / вкладках.

Однако учтите, что это очень плохой пользовательский интерфейс.Представьте, что Amazon попал в ловушку вас на странице корзины покупок и никогда не пропустит вас на другую страницу без необходимости что-то покупать.Попробуйте обновить код, чтобы несколько разных окон использовали одну и ту же форму.

2 голосов
/ 21 июня 2016

Добавлен нижеприведенный скрипт после того, как я войду (скажем, dashboard.php)

<script>
$(document).ready(function()
{
    $("a").attr("target", "");
    if(typeof(Storage)              !== "undefined") 
    {
        sessionStorage.pagecount    =   1;
        var randomVal               =   Math.floor((Math.random() * 10000000) + 1); 
        window.name                 =   randomVal;
        var url                     =   "url to update the value in db(say random_value)";
        $.post(url, function (data, url)
        {
        });
    } 
    else 
    {
        var url                     =   "url to remove random_value";           
        $.post(url, function (data, url)
        {
            sessionStorage.removeItem('pagecount');
            sessionStorage.clear();
            window.location         =   'logout.php';
        });
    }    
});
</script>

Добавил нижеприведенный скрипт в заголовок на остальных моих страницах - 'random_value' равноиз БД для этого пользователя

<script>
$(document).ready(function()
{       
    $("a").attr("target", "_self");

    if(typeof(Storage)                      !== "undefined") 
    {
        if (sessionStorage.pagecount) 
        {
            if('<?=$random_value?>'         ==  window.name)
            {
                sessionStorage.pagecount    =   Number(sessionStorage.pagecount) + 1;
            }
            else
            {
                var url                     =   "url to remove random_value";           
                $.post(url, function (data, url)
                {
                    sessionStorage.removeItem('pagecount');
                    sessionStorage.clear();
                    window.location         =   'logout.php';
                });

            }               
        } 
        else 
        {           
            var url                         =   "url to remove random_value";           
            $.post(url, function (data, url)
            {
                sessionStorage.removeItem('pagecount');
                sessionStorage.clear();
                window.location             =   'logout.php';
            });
        }
    } 
    else 
    {   
        var url                             =   "url to remove random_value";                   
        $.post(url, function (data, url)
        {
            sessionStorage.removeItem('pagecount');
            sessionStorage.clear();
            window.location                 =   'logout.php';
        });
    }   
});
</script>
2 голосов
/ 21 октября 2011

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

Один из способов решить эту проблему - добавить токен CSRF в свои формы (как скрытую переменную), который будет отправлен вместе с запросом.

CSRF ссылка

Существует много способов сгенерировать токен, но по сути вы:

  1. создать токен
  2. магазин в вашем $_SESSION
  3. вывести форму с <input type="hidden" name="{token name}" value="{token value}" />

Затем, когда форма отправляется, вы проверяете $_REQUEST['{token name}'] == $_SESSION[ {имя токена}] `.

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

Одно: если злоумышленник может выяснить, как вы генерируете свои токены CSRF, он может подделать запросы.

0 голосов
/ 10 мая 2017

Если бы я делал это сейчас, я бы, вероятно, закодировал бы одностраничное приложение AngularJs (хотя подойдет любая форма Js).

При запуске ищите флаг в локальном хранилище. Если установлено, откажитесь от запуска с подходящим сообщением, иначе установите флаг и запустите приложение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...