Javascript 我的Greasemonkey脚本是否在电脑外可见?

Javascript 我的Greasemonkey脚本是否在电脑外可见?,javascript,security,passwords,greasemonkey,Javascript,Security,Passwords,Greasemonkey,如果这是个愚蠢的问题,请原谅我。我不熟悉如何处理浏览器脚本 我正在写一个简短的Greasemonkey脚本,其中包括自动将我登录到一个网站,当然还包括插入我的密码。我计划只在脚本中包含我的密码,但我担心如果其他人可以看到我的脚本,他们也会看到我的密码 所以我的问题是,除了我的浏览器和本地PC之外,我的脚本有可能被任何人/任何东西看到吗?我不是说有人在使用我的电脑,而是说有人在网上其他地方“探测”或检查我的浏览器 如果是这样,我如何存储我的密码以便在不牺牲我的安全性的情况下自动插入?通常情况下,不

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

我正在写一个简短的Greasemonkey脚本,其中包括自动将我登录到一个网站,当然还包括插入我的密码。我计划只在脚本中包含我的密码,但我担心如果其他人可以看到我的脚本,他们也会看到我的密码

所以我的问题是,除了我的浏览器和本地PC之外,我的脚本有可能被任何人/任何东西看到吗?我不是说有人在使用我的电脑,而是说有人在网上其他地方“探测”或检查我的浏览器


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

通常情况下,不会。Greasemonkey脚本在电脑外部的可见程度并不比硬盘上任何其他未加密的文件都高

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

  • 改用密码实用程序。
    尽可能使用设计用于处理和保护密码的可信实用程序。如前所述,它相当受欢迎。我也习惯了很好的效果

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

  • 切勿对敏感站点使用自动登录。 如果你为银行、信用卡、重要工作数据库等使用脚本,总有一天会有人坐在你的电脑前,他们会访问该网站(并自动登录),坏事就会发生。依靠它。
    现在,我知道有些人会(愚蠢地)忽视这一点。但是,如果你这样做了,至少会有一个热键或热键序列触发登录——永远不会是完全自动的

  • 小心
    unsafeWindow

    Greasemonkey脚本过去容易受到攻击。虽然我相信Firefox版本4关闭了此漏洞(旧的漏洞利用方法肯定不适用于现代的GM+FF),但
    unsafeWindow
    漏洞利用将允许受损网页查看部分脚本源代码并使用
    GM
    功能

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

  • 不要在任何源文件中包含真实密码。
    不要让窥探者或恶意软件轻易获取您的密码!几十年来,这一直是一条通往pwn dom的简单路线,但人们仍然会被它烧死——可能每天都会这样

  • 不要以明文形式存储密码。不要使用“密码”和“用户名”作为变量名。 这不会阻止一个有决心的坏人,但会减缓“诚实”的窥探和编剧的速度


  • 这是我在自动登录的两个页面上使用的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.
    

    是的,他们是!!如果请求站点在脚本的事件
    domandeinserted
    上设置了事件侦听器,则请求站点上的所有脚本都可以看到您的源代码(以及您的密码)


    查看更多信息。

    ?将密码以明文形式存储在任何地方通常都不是一个好主意,即使没有人能看到它。@user113215可以通过javascript插入Lastpass密码吗?Lastpass浏览器插件在看到表单一次后会自动填充
    字段。它忽略HTML标记,指示浏览器不记住密码。我不确定是否要手动编写LastPass脚本。你是控制台吗?在那里简单地记录用户和密码?@JonasWielicki:是的,但这只是为了调试/教育目的。这适用于Greasemonkey 0.3和更早版本,并且在12年前就已修复。