Создайте Firefox-аддон, чтобы исправлять сломанную веб-страницу на лету

На моей работе они используют средство "централизованного входа" на внутренние веб-страницы. Всякий раз, когда внутренняя веб-страница требует аутентификации, она перенаправляет вас в центральный логин, и после входа в систему он отправляет вас обратно на страницу, которую вы пытаетесь просмотреть.

Самая первая строка в HTML для этой центральной страницы входа начинается с этого:

<!-- Encoding=ISO-8859-1;

Но это никогда завершает комментарий, а это означает, что весь HTML-код во всем документе фактически закомментирован. Это отлично работает в IE6 (который является стандартом компании - eek!), И он работал в Firefox, но когда я обновился до Firefox 4, это больше не работает (как и не должно - это следующие стандарты).

Я сохранил источник и изменил первую строку на:

<!-- Encoding=ISO-8859-1; -->

И тогда будет отображаться страница, но поскольку она загружается из file:///, я не могу отправить свои учетные данные на главный сервер...

Я ненавижу использование IE6, но для всех внутренних страниц я застрял в нем, потому что Firefox делает пустую страницу каждый раз, когда я отправляюсь в центральный логин.

Возможно ли создать аддон Firefox (или даже Greasemonkey script), чтобы изменить HTML, когда он входит в браузер, прежде чем он будет отображаться? Я вижу множество примеров модификации HTML, когда он уже загружен, но не может найти что-либо, чтобы манипулировать при загрузке.

Я думаю, что я открыт для других решений, кроме аддона, но это единственное, о чем я мог подумать. Кроме того, нам запрещено использовать Chrome или Safari, так что это невозможно. И нет, я не могу поговорить с ответственным за центральную страницу входа и заставить их изменить ее. Проксирование, вероятно, будет очень сложно также из-за характера страницы.

Спасибо заранее!

Ответ 1

Может быть, для этого можно использовать локальный Apache с mod_proxy и mod_subsitute? Выведенный из примера из berkek.com:

<VirtualHost *>
  ServerAdmin [email protected]
  ServerName www.yourcompany.com
  <Proxy *>
    Order deny,allow
  </Proxy>
  ProxyRequests on
  ProxyPass / http://www.yourcompany.com/
  ProxyPassReverse / http://www.yourcompany.com/
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|<!-- Encoding=ISO-8859-1;|<!-- Encoding=ISO-8859-1; -->|n"
</VirtualHost>

Ответ 2

Вот метод, который я нашел:

Fiddler Web Debugging Proxy. Это в основном делает то, что предложил @Tatu Lahtela и что @alex , только без apache.

Вот шаги, которые я сделал:

  • Загрузить и установить Fiddler
  • Запустить Fiddler, который прослушивает порт 8888 (по умолчанию)
  • В параметрах Fiddler (вкладка HTTPS) установите флажок "Расшифровать протокол HTTPS"
  • В Fiddler нажмите меню "Правила", затем "Настроить правила".
  • В текстовом редакторе я нашел функцию OnBeforeResponse и добавил этот код:

    if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")){
      // Remove any compression or chunking    
      oSession.utilDecodeResponse();
    
      var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
    
      var oRegEx = /<!-- Encoding=ISO-8859-1; /gi;
      oBody = oBody.replace(oRegEx, "<!-- Encoding=ISO-8859-1;  -->");
    
      oSession.utilSetResponseBody(oBody);
    }
    
  • В Fiddler на вкладке Инструменты- > Параметры- > Подключения щелкните "Копировать URL-адрес прокси-сервера браузера" (это файл PAC-прокси, о котором упоминал @Tatu Lahtela).

  • В Firefox, Tools- > Options- > Advanced Tab- > Network Tab- > Settings, проверьте URL-адрес автоматической настройки прокси-сервера и вставьте URL-адрес с шага # 6.
  • Погрузитесь в сеть!

Я изменил файл PAC, чтобы ограничить сайты, которые попадали на Fiddler, как предложил @Tatu Lahtela.

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

Спасибо всем, кто помог! Я буду отмечать @Tatu Lahtela ответ как принятый ответ, так как именно так я смог найти то, что мне было нужно.

Ответ 3

Каковы ваши причины не использовать прокси?

Apache httpd + mod_proxy + mod_ext_filter должен легко решить ваши проблемы; вы используете mod_ext_filter для подключения программы, которая будет исправлять страницу (должна выполняться небольшая оболочка script).

Ответ 4

Вы можете сделать это в аддоре Firefox, но это довольно много работы. http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/ показывает вам, что делать, за исключением того, что вместо того, чтобы просто принимать входящие данные, хранить их в массиве и отправлять обратно на originalListener, вам необходимо отправить измененные данные (в вашем случае данные с добавлением -->) в originalListener.