我的Greasemonkey脚本在我的电脑外可见吗?

时间:2013-02-20 02:57:05

标签: javascript security passwords greasemonkey

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

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

所以我的问题是,除了我的浏览器和本地PC之外,我的脚本是否可以被任何人看到?我不是在谈论其他人使用我的电脑,而是任何人“探测”或以其他方式从网上其他地方检查我的浏览器。

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

2 个答案:

答案 0 :(得分:2)

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

那就是说,有几点要记住:

  1. 请改用密码工具。
    使用旨在尽可能使用和保护密码的可信实用程序。如上所述,LastPass非常受欢迎。我也使用Secure Login效果良好。

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

  2. 永远不要对敏感网站使用自动登录。 如果您使用银行,信用卡,重要工作数据库等的脚本,有人某天坐在您的计算机上,他们访问该网站(和自动登录),发生的坏事。银行就可以了。
    现在,我知道有些人会(愚蠢地)忽视这一点。但是,如果你这样做,至少要通过热键或热键序列触发登录 - 永远不要全自动。

  3. 注意unsafeWindow
    Greasemonkey脚本过去容易受到针对unsafeWindow的攻击。虽然我相信这个漏洞被Firefox版本4关闭了(旧的漏洞利用方法肯定不适用于现代GM + FF),但unsafeWindow漏洞将允许受感染的网页看到部分脚本源并使用GM_函数。

    因此,对于登录脚本,请不要使用unsafeWindow

  4. 切勿在任何源文件中包含真实密码。
    不要撬开眼睛或恶意软件来获取密码!几十年来,这已成为pwn-dom的一条轻松途径,然而人们仍然会被这种情况所灼伤 - 可能每天都有。

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


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

    用户名和密码存储在浏览器prefs数据库中(通过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.
    

答案 1 :(得分:-1)

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

请查看here以获取更多信息。