dipnl / wappalyzer

Identify technology on websites.
https://www.wappalyzer.com
2 stars 1 forks source link

Meer/beter redirects volgen #1

Open rudiedirkx opened 12 months ago

rudiedirkx commented 12 months ago

De url https://gebiedsprofielen.zuid-holland.nl/ zou een IPROX-CMS website moeten zijn (ook volgens WhatCMS).

Wappa patterns zouden voldoende moeten zijn, maar toch krijg je een leeg resultaat:

Ik kreeg net 1 keer een alleen-server resultaat:

$ node node_modules/wappalyzer/cli.js 'https://gebiedsprofielen.zuid-holland.nl/' --pretty -e -d
log | driver | Launching browser (attempt 1)...
log | driver | Setting storage...
log | driver | Navigate to https://gebiedsprofielen.zuid-holland.nl/
log | driver | Page closed (https://gebiedsprofielen.zuid-holland.nl/)
{
  "urls": {
    "https://gebiedsprofielen.zuid-holland.nl/": {
      "status": 200
    }
  },
  "technologies": [
    {
      "slug": "hsts",
      "name": "HSTS",
      "description": "HTTP Strict Transport Security (HSTS) informs browsers that the site should only be accessed using HTTPS.",
      "confidence": 100,
      "version": null,
      "icon": "default.svg",
      "website": "https://www.rfc-editor.org/rfc/rfc6797#section-6.1",
      "cpe": null,
      "categories": [
        {
          "id": 16,
          "slug": "security",
          "name": "Security"
        }
      ],
      "rootPath": true
    }
  ],
  "patterns": {
    "HSTS": [
      {
        "type": "headers",
        "regex": "(?:)",
        "value": "max-age=31536000",
        "match": "",
        "confidence": 100,
        "version": "",
        "implies": [],
        "excludes": []
      }
    ]
  }
}
log | driver | Browser disconnected
log | driver | Browser closed

maar nu niet eens meer dat.

Die redirect is ook wel heel raar IMO, daar gaat Wappa misschien niet 'goed' mee om. De response is technisch een 200, maar wel alleen:

<meta http-equiv="refresh" content="0; URL=https://www.zuid-holland.nl/onderwerpen/ruimte/ruimtelijkekwaliteit/gebiedsprofielen/" />

Die 'redirect' volgt Wappa niet denk ik.

rudiedirkx commented 11 months ago

Worden ook niet volledig gevolgd zoals in een echte browser:

simonbesters commented 7 months ago

Nadat de response binnen is gaat het script te snel door, waardoor zelfs een meta refresh 0 niet uitgevoerd kan worden. Als ik daar een sleep van 1s aan toevoeg worden ze wel uitgevoerd voor:

https://gebiedsprofielen.zuid-holland.nl/ https://ltc.andes.nl/

uit driver.js

page.on('response', async (response) => {
      if (!page || page.__closed || page.isClosed()) {
        return
      }

      await sleep(1000)

      try {
        if (
          response.status() < 300 &&
          response.frame().url() === url.href &&
          response.request().resourceType() === 'script'
        ) {
          const scripts = await response.text()

          await this.onDetect(response.url(), analyze({ scripts }))
        }
      } catch (error) {
        if (error.constructor.name !== 'ProtocolError') {
          error.message += ` (${url})`

          this.error(error)
        }
      }

      try {
        if (response.url() === url.href) {
          this.analyzedUrls[url.href] = {
            status: response.status(),
          }

          const rawHeaders = response.headers()
          const headers = {}

          Object.keys(rawHeaders).forEach((key) => {
            headers[key] = [
              ...(headers[key] || []),
              ...(Array.isArray(rawHeaders[key])
                ? rawHeaders[key]
                : [rawHeaders[key]]),
            ]
          })

          // Prevent cross-domain redirects
          if (response.status() >= 300 && response.status() < 400) {
            if (headers.location) {
              const _url = new URL(headers.location.slice(-1), url)

              const redirects = Object.keys(this.analyzedUrls).length - 1

              if (
                _url.hostname.replace(/^www\./, '') ===
                  this.originalUrl.hostname.replace(/^www\./, '') ||
                (redirects < 3 && !this.options.noRedirect)
              ) {
                url = _url

                return
              }
            }
          }

          responseReceived = true

          const certIssuer = response.securityDetails()
            ? response.securityDetails().issuer()
            : ''

          await this.onDetect(url, analyze({ headers, certIssuer }))

          await this.emit('response', { page, response, headers, certIssuer })
        }
      } catch (error) {
        error.message += ` (${url})`

        this.error(error)
      }
    })
simonbesters commented 7 months ago

de sleep na de response helpt (lokaal getest) ook bij #3

rudiedirkx commented 7 months ago

Sleep is juist wat de dip Cookies checker kapot maakte, dus had ik eruit gehaald. Remember? Dat zou ik hier niet in stoppen, of alleen met heel heel veel testen, en dan wil ik dat het in de Cookies checker ook werkt op die manier, zodat we snappen waarom.

simonbesters commented 7 months ago

Sleep is juist wat de dip Cookies checker kapot maakte, dus had ik eruit gehaald. Remember?

Ohja, nu je het zegt. Maar dat issue heb ik me uiteindelijk niet echt mee bemoeid.

Dat zou ik hier niet in stoppen, of alleen met heel heel veel testen, en dan wil ik dat het in de Cookies checker ook werkt op die manier, zodat we snappen waarom.

Ik wil nog wel een keertje wat tests doen. Puppeteer headless blijft wel echt eigenaardigheden houden.

rudiedirkx commented 7 months ago

Er bestaat een defer optie:

--defer=ms                 Defer scan for ms milliseconds after page load

Misschien doet dat al genoeg?


Die wordt gebruikt in cli.js en doet ie maar 1x, niet per pagina. WAATTT hoe werkt Wappa??

simonbesters commented 7 months ago

de --defer of --delay optie werken beide niet.

simonbesters commented 7 months ago
if (
          (responseReceived && request.isNavigationRequest()) ||
          request.frame() !== page.mainFrame() ||
          !['document', ...(this.options.noScripts ? [] : ['script']), 'fetch'].includes(
            request.resourceType()
          )
        ) {
          request.abort('blockedbyclient')

De meta refresh wordt geblockt door responseReceived && request.isNavigationRequest(). Waarschijnlijk om redirects te voorkomen nadat hij al is begonnen met analyzeren (responseReceived = true). Mijn voorgestelde sleep zorgt dat het 1s langer duurt voor dat responseReceived = true bereikt wordt.

rudiedirkx commented 7 months ago

Waarschijnlijk om redirects te voorkomen nadat hij al is begonnen met analyzeren (responseReceived = true).

Ik vind het juist goed dat ie redirects volgt... Van mij mag ie lekker blijven redirecten. Als ie maar snapt wanneer ie klaar is.

Mijn voorgestelde sleep zorgt dat het 1s langer duurt voor dat responseReceived = true bereikt wordt.

Ooooooh. Dat is te hacky en raar en superverwarrend. Dat snappen we over 6 maanden niet meer. Wat mij betreft halen we de responseReceived check er gewoon uit. En dan heel goed testen, want misschien krijgen we dan al die Cookies "page seems closed" achtige meldingen weer.

Misschien is dat wel waarom ie erin staat! Maar dan zou jouw sleep het ook kapot moeten maken, want dan volgt ie die redirects weer......

simonbesters commented 7 months ago

Van mij mag ie lekker blijven redirecten. Als ie maar snapt wanneer ie klaar is.

Ik ook, ik gaf alleen aan wat ik denk dat de intentie is geweest.

Dat is te hacky en raar en superverwarrend.

Ongetwijfeld.

rudiedirkx commented 7 months ago

Ik ook, ik gaf alleen aan wat ik denk dat de intentie is geweest.

Maar waarom? Redirecten stoppen was niet het doel, maar een manier (denk ik). Waarom is Elbert tegen redirects? Omdat het kapot ging op de Cookies manier, of omdat een redirect naar een ander domein zou kunnen gaan, of heeft ie gewoon een irrationele haat jegens ReDiReCtS?