ESXi Web客户端自动填充凭据

时间:2017-11-08 12:35:59

标签: javascript jquery greasemonkey vmware esxi

我正在尝试编写一个使用凭据自动填充ESXi登录网页的greasemonkey脚本。以下代码填充输入字段并启用提交按钮:

// ==UserScript==
// @name         ESXi autofill credentials
// @namespace    https://esx_address/ui/*
// @version      0.1
// @description  Autofills user and password inputs
// @author       Mirek
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require      https://gist.github.com/raw/2625891/waitForKeyElements.js
// @match        https://esx_address/ui/*
// @grant        none
// ==/UserScript==

try {
    waitForKeyElements ("#password", function(jNode) {jNode.val("password");});
    waitForKeyElements ("#username", function(jNode) {jNode.val("user");});
    waitForKeyElements ("#submit", function(jNode) {jNode.prop("disabled", false);});
} catch(err) {
    console.log("Something went wrong: " + err.message);
}

不幸的是,在我点击提交按钮后,即使凭据正确,我也会看到Cannot complete login due to an incorrect user name or password.

问题可能在于启用提交按钮。一旦用户在用户名字段中输入内容,登录页面就会启用它。不幸的是,脚本没有触发此行为。我发现启用了脚本后,当我进入登录页面并重新输入用户名和密码字段的最后一个字母时,登录成功。

如何以触发提交按钮的方式填充输入字段?

2 个答案:

答案 0 :(得分:1)

这是一个烦人的最差练习 1 ,通常要求你欺骗用户事件。

  1. 所需要的详细信息是网站/应用程序特定的(我不会很快与esxi一起玩)。
    有时你只需要发送一个change事件。有时你需要假装一个完整的鼠标,按键/按下/向上,鼠标移动,模糊状态机 - 通常在关键步骤之间有时间延迟和/或状态检查。
    请参阅下面的中级示例代码。
  2. 像Patreon这样的网站尤其令人费解。
  3. 从理论上讲,网站可以完全阻止这种情况,因为用户脚本无法创建trusted事件 - 特别是键盘事件。
  4. 无论如何,不要在USERSCRIPT中提出帐户凭证!
    不要相信我的话,查一查......
    至少使用an encrypted framework
  5. 聪明的做法是使用密码管理器。例如,KeePass'“双通道自动类型混淆”会破坏大多数这些cr * ppy登录。 KeePass是开源的。

    如果您不使用良好的密码管理器,则需要 种类 代码示例。
    这适用于我当地的超市。 对于像许多银行这样的更难的网站来说,这还不够。对于任何其他网站来说,它可能无法正常工作。见上面的#1。

    function loginSite () {
        //--- Set username and password, from decrypted values. ---
        $("div.input_box_div #userId").attr ('value', usr);
        $("div.input_box_div #password").attr ('value', pword);
    
        //--- New style login page, approx 10/28/16...
        $('#keepMeSignedIn').prop ('checked', true);
        $("#input-email").attr ('value', usr);
        $("#password-password").attr ('value', pword);
        $("#show-password-checkbox")[0].click (); //-- This is needed for blur hack!!!?!?!
    
        setTimeout (function () {
            changeAndBlur ("#input-email");
            changeAndBlur ("#input-password");
        }, 400);
    
        waitForKeyElements ("#create-account-btn", clickWhenPrimed, true);
    }
    
    function changeAndBlur (jSelector) {
        let node    = $(jSelector);
        if (node.length) {
            var evChng  = new Event("change");
            node[0].dispatchEvent (evChng);
            var evBlur  = new Event("blur");
            node[0].dispatchEvent (evBlur);
        }
    }
    
    function clickWhenPrimed (jNode) {
        if (jNode.css("background-color") == "rgb(228, 23, 32)") {
          click_jNode (jNode);
        }
        else
            return true;
    }
    

    请注意,对于所有其他网站,我个人使用密码管理器,可以自动填充我使用的每个网页登录(到目前为止,并进行一些调整)。

    1 这样的网站/应用程序很烦人且危险,因为它们削弱了密码管理器的功能。 NIST has recently disapproved of password manager blocking。因此,向有罪的组织大力抱怨并支持您的管辖区可能允许长期短语和密码管理员的任何未决法律/法规。

答案 1 :(得分:0)

感谢Brock的投入,我获得了成功。谢谢!适用于ESXi版本:6.5.0,客户端版本:1.18.0。

更改和模糊事件成功​​启用了提交按钮。

function loginSite() {
    waitForKeyElements("#username", function(jNode) {jNode.val(username);}, true);
    waitForKeyElements ("#password", function(jNode) {jNode.val(password);}, true);
    setTimeout(function() {
        changeAndBlur("#username");
        changeAndBlur("#password");
    }, 400);
}

function changeAndBlur(jSelector) {
    let node = $(jSelector);
    if (node.length) {
        var evChng = new Event("change");
        node[0].dispatchEvent(evChng);
        var evBlur = new Event("blur");
        node[0].dispatchEvent(evBlur);
    }
}

waitForKeyElements("#submit", loginSite, true);