
Varredura de cobertura de autorização de aplicações web
Varredura de cobertura de autorização de aplicativos web.

O AuthCov rastreia sua aplicação web usando um navegador Chrome headless enquanto está logado como um usuário pré-definido. Ele intercepta e registra requisições de API, bem como páginas carregadas durante a fase de rastreamento. Na próxima fase, ele faz login com uma conta de usuário diferente, o "intruso", e tenta acessar cada uma das requisições de API ou páginas descobertas anteriormente. Ele repete essa etapa para cada usuário intruso definido. Finalmente, gera um relatório detalhado listando os recursos descobertos e se são ou não acessíveis aos usuários intrusos.
Um exemplo de relatório gerado a partir da varredura de uma instância local do Wordpress:

Instale a versão mais recente do Node. Em seguida, execute:
$ npm install -g authcov
.mjs]:$ authcov new myconfig.mjs
$ authcov test-login myconfig.mjs --headless=false
$ authcov crawl myconfig.mjs
$ authcov intrude myconfig.mjs
./tmp/report/index.htmlAs seguintes opções podem ser definidas no seu arquivo de configuração:
Configurando o Login
Existem duas maneiras de configurar o login no seu arquivo de configuração:
loginConfig no seu arquivo de configuração desta forma. Veja também este exemplo."loginConfig": {
"url": "http://localhost/login",
"usernameXpath": "input[name=email]",
"passwordXpath": "input[name=password]",
"submitXpath": "#login-button"
}
"loginFunction": async function(page, username, password){
await page.goto('http://localhost:3001/users/sign_in');
await page.waitForSelector('input[type=email]');
await page.waitForSelector('input[type=password]');
await page.type('input[type=email]', username);
await page.type('input[type=password]', password);
await page.tap('input[type=submit]');
await page.waitFor(500);
return;
}
Não se esqueça de executar o comando authcov test-login no modo headful para verificar se o navegador faz login com sucesso.
Clone o repositório e execute npm install. É melhor usar a versão 17.1.0 do Node.
Testes Unitários
Testes unitários:
$ npm test test/unit
Testes End-to-End:
Primeiro, baixe e execute o aplicativo de exemplo. Depois execute os testes:
$ npm test test/e2e
| opção | tipo | descrição |
|---|
| baseUrl | string | A URL base do site. É daqui que o rastreador começará. |
| crawlUser | object | O usuário para rastrear o site. Exemplo: {"username": "admin", "password": "1234"} |
| intruders | array | Os usuários que farão a intrusão nos endpoints de API e páginas descobertas durante a fase de rastreamento. Geralmente, esses serão usuários com o mesmo privilégio ou menor que o crawlUser. Para fazer a intrusão como um usuário não logado, adicione um usuário com o nome de usuário "Public" e senha null. Exemplo: [{"username": "john", "password": "4321"}, {"username": "Public", "password": null}] |
| type | string | É uma aplicação de página única (ou seja, frontend javascript que consulta um backend de API) ou uma aplicação multipáginas mais "tradicional". (Escolha "mpa" ou "spa"). |
| authenticationType | string | O site autentica usuários usando cookies enviados pelo navegador ou um token enviado em um cabeçalho de requisição? Para um MPA, isso quase sempre será definido como "cookie". Em um SPA, pode ser "cookie" ou "token". |
| authorisationHeaders | array | Quais cabeçalhos de requisição são necessários para autenticar um usuário? Se authenticationType=cookie, então isso deve ser definido como ["cookie"]. Se authenticationType=token, então será algo como: ["X-Auth-Token"]. |
| maxDepth | integer | A profundidade máxima para rastrear o site. Recomenda-se começar em 1 e depois tentar profundidades maiores para garantir que o rastreador consiga terminar rápido o suficiente. |
| verboseOutput | boolean | Registre em nível detalhado, útil para depuração. |
| saveResponses | boolean | Salve os corpos das respostas dos endpoints de API para que você possa visualizá-los no relatório. |
| saveScreenshots | boolean | Salve capturas de tela do navegador para as páginas rastreadas, para que você possa visualizá-las no relatório. |
| clickButtons | boolean | (Funcionalidade experimental) em cada página rastreada, clique em todos os botões da página e registre quaisquer requisições de API feitas. Pode ser útil em sites que tenham muitas interações do usuário através de modais, popups etc. |
| xhrTimeout | integer | Quanto tempo esperar para que as requisições XHR sejam concluídas durante o rastreamento de cada página. (segundos) |
| pageTimeout | integer | Quanto tempo esperar para que a página carregue durante o rastreamento. (segundos) |
| headless | boolean | Defina como false para que o rastreador abra um navegador Chrome e você possa ver o rastreamento acontecendo ao vivo. |
| unAuthorizedStatusCodes | array | Os códigos de status de resposta HTTP que decidem se um endpoint de API ou página é autorizado para o usuário que o solicita. Opcionalmente, defina uma função responseIsAuthorised para determinar se uma requisição foi autorizada. Exemplo: [401, 403, 404] |
| ignoreLinksIncluding | array | Não rastreie URLs que contenham qualquer string neste array. Por exemplo, se definido como ["/logout"], então a URL: http://localhost:3000/logout não será rastreada. Opcionalmente, defina uma função ignoreLink(url) abaixo para determinar se uma URL deve ser rastreada ou não. |
| ignoreAPIrequestsIncluding | array | Não registre registros de API feitos para URLs que contenham qualquer uma das strings neste array. Opcionalmente, defina uma função ignoreApiRequest(url) para determinar se uma requisição deve ser registrada ou não. |
| ignoreButtonsIncluding | array | Se clickButtons estiver definido como true, não clique em botões cujo HTML externo contenha qualquer uma das strings neste array. Opcionalmente, defina uma função ignoreButton(url) abaixo. |
| loginConfig | object | Configure como o navegador fará login no seu aplicativo web. Opcionalmente, defina uma função assíncrona loginFunction(page, username, password). (Mais sobre isso abaixo). |
| cookiesTriggeringPage | string | (opcional) quando authenticationType=cookie, isso definirá uma página para que o intruso navegue até ela e então capture os cookies do navegador. Isso pode ser útil se o site definir o campo path nos cookies. O padrão é options.baseUrl. |
| tokenTriggeringPage | string | (opcional) quando authenticationType=token, isso definirá uma página para que o intruso navegue até ela e então capture os authorisationHeaders das requisições de API interceptadas. Isso pode ser útil se a baseUrl do site não fizer requisições de API e, portanto, não puder capturar os cabeçalhos de autenticação dessa página. O padrão é options.baseUrl. |