Обнаружение полей входа - PullRequest
4 голосов
/ 26 марта 2009

Можно ли как-нибудь обнаружить поля входа на ЛЮБОМ сайте, используя javascript? IE и Firefox имеют возможность «запомнить» мое имя пользователя и пароль. Я хотел бы создать сценарий, который копировал бы эту функциональность. Так, например, когда я представляю страницу входа в GMail, как я могу «найти» поле имени пользователя и пароля и получить / установить их?

Ответы [ 5 ]

3 голосов
/ 27 марта 2009

Базовая схема:

  1. Соберите все поля пароля
  2. Перебрать все из них
  3. На каждой итерации:
    1. Найдите , что поле пароля является частью
    2. Найдите первое поле ввода в форме, которое 1) не поле пароля и 2) не что иное, как type = "text"
  4. Возвращает массив всех пар имя пользователя / пароль

Пример вывода:

[ [ <input id="username" /> , <input type="password" id="pswd" /> ] ]

Он выведет массив пар, каждая пара содержит узел имени пользователя и пароля. Очевидно, что на большинстве страниц вы получите только одну пару, потому что есть только один раздел для входа.


Вот оно:

function getLoginFields() {
    var fieldPairs = [],
        pswd = (function(){
            var inputs = document.getElementsByTagName('input'),
                len = inputs.length,
                ret = [];
            while (len--) {
                if (inputs[len].type === 'password') {
                    ret[ret.length] = inputs[len];
                }
            }
            return ret;
        })(),
        pswdLength = pswd.length,
        parentForm = function(elem) {
            while (elem.parentNode) {
                if(elem.parentNode.nodeName.toLowerCase() === 'form') {
                    return elem.parentNode;
                }
                elem = elem.parentNode;
            }
        };
    while (pswdLength--) {
        var curPswdField = pswd[pswdLength],
            parentForm = parentForm(curPswdField),
            curField = curPswdField;
        if (parentForm) {
            var inputs = parentForm.getElementsByTagName('input');
            for (var i = 0; i < inputs.length; i++) {
                if (inputs[i] !== curPswdField && inputs[i].type === 'text') {
                    fieldPairs[fieldPairs.length] = [inputs[i], curPswdField];
                    break;
                }
            }
        }
    }
    return fieldPairs;
}

// Usage:
var loginFields = getLoginFields()[0]; // or loop through results.

Успешно протестировано на Yahoo, Amazon, Google, Youtube ... (различные учетные записи / страницы входа)

2 голосов
/ 01 сентября 2015
// Locate the username field in the form by searching backwards
// from the first passwordfield, assume the first text field is the
// username. We might not find a username field if the user is
// already logged in to the site.
for (var i = pwFields[0].index - 1; i >= 0; i--) {
  if (form.elements[i].type == "text") {
    usernameField = form.elements[i];
    break;
  }
}

Вот как Firefox делает: http://mxr.mozilla.org/firefox/source/toolkit/components/passwordmgr/src/nsLoginManager.js#655

2 голосов
/ 26 марта 2009

Ну, один из методов (который я почти уверен, что использует один из браузеров) - найти первый , а затем найти перед ним. .

1 голос
/ 26 марта 2009

AFAIK, средства определения паролей в IE и Firefox основаны на имени поля, то есть запрашивают, есть ли у вас имя пользователя и / или пароль в идентификаторе.

если вы используете jQuery, вы можете использовать что-то вроде.

$('input[id*=username]').css('background', 'red');
// or
$('input[id*=password]').css('background', 'red');

Кроме того, вы можете проверить любые поля пароля с помощью jQuery по

$(':password').css('background', 'red');
0 голосов
/ 26 марта 2009

Я думаю, что функция «Запоминание пароля / пользователя» в браузерах вызвана наличием поля ввода типа пароля в форме.

Следующее, что вам нужно сделать, это найти наиболее распространенные поля для входа name d 'login', 'user', 'username', 'j_username' (в случае, если JAAS на основе сайта). Если нет, просто сохраните все поля ввода текста. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...