Кукловод: добавьте заголовок basi c auth только для домена главной страницы, а не для сторонних запросов - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь заставить кукловода отправить заголовок Authorization, не получив вызова, только для запросов 1-й / 2-й стороны - ie не третьим сторонам и без непредвиденных последствий . Основные цели - аутентифицироваться там, где это необходимо, и избежать утечки убийственной комбинации Authorization + Referer

Использование page.authenticate() не сработает, потому что это требует проблем. Использование page.setExtraHTTPHeaders() устанавливает заголовок, но затем отправляет его третьим лицам. Использование page.setRequestInterception() позволяет мне ввести некоторые условные логики c и действительно решает основные задачи, но, похоже, добавляет кучу сложности и непредвиденных последствий (например, в отношении кеширования).

Мои особенности c пример использования связан с веб-шрифтами, fwiw.

Вот как я подтвердил, что дополнительный заголовок отправляется третьей стороне с помощью page.setExtraHTTPHeaders (в данном случае httpbin)

Подавать простая страница с iframe для httpbin.org/headers:

var http = require('http')

http.createServer(function (request, response) {
    console.log(request.headers)
    response.writeHead(200)
    response.end('<iframe src="http://httpbin.org/headers" width="100%" height="100%"></iframe>\n')
}).listen(8000)

Используйте puppeteer для получения этой страницы:

const puppeteer = require('puppeteer');
const url = 'http://localhost:8000';

(async () => {
  const browser = await puppeteer.launch()

  const page = await browser.newPage()

  await page.setExtraHTTPHeaders({ Authorization: 'Basic dXNlcjpwYXNz' })
  //await page.authenticate({ username: 'user', password: 'pass' })
  await page.goto(url)
  await page.screenshot({path: '/tmp/headers.png'})

  await browser.close()
})()

Содержимое ответа httpbin.org/headers (захвачено на провод с tcpflow -c):

 {
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", 
    "Accept-Encoding": "gzip, deflate", 
    "Accept-Language": "en-GB", 
    "Authorization": "Basic dXNlcjpwYXNz",  <----- Authorization is forwarded
    "Host": "httpbin.org", 
    "Referer": "http://localhost:8000/", 
    "Upgrade-Insecure-Requests": "1", 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/83.0.4103.0 Safari/537.36", 
    "X-Amzn-Trace-Id": "Root=1-5ecdb903-0c61b77370a47d894aa8aa7c"
  }
}
...