2017-11-08 18 views
1

자격 증명으로 ESXi 로그인 웹 페이지를 자동 완성하는 greasemonkey 스크립트를 작성하려고합니다. 다음 코드는 입력 필드를 채우고 제출 버튼 수 : 나는 자격 증명이 올바른지에도 불구하고 Cannot complete login due to an incorrect user name or password. 참조 제출 버튼을 클릭 한 후, 불행하게도ESXi 웹 클라이언트 자동 채우기 자격 증명

// ==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. 이론적으로 사이트가 이것을 완전히 차단할 수 있습니다. 왜냐하면 userscripts는 trusted 이벤트 (특히 키보드 이벤트)를 만들 수 없기 때문입니다.
  4. 아무렇지도 않게, 사용자 크레딧에 크레디트 크레딧을 입력하지 마십시오!
    내 말을 듣지 마라.
    최소한 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; 
} 

참고. 그들은 암호 관리자의 기능을 무력화으로 성가신과 위험한 애플 리케이션처럼


1 사이트 /. 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);