Skip to content

Commit

Permalink
feat(security): incluir cabeçalhos de segurança e configuração
Browse files Browse the repository at this point in the history
  • Loading branch information
PauloGoncalvesBH committed May 22, 2020
1 parent 0acc7f3 commit 9342cac
Show file tree
Hide file tree
Showing 6 changed files with 2,130 additions and 1,678 deletions.
38 changes: 29 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,11 @@ npx serverest@2
Dispõe de um servidor REST com dados de e-commerce fictício, permitindo o estudo do uso de:
- Verbos *GET, POST, PUT* e *DELETE*
- Autenticação no header
- Boas práticas de segurança
- Query string
- Contrato
- Manipulação de resposta
- Requisições aninhadas

## Links

- **[Histórico de alterações](/CHANGELOG.md)**
- [Código de conduta](/CODE_OF_CONDUCT.md)
- [Como contribuir](/CONTRIBUTING.md)
---

## Rotas disponíveis

Expand Down Expand Up @@ -57,10 +52,29 @@ npx serverest -h

![Informação de opções e exemplos fornecidos no terminal](./img/terminalHelp.png)

---

</details>

### Segurança (`--nosec`)

É boa prática que as APIs, na resposta, enviem determinados cabeçalhos e suprimam outros visando a segurança da aplicação.

Por default, o _ServeRest_ irá fazer as seguintes alterações de segurança, que podem ser desabilitadas com `npx serverest --nosec`:

**Cabeçalhos adicionados:**
- `Strict-Transport-Security: max-age=15552000; includeSubDomains`
- `X-Content-Type-Options: nosniff`
- `X-DNS-Prefetch-Control: off`
- `X-Download-Options: noopen`
- `X-Frame-Options: SAMEORIGIN`
- `X-XSS-Protection: 1; mode=block`

**Cabeçalho removido:**
- `X-Powered-By: Express`

Utilize esse comportamento para realizar testes de segurança, validando a presença/ausência desses cabeçalhos.

> Para saber mais leia o [checklist de segurança de API](https://github.com/shieldfy/API-Security-Checklist#api-security-checklist)
## (Dica) Gerenciando versão

Como o comando `npx serverest` sempre executa a última versão disponibilizada, é interessante fixar qual versão que deseja utilizar, pois pode ocorrer da sua automação funcionar na versão `2.X.X` e ter sido disponibilizada a versão `3.X.X`, o que pode resultar na quebra dos seus testes.
Expand All @@ -79,6 +93,12 @@ npx serverest@2
npx serverest@1
```

## Links

- [Histórico de alterações](/CHANGELOG.md)
- [Código de conduta](/CODE_OF_CONDUCT.md)
- [Como contribuir](/CONTRIBUTING.md)

## Licença

[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FPauloGoncalvesBH%2Fserverest.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FPauloGoncalvesBH%2Fserverest?ref=badge_large)
17 changes: 11 additions & 6 deletions bin/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,40 @@ const debug = require('debug')('nodestr:server')
const http = require('http')
const open = require('open')

const app = require('../src/app')
const { conf } = require('../src/utils/conf')

const argv = require('yargs')
.default({
porta: conf.porta,
timeout: conf.tokenTimeout
})
.boolean('nodoc')
.boolean(['nodoc', 'nosec'])
.number(['timeout', 'porta'])
.alias('p', 'porta')
.alias('t', 'timeout')
.alias('n', 'nodoc')
.alias('s', 'nosec')
.alias('h', 'help')
.alias('v', 'version')
.usage('\nAjuda do ServeRest')
.describe('p', 'Porta que será utilizada (default: 3000)')
.describe('t', 'Timeout do token em milissegundos (default: 1000)')
.describe('s', 'Não enviar os headers de segurança na resposta')
.describe('n', 'Desabilitar o início automático da documentação')
.example('npx serverest -p 3500', 'Em execução na porta 3500')
.example('npx serverest --nodoc -t 20000', 'Documentação não abrirá e token terá 20 segundos de timeout')
.help('h')
.epilog('As rotas disponíveis estão listadas na documentação.')
.epilog('Precisa de ajuda?')
.epilog('Abra uma issue em github.com/PauloGoncalvesBH/serverest')
.epilog('Abra uma issue em github.com/PauloGoncalvesBH/serverest/issues')
.argv

conf.tokenTimeout = argv.timeout
conf.utilizarHeaderDeSeguranca = !argv.nosec
const DEFAULT_PORT = 3000

// app tem que ser importado após o conf.utilizarHeaderDeSeguranca para que ele funcione corretamente
const app = require('../src/app')

const port = normalizePort(argv.porta)
conf.porta = port
app.set('port', port)
Expand All @@ -47,8 +52,8 @@ server.on('error', onError)
server.on('listening', onListening)

console.log(colors.white.bold(`\nServeRest está em execução na porta ${port}`))
console.log(colors.cyan.bold('Feito com'), colors.red.bold('♥'), colors.cyan.bold('para todos os QAs'))
console.log(colors.yellow.bold('Dúvidas?'), colors.white.bold('npx serverest -h\n'))
console.log(colors.white.bold('Dúvidas?'), colors.yellow.bold('npx serverest -h'))
console.log(colors.cyan.bold('Feito com'), colors.red.bold('♥'), colors.cyan.bold('para todos os QAs\n'))

if (!argv.nodoc) {
open(`http://localhost:${port}/api-doc`)
Expand Down
Binary file modified img/terminalHelp.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 9342cac

Please sign in to comment.