подделать домен для автозаполнения пароля Firefox?

При запуске двух разных веб-сайтов, скажем, free.webhost.com/app1 и free.webhost.com/app2, кажется, что у Firefox возникают проблемы с сохранением разных учетных данных для входа на обоих, особенно когда одно и то же имя пользователя используется с разными паролями. Если учетные данные пользователя на сайте /app1 — это Name и pass1, а на другом сайте — Name и pass2, то Firefox может сохранить только один из них и будет запрашивать изменение пароля при переходе между ними.

Я исследовал эту проблему и, к моему удивлению, это WONTFIX в репозитории ошибок firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=263387

Есть ли способ обойти это при разработке моих приложений? Например, установив определенное свойство cookie в PHP или html, или даже указав (поддельное) другое доменное имя, чтобы Firefox больше не считал free.webhost.com/app1 и free.webhost.com/app2 одним и тем же веб-сайтом для хранения паролей (и, таким образом, мог хранить другой пароль с тем же имя пользователя для обоих сайтов)?


person user1111929    schedule 11.08.2014    source источник
comment
Я бы сказал, что либо два приложения имеют одну и ту же базу данных пользователей, что означает одно и то же имя пользователя и пароль. Или у них разные базы данных - в этом случае просто используйте либо два разных имени пользователя с отдельными паролями, либо используйте один и тот же пароль только с одним именем пользователя.   -  person Sven    schedule 12.08.2014
comment
У них разные базы данных, но большинство пользователей, как правило, выбирают одно и то же имя пользователя на обоих, когда могут (но часто с разными паролями).   -  person user1111929    schedule 12.08.2014
comment
Нелогично использовать разные учетные данные для двух разных страниц на одном сайте.   -  person developerwjk    schedule 12.08.2014
comment
Это не один и тот же сайт, это два разных сайта, размещенных на одном домене.   -  person user1111929    schedule 12.08.2014
comment
@ user1111929, Нет. Это два разных приложения на одном сайте.   -  person developerwjk    schedule 23.08.2014


Ответы (4)


Нам нужен custom saver. Я постараюсь быть кратким и лаконичным.

Это очень полезно, если вам не нужна заставка браузера. Я думаю, что это может иметь некоторые приложения.


БАЗОВАЯ ИНФОРМАЦИЯ

Я предлагаю в PHP использовать различные файлы cookie для сохранения сеанса с session_name или session.name directive. Для каждого сайта мы должны установить имя сеанса.

В HTML мы должны использовать разные входные данные name, поэтому входные данные app1 будут <input type='email' name='email_app1' />, а app2 — email_app2. Мы также можем отключить autocomplete.

Данные сохраняются локально зашифрованными с помощью AES. Для этого мы можем получить CryptoJS. Мы также хотим иметь salt hash в клиенте.

КОНЦЕПЦИЯ (обобщение):

  • Сохраните локально password в зашифрованном виде. Он возвращается контроллером входа. Конечно, если пользователь захочет.
  • Сохраните salt, который меняется при каждом входе в систему. Конечно, если пользователь захочет.
  • Когда пользователь возвращается на страницу входа, JavaScript проверяет наличие соли и отправляет ее на сервер. PHP возвращает фразу-пароль, а JavaScript расшифровывает локальный пароль.

пример кода:

В контроллере:

// I use functions in the controller like example
public function getLoginPage(){
   // it prints the html and js to login using the basics how i have said
}

// salt is sended by the JavaScript
public function getPassphrase( $salt, $username ){
   $passPhrase = get_passphrase_from_salt( $salt, $username, Request::IP() );
   return $passPhrase;
}

// It is to get the salt
public function getSalt( $username, $password ){
      $user = get_user( $username, $password );

      // if valid user...
      $passphrase = random_string();
      $salt = random_string();

      $encrypted = encrypt( $password, md5($passphrase) );

      save_in_table_salt( $salt, $passphrase, $username, Request::IP() );

      // it prints a JSON like example
      return json_encode( array( 'salt' => $salt, 'encrypted' => $encrypted) );
}

// ... Normal login etc you could change the salt and reset in the client

В представление помещаем логику JavaScript. Я использовал localstorage, но думаю, что это не важно.

// in login page
window.onload = function(){
    if( localStorage.getItem('salt') !== null ) { // the data is saved
       // Get the passphrase
       ajax_call('post', 'getPassphrase', { 
             salt: localStorage.getItem('salt'),
             username: localStorage.getItem('username')
          }, function( passphrase ){
          // It sets the inputs values!
          document.getElementById('username_app1').value = localStorage.getItem('username');
          document.getElementById('password_app1').value = decrypt( localStorage.getItem('password'), CryptoJS.MD5(passphrase) );
       });
    }
};

// it captures the submit action
document.getElementById('login_form').onsubmit = function(){
    // it asks to user if he wants save locally the credentials
    if( localStorage.getItem('salt') === null
        && confirm('Do you want save credentials?') ){
        var form = this;
        // get salt
        ajax_call('post', 'getSalt', {
              user: document.getElementById('username_app1').value,
              password: document.getElementById('password_app1').value
           }, function( object ){
           localStorage.setItem('salt', object.salt);
           localStorage.setItem('password', object.encrypted);
           localStorage.setItem('username', document.getElementById('username_app1').value );

           form.submit(); // now yes
        });
        return false; // it prevents submit
    }
};

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

ОБНОВЛЕНО: теперь работает с несколькими компьютерами, IP-защитой и многим другим!

person SnakeDrak    schedule 21.08.2014
comment
Локальное шифрование совершенно бесполезно, если вы можете просто запросить у сервера ключ дешифрования, когда захотите. - person nneonneo; 22.08.2014
comment
Я не знаю, где вы видите проблему. У вас есть соль с кодовой фразой для расшифровки вашего пароля, сохраненного локально. Чтобы получить кодовую фразу, нужна соль, имя пользователя и тот же IP-адрес. Если ваш IP-адрес изменился, вам нужно будет ввести учетные данные. Я думаю, что переход в Конфигурация->Учетные данные->Показать пароли менее безопасен. Конечно, если вы видите уязвимость XSS или способ получить пароль, наблюдая за сетью, скажите мне, пожалуйста. - person SnakeDrak; 22.08.2014
comment
Это интересная идея, я не знал о возможности локального хранения JavaScript. Таким образом, действительно можно написать свой собственный менеджер паролей, который обходит браузерный. Спасибо за подробный ответ, который определенно заслужил награду! Меня по-прежнему интересует мнение людей о безопасности (например, могут ли другие сайты «украсть» сохраненные данные, если захотят), поскольку это было бы несколько новым для меня доменом с использованием локального хранилища. - person user1111929; 23.08.2014
comment
Другие сайты не могут получить доступ к данным вашей веб-страницы. Этот метод безопасен, хотя кто-то следит за сетевым трафиком (конечно, с http еще лучше!). Я жду комментария @downvoter - person SnakeDrak; 23.08.2014

Нет, для этого нет обходного пути или трюка. Разверните свои приложения в разных доменах — подойдут даже разные поддомены (например, app1.example.com и app2.example.com).

person user3942918    schedule 17.08.2014

Для этого нет обходного пути, так как внутреннее хранилище учетных данных в Firefox организовано по доменам, а не по URL-адресам. Даже изменение имени или идентификатора для элементов управления вводом HTML или тега формы не повлияет на это.

Единственное решение - разместить ваше приложение на разных (суб)доменах.

person mikikg    schedule 18.08.2014

Вероятно, лучшим решением здесь было бы создать 2 разных виртуальных хоста для вашего приложения. Например, один для webhost.com и один для free.webhost.com.

Как Настройка виртуальных хостов Apache в Ubuntu 12.04 LTS

Надеюсь, это поможет!!

Если у вас возникли проблемы с настройкой виртуального хоста на вашем сервере, дайте мне знать.

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

person Tapaswi Panda    schedule 20.08.2014