伪造域名为firefox密码自动完成?

时间:2014-08-11 21:37:00

标签: php firefox passwords domain-name

在运行两个不同的网站时,例如free.webhost.com/app1free.webhost.com/app2,似乎Firefox无法为两者存储不同的登录凭据,尤其是当相同的用户名与不同的密码一起使用时。如果/app1网站上的用户凭据为Namepass1,而另一个网站上的用户凭据为Namepass2,则Firefox只能存储其中一个并且会在他们之间跳转时要求更改密码。

我调查了这个问题,令我惊讶的是,这似乎是firefox bug存储库中的一个WONTFIX:https://bugzilla.mozilla.org/show_bug.cgi?id=263387

在设计我的应用时,有什么方法可以解决这个问题吗?比如在PHP或html中设置某个cookie属性,或者甚至指定一个(假的)不同的域名,这样firefox就不再将free.webhost.com/app1free.webhost.com/app2视为密码存储的同一个网站(并且可以因此,为两个站点存储具有相同用户名的不同密码?)

4 个答案:

答案 0 :(得分:8)

不,没有解决方法或技巧。将您的应用部署到不同的域 - 即使是不同的子域(例如app1.example.comapp2.example.com)也可以。

答案 1 :(得分:1)

没有解决方法,因为Firefox中的内部凭据存储是按域组织的,而不是按URL组织的。 即使更改输入HTML控件或表单标记的名称或ID也不会影响这一点。

只有解决方案是在不同(子)域上托管您的应用程序。

答案 2 :(得分:1)

这里最好的解决方案可能是为您的应用创建2个不同的虚拟主机。 就像一个用于webhost.com,一个用于free.webhost.com。

How To Set Up Apache Virtual Hosts on Ubuntu 12.04 LTS

希望这有帮助!!

如果您在服务器中设置虚拟主机时遇到问题,请与我们联系。

注意:您需要创建DNS条目才能访问您创建的新主机,或者需要将记录添加到系统的主机文件中,从而浏览网站。

答案 3 :(得分:1)

我们需要custom saver。我将尝试简洁明了。

如果您不想使用浏览器保护程序,这非常有用 。我认为它可以有一些应用程序。


THE BASIC

我建议在PHP中使用不同的Cookie 来保存session_namesession.name directive的会话。对于每个站点,我们必须设置会话名称。

在HTML中我们应该使用不同的输入name ,因此app1输入将是<input type='email' name='email_app1' />和app2 email_app2。我们还可以停用autocomplete

数据使用AES在本地保存加密。为此,我们可以获得CryptoJS。 我们还希望在客户端中使用 salt hash

概念(摘要)

  • 在本地保存加密的password。它由登录返回 控制器即可。当然,如果用户想要。
  • 保存每次登录时更改的salt。当然,如果用户想要。
  • 当用户返回登录页面时, JavaScript 会检查是否存在 是 salt 将其发送到服务器。 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安全等等!