2

如果这是一个愚蠢的问题,请原谅我。我不熟悉如何处理浏览器脚本。

我正在编写一个简短的 Greasemonkey 脚本,其中涉及将我自动登录到一个网站,这当然涉及插入我的密码。我原本打算在脚本本身中包含我的密码,但我担心如果其他人可以看到我的脚本,他们也会看到我的密码。

所以我的问题是,我的脚本是否有可能被我的浏览器和本地 PC 之外的任何人/任何东西看到?我不是在谈论其他任何人使用我的计算机,而是任何人从网络上的其他地方“探测”或以其他方式检查我的浏览器。

如果是这样,我如何存储我的密码,以便在不牺牲我的安全性的情况下自动插入?

4

2 回答 2

2

名义上,没有。Greasemonkey 脚本在您的 PC 之外并不比您硬盘上的任何其他未加密文件更可见。

也就是说,有几件事要记住:

  1. 请改用密码实用程序。
    尽可能使用旨在使用和保护密码的受信任实用程序。如前所述,LastPass非常受欢迎。我也使用了安全登录,效果很好。

    诚然,这些实用程序并不适用于所有情况,因为如此多的网站坚持使用自己的登录页面/系统变体。所以,我个人确实使用 Greasemonkey 脚本来登录一些低风险的网站。

  2. 切勿对敏感站点使用自动登录。 如果您为银行、信用卡、重要工作数据库等使用脚本。总有一天有人坐在您的计算机前,他们访问该站点(并自动登录),并且发生不好的事情。银行就可以了。
    现在,我知道有些人会(愚蠢地)忽略这一点。但是,如果你这样做了,至少让登录由热键或热键序列触发——永远不要完全自动。

  3. 当心unsafeWindow
    Greasemonkey 脚本曾经容易受到针对unsafeWindow. 虽然我相信这个漏洞已被 Firefox 版本 4 关闭(旧的漏洞利用配方肯定不适用于现代 GM+FF),但unsafeWindow漏洞利用将允许受感染的网页查看您的部分脚本源并使用GM_函数。

    所以,特别是对于登录脚本,不要使用unsafeWindow.

  4. 切勿在任何源文件中包含真实密码。
    不要让窥探者或恶意软件很容易获取您的密码!几十年来,这一直是通向 pwn-dom 的简单途径,但人们仍然为此感到烦恼——可能每天都如此。

  5. 不要以明文形式存储密码。并且不要使用“密码”和“用户名”作为变量名。这不会阻止一个坚定的坏人,但它会减慢“诚实”的窥探和脚本小子。


这是我在自动登录的两个页面上使用的 Greasemonkey 脚本框架(都是论坛,低风险,低敏感度)。

用户名和密码存储在浏览器首选项数据库中(通过 可见about:config),而不是脚本源。它们经过轻微加密以减慢窥探速度。

第一次运行脚本时,它会提示输入随机密钥以及用户名和密码。之后,可以通过 Greasemonkey 上下文菜单更改用户名和密码。

// ==UserScript==
// @name     _Autologin, sensitive info framework
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @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) );
}

/*-- These next 3 lines are for debug / edification.  
Remove or comment out of the final script.
*/
console.log ("Script start.");
console.log ("usr: ",   usr);
console.log ("pword: ", pword);

// ADD YOUR CODE TO SET THE USERNAME AND PASSWORD ON THE LOGIN PAGE, HERE.
于 2013-02-20T11:08:20.393 回答
-1

对,他们是!!通过请求站点对脚本事件的事件侦听器,DOMNodeInserted您的源代码(以及您的密码)对请求站点上的所有脚本都是可见的。

这里查看更多信息。

于 2017-05-22T10:46:56.963 回答