2017-11-08 29 views
1

資格情報でESXiログインWebページを自動入力するgreasemonkeyスクリプトを作成しようとしています。次のコードは、入力フィールドを記入し、投稿ボタンを有効にします。私は資格情報が正しいにもかかわらずCannot complete login due to an incorrect user name or password.参照送信ボタンをクリックした後、残念ながらESXi Webクライアントの自動資格情報

// ==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); 
} 

を。

おそらく問題は、送信ボタンを有効にしていることです。ログインページでは、ユーザがユーザー名フィールドに何かを入力すると、ログインページが有効になります。残念ながら、スクリプトはこの動作を引き起こしません。スクリプトを有効にすると、ログインページに行き、ユーザー名とパスワードフィールドの最後の文字を再入力するとログインが成功することが分かりました。

送信ボタンをオンにする方法で入力フィールドを埋める方法はありますか?

答えて

1

これは厄介な最悪の事実であり、通常はユーザーイベントを偽装する必要があります。

  1. 必要なものの詳細は、サイト/アプリ固有のものです(また、いつでもすぐにesxiで遊びません)。
    時にはchangeイベントを送信するだけでよい場合もあります。場合によっては、マウスの全体、キーダウン/プレス/アップ、マウスアウト、ぼかし状態マシンを偽造する必要があります - 多くの場合、時間の遅れやキーステップ間の状態チェックが必要です。
    中間レベルのサンプルコードについては下記を参照してください。
  2. 一部のサイトは、Patreonのように、特に複雑です。
  3. 理論的にはサイトでこれを完全にブロックすることは可能です。なぜならユーザースクリプトはtrustedイベント(特にキーボードイベント)を作成できないからです。
  4. 違反、USERSCRIPTにアカウントクレデンシャルを載せないでください!
    私の言葉はそれを見て、それを見てください...
    少なくとも、an encrypted frameworkを使用してください。

スマートなことは、にパスワードマネージャを使用することです。たとえば、KeePass「2チャネル自動タイプ難読化」は、これらの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; 
} 

他のすべてのサイトのために、私は個人的に私は(今のところ、およびいくつかの調整で)を使用するすべてのWebページログインを自動入力できるパスワードマネージャを使用することに注意してください。彼らは、パスワードマネージャの機能を損なうように、そのような


サイト/アプリは迷惑と危険です。 NIST has recently disapproved of password manager blocking。したがって、貴重な組織に積極的に訴え、あなたの司法権がロングパスフレーズとパスワード管理者の両方を許可しなければならない係属中の法律/規則をサポートします。

+0

ありがとう、メイト! changeAndBlurがトリックをしました。私は疑問に思っています - なぜ開発者はこのプラクティスに従っていますか?セキュリティを強化することですか?悪意のあるコーダーは、いつもそのような "機能"を回避する方法を常に見つけるでしょう。 – Mirek

+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); 
関連する問題