Skip to content

Commit 9342cac

Browse files
feat(security): incluir cabeçalhos de segurança e configuração
1 parent 0acc7f3 commit 9342cac

File tree

6 files changed

+2130
-1678
lines changed

6 files changed

+2130
-1678
lines changed

README.md

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,11 @@ npx serverest@2
2020
Dispõe de um servidor REST com dados de e-commerce fictício, permitindo o estudo do uso de:
2121
- Verbos *GET, POST, PUT* e *DELETE*
2222
- Autenticação no header
23+
- Boas práticas de segurança
2324
- Query string
2425
- Contrato
25-
- Manipulação de resposta
26-
- Requisições aninhadas
2726

28-
## Links
29-
30-
- **[Histórico de alterações](/CHANGELOG.md)**
31-
- [Código de conduta](/CODE_OF_CONDUCT.md)
32-
- [Como contribuir](/CONTRIBUTING.md)
27+
---
3328

3429
## Rotas disponíveis
3530

@@ -57,10 +52,29 @@ npx serverest -h
5752

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

60-
---
61-
6255
</details>
6356

57+
### Segurança (`--nosec`)
58+
59+
É boa prática que as APIs, na resposta, enviem determinados cabeçalhos e suprimam outros visando a segurança da aplicação.
60+
61+
Por default, o _ServeRest_ irá fazer as seguintes alterações de segurança, que podem ser desabilitadas com `npx serverest --nosec`:
62+
63+
**Cabeçalhos adicionados:**
64+
- `Strict-Transport-Security: max-age=15552000; includeSubDomains`
65+
- `X-Content-Type-Options: nosniff`
66+
- `X-DNS-Prefetch-Control: off`
67+
- `X-Download-Options: noopen`
68+
- `X-Frame-Options: SAMEORIGIN`
69+
- `X-XSS-Protection: 1; mode=block`
70+
71+
**Cabeçalho removido:**
72+
- `X-Powered-By: Express`
73+
74+
Utilize esse comportamento para realizar testes de segurança, validando a presença/ausência desses cabeçalhos.
75+
76+
> Para saber mais leia o [checklist de segurança de API](https://github.com/shieldfy/API-Security-Checklist#api-security-checklist)
77+
6478
## (Dica) Gerenciando versão
6579

6680
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.
@@ -79,6 +93,12 @@ npx serverest@2
7993
npx serverest@1
8094
```
8195

96+
## Links
97+
98+
- [Histórico de alterações](/CHANGELOG.md)
99+
- [Código de conduta](/CODE_OF_CONDUCT.md)
100+
- [Como contribuir](/CONTRIBUTING.md)
101+
82102
## Licença
83103

84104
[![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)

bin/server.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,35 +7,40 @@ const debug = require('debug')('nodestr:server')
77
const http = require('http')
88
const open = require('open')
99

10-
const app = require('../src/app')
1110
const { conf } = require('../src/utils/conf')
1211

1312
const argv = require('yargs')
1413
.default({
1514
porta: conf.porta,
1615
timeout: conf.tokenTimeout
1716
})
18-
.boolean('nodoc')
17+
.boolean(['nodoc', 'nosec'])
1918
.number(['timeout', 'porta'])
2019
.alias('p', 'porta')
2120
.alias('t', 'timeout')
2221
.alias('n', 'nodoc')
22+
.alias('s', 'nosec')
2323
.alias('h', 'help')
2424
.alias('v', 'version')
25+
.usage('\nAjuda do ServeRest')
2526
.describe('p', 'Porta que será utilizada (default: 3000)')
2627
.describe('t', 'Timeout do token em milissegundos (default: 1000)')
28+
.describe('s', 'Não enviar os headers de segurança na resposta')
2729
.describe('n', 'Desabilitar o início automático da documentação')
2830
.example('npx serverest -p 3500', 'Em execução na porta 3500')
2931
.example('npx serverest --nodoc -t 20000', 'Documentação não abrirá e token terá 20 segundos de timeout')
3032
.help('h')
31-
.epilog('As rotas disponíveis estão listadas na documentação.')
3233
.epilog('Precisa de ajuda?')
33-
.epilog('Abra uma issue em github.com/PauloGoncalvesBH/serverest')
34+
.epilog('Abra uma issue em github.com/PauloGoncalvesBH/serverest/issues')
3435
.argv
3536

3637
conf.tokenTimeout = argv.timeout
38+
conf.utilizarHeaderDeSeguranca = !argv.nosec
3739
const DEFAULT_PORT = 3000
3840

41+
// app tem que ser importado após o conf.utilizarHeaderDeSeguranca para que ele funcione corretamente
42+
const app = require('../src/app')
43+
3944
const port = normalizePort(argv.porta)
4045
conf.porta = port
4146
app.set('port', port)
@@ -47,8 +52,8 @@ server.on('error', onError)
4752
server.on('listening', onListening)
4853

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

5358
if (!argv.nodoc) {
5459
open(`http://localhost:${port}/api-doc`)

img/terminalHelp.png

1.48 KB
Loading

0 commit comments

Comments
 (0)