如何向用户询问他们是否要保存Chrome等用户名/密码?

时间:2016-05-26 04:01:41

标签: javascript html google-chrome-extension form-submit web-deployment

我制作的Chrome扩展程序将充当类似于Chrome的密码管理器,但具有一些不同的功能。

当用户提交登录表单时,我的分机可以拦截提交并获取用户名和密码。现在,我想显示一个弹出窗口,询问用户是否要保存密码。

如果可以在存在的任何页面之上显示我自己的自定义HTML,那么它将在页面重新加载后消失。所以我应该将数据存储在会话变量中,每次加载页面时,检查它是否有什么东西?

我想避免打开另一个窗口,它看起来很草率。有没有更好的方法来获取表单数据并在提交后加载页面之后使用?

2 个答案:

答案 0 :(得分:2)

那很棘手......

我自己不使用chrome扩展,但我确实写了类似的GreaseMonkey扩展。

首先,让我说这是一个坏主意......这里有一些非常重要的安全问题,但我会回答你是怎么回事。

第一步是告知页面加载的时间恰好跟随提交(而不是通过书签或链接打开或在新标签中打开)。

我知道这样做的唯一方法是链接到window.name属性,该属性在页面加载之间持续存在。

说这是hacky会是真的。说它的脆弱将更加真实。它甚至可能会突然停止在某些浏览器下工作。

但是,这是我所知道的唯一方式。

所以..你的步骤是。

  1. 确定这是否值得保存。
  2. 挂钩form.submit并保存网址,用户名和密码。如果页面使用ajax或挂钩到form.submit本身,则所有投注均已关闭。
  3. window.name
  4. 中设置一个标记
  5. 让页面重新加载
  6. 查看该网页是否已登录。最有可能是查看网页上是否有password字段。
  7. 看看window.name中的旗帜是否存在 - 此页面是从登录名加载的。
  8. 清除window.name标志
  9. 如果没有密码字段,请弹出浮动div,要求保存信息。
  10. 保存。

答案 1 :(得分:0)

这可以使用事件和内容脚本的组合来完成。

使用manifest.json注册内容脚本

"content_scripts": [ {
  "js": [ "/util/jquery.js", "main.js"],
  "matches": [ "http://*/*", "https://*/*"],
  "run_at": "document_start",    
}],

内容脚本侦听要提交的表单

$("form").submit(function(e) {
  var $this = $(this);
  console.log('submit');
  var formData = findFormData($this); //function searches form for username/password

  //Send message to background page with user/pass data
  chrome.runtime.sendMessage({greeting:'form_submit', data:formData}, function(){ /*if needed */ });

});

使用清单创建后台脚本注册(使用persistent = false使后台脚本成为“事件”脚本)。我们还需要以下权限

"background": {
  "scripts": ["/background/background.js"],
  "persistent" : false
},
"permissions": [
  "activeTab",
  "storage",
  "webNavigation"
]

最后,我们将消息监听器添加到后台页面

chrome.runtime.onMessage.addListener(function(request, sender,     sendResponse) {
switch (request.greeting) {
  case 'form_submit':
    var data = request.data;
    console.log('We Have Data!', request.data);

    //We want to display the prompt when this page loads, so add listener
    chrome.webNavigation.onCompleted.addListener( function askUser(details) {

      //Create prompt here!

      //remove the onCompleted listener so it doesn't appear when navigating again
      chrome.webNavigation.onCompleted.removeListener(askUser);
    });

    sendResponse({farewell: "success"});

    break;
  }
});