在运行两个不同的网站时,例如free.webhost.com/app1
和free.webhost.com/app2
,似乎Firefox无法为两者存储不同的登录凭据,尤其是当相同的用户名与不同的密码一起使用时。如果/app1
网站上的用户凭据为Name
且pass1
,而另一个网站上的用户凭据为Name
和pass2
,则Firefox只能存储其中一个并且会在他们之间跳转时要求更改密码。
我调查了这个问题,令我惊讶的是,这似乎是firefox bug存储库中的一个WONTFIX:https://bugzilla.mozilla.org/show_bug.cgi?id=263387
在设计我的应用时,有什么方法可以解决这个问题吗?比如在PHP或html中设置某个cookie属性,或者甚至指定一个(假的)不同的域名,这样firefox就不再将free.webhost.com/app1
和free.webhost.com/app2
视为密码存储的同一个网站(并且可以因此,为两个站点存储具有相同用户名的不同密码?)
答案 0 :(得分:8)
不,没有解决方法或技巧。将您的应用部署到不同的域 - 即使是不同的子域(例如app1.example.com
和app2.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_name
或session.name directive
的会话。对于每个站点,我们必须设置会话名称。
在HTML中我们应该使用不同的输入name
,因此app1输入将是<input type='email' name='email_app1' />
和app2 email_app2
。我们还可以停用autocomplete
。
数据使用AES
在本地保存加密。为此,我们可以获得CryptoJS。
我们还希望在客户端中使用 salt hash
。
概念(摘要):
password
。它由登录返回
控制器即可。当然,如果用户想要。salt
。当然,如果用户想要。示例代码:
在控制器中:
// 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安全等等!