在安装时在Greasemonkey脚本中存储用户登录/密码输入

Max*_*ask 12 javascript greasemonkey tampermonkey

我正在做一个Greasemonkey脚本,它通过REST API与Redmine票证管理器进行通信.由于用户需要登录才能从Redmine获取数据,我需要一种方法在脚本安装时询问用户的凭据并将其保存到脚本中.

这可以在不要求用户直接在脚本中编辑值的情况下实现吗?

编辑:
由于已经有了这个问题的答案,我将验证下面给出的答案,因为它是一个非常好的框架.

Bro*_*ams 12

这是一个获取和存储登录凭据的框架. 脚本会在第一次运行时提示输入信息并使用加密存储GM_setValue().

它还向Greasemonkey上下文菜单添加了两个项目,以允许更改用户名或密码.

// ==UserScript==
// @name     _Autologin, sensitive info framework
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require  http://crypto.stanford.edu/sjcl/sjcl.js
// @grant    GM_getValue
// @grant    GM_setValue
// @grant    GM_registerMenuCommand
// ==/UserScript==

var encKey  = GM_getValue ("encKey",  "");
var usr     = GM_getValue ("lognUsr", "");
var pword   = GM_getValue ("lognPwd", "");

if ( ! encKey) {
    encKey  = prompt (
        'Script key not set for ' + location.hostname + '. Please enter a random string:',
        ''
    );
    GM_setValue ("encKey", encKey);

    usr     = pword = "";   // New key makes prev stored values (if any) unable to decode.
}
usr         = decodeOrPrompt (usr,   "U-name", "lognUsr");
pword       = decodeOrPrompt (pword, "P-word", "lognPwd");


function decodeOrPrompt (targVar, userPrompt, setValVarName) {
    if (targVar) {
        targVar     = unStoreAndDecrypt (targVar);
    }
    else {
        targVar     = prompt (
            userPrompt + ' not set for ' + location.hostname + '. Please enter it now:',
            ''
        );
        GM_setValue (setValVarName, encryptAndStore (targVar) );
    }
    return targVar;
}

function encryptAndStore (clearText) {
    return  JSON.stringify (sjcl.encrypt (encKey, clearText) );
}

function unStoreAndDecrypt (jsonObj) {
    return  sjcl.decrypt (encKey, JSON.parse (jsonObj) );
}

//-- Add menu commands that will allow U and P to be changed.
GM_registerMenuCommand ("Change Username", changeUsername);
GM_registerMenuCommand ("Change Password", changePassword);

function changeUsername () {
    promptAndChangeStoredValue (usr,   "U-name", "lognUsr");
}

function changePassword () {
    promptAndChangeStoredValue (pword, "P-word", "lognPwd");
}

function promptAndChangeStoredValue (targVar, userPrompt, setValVarName) {
    targVar     = prompt (
        'Change ' + userPrompt + ' for ' + location.hostname + ':',
        targVar
    );
    GM_setValue (setValVarName, encryptAndStore (targVar) );
}

// ADD YOUR CODE TO SET THE USERNAME AND PASSWORD ON THE LOGIN PAGE, HERE.
Run Code Online (Sandbox Code Playgroud)

重要:

  1. 使用用户脚本登录始终存在风险.
  2. 这个框架大大降低了风险,但可用的Greasemonkey和Tampermonkey的存储机制并不安全,浏览器厂商CYA对存储的机密信息.如果坏人同时获得您的用户名浏览器数据,那么他可以对您的密码进行反向工程.当然,如果他有这个,他最有可能是你的一台机器.
  3. 聪明的做法是使用密码管理器LastPass的,KeePass的,等等.
  4. 绝对最糟糕的事情是将凭证存储在用户脚本中.即使是客人也可以看到他们然后你会被"黑客攻击",保证.

  • 我确信这是非常不安全且不好的做法,因为加密密钥以明文形式存储在加密值旁边。[`chrome.storage`,其中 `GM_setValue()` 在 TamperMonkey 中实现,文档](https://developer.chrome.com/extensions/storage#using-sync) 明确指出不应存储敏感数据。在这种情况下,加密密钥是敏感数据,并且将加密文本有效地呈现为明文。 (2认同)