Как я могу заменить navigator.credentials.create параметры запроса или ответа через расширение Chrome? - PullRequest
1 голос
/ 05 февраля 2020

Я работаю над расширением chrome для изменения параметров запроса создания U2F из веб-службы. Можно ли заменить navigator.credentials.create параметры запроса или ответа через расширение Chrome? Я не мог найти ресурсы, связанные с этим. Любые указатели были бы полезны.

В частности, когда пользователь регистрирует U2F для веб-сайта, он вызывает браузер веб-API navigator.credentials.create, который, в свою очередь, связывается с аппаратным токеном и возвращает ответ. Я хочу изменить запрос и ответ от navigator.credentials.create API, вызываемого веб-страницей.

1 Ответ

1 голос
/ 12 февраля 2020

Невозможно достичь того, чего вы хотите, с помощью Chrome API. Chrome не предлагает никаких API-интерфейсов для изменения запросов или других данных «на лету», как вы бы хотели. Я могу только предположить, что это, скорее всего, мера безопасности.

Однако, поскольку вы говорите, что хотите изменить данные, которые передаются и возвращаются navigaror.credentials.create() на каком-то конкретном веб-сайте, вы можете легко это сделать. со скриптом содержимого, который заменяет функцию пользовательским обработчиком и действует как прокси, перехватывая все вызовы и потенциально изменяя данные.

Имеет ли это какой-либо смысл или нет, зависит от того, что конкретно вы хотите делать при перехвате этих звонки. Важно отметить, что, поскольку @ gcochard заставляет нас заметить в комментарии:

Весь смысл U2F / WebAuthN состоит в том, чтобы создать криптографически безопасную схему запроса / ответа для строгой аутентификации через Интернет. Вставка прокси-сервера и изменение запроса и ответа нарушит эту криптографию c вызов / ответ в любом контексте, где вы не являетесь MITM, и ваши пользователи будут зависеть от вашего расширения для аутентификации. Это может помочь объяснить, что вы пытаетесь сделать с этими данными.

В любом случае, вы все равно можете регистрировать и получать доступ к данным, так что может быть значимым применением эта стратегия.

Я только обрисую, что должен делать скрипт контента, если вы также не знаете, как внедрить скрипт контента на страницу, обратитесь к этой странице документации . В любом случае вы хотите, чтобы ваш сценарий запускался как можно скорее , поэтому убедитесь, что у вас есть "run_at": "document_start".

Сценарий содержимого будет выполнять следующее:

  1. Создайте тег <script> внутри страницы, загружая в него некоторый код, который будет:
  2. Сохранить метод create() для navigator.credentials в другой переменной.
  3. Заменить оригинальный метод create() с функцией, которая «фильтрует» сделанные ему вызовы и внутренне вызывает реальный метод.

Итак, вот простой скрипт содержимого, который достигает вашей цели:

const code = `
    const real_create = navigator.credentials.create.bind(navigator.credentials);

    navigator.credentials.create = function() {
        // Modify the arguments how you want.
        console.log(arguments);

        // Call the real method with the modified arguments.
        let res = real_create.apply(arguments);

        // Modify the return value how you want, then return it.
        console.log(res);
        return res;
    }
`;

const script = document.createElement('script');
script.textContent = code;
(document.documentHead || document.documentElement).appendChild(script);
script.remove();

Вышесказанное должно делать именно то, что вы хотите, это всего лишь вопрос вставки его на нужную страницу.

ПРИМЕЧАНИЕ: переменная code создается с использованием строкового литерала шаблона, разделенного символами `, если вы не хотите использовать литералы шаблона, вы можете использовать массив строк и затем присоединиться к нему. Вы также можете обратиться к этому ответу , в котором перечислены другие способы внедрения кода на страницу из сценария содержимого.

...