This is a simplified security checklist for anyone who's developing and deploying APIs
- Make sure that all the RESTful APIs have Swagger definitions (e.g.
format
,maximum
,minimum
,minItems
,maxItems
) See Swagger documentation for more information - Make sure that the Swagger definitions contain input validation and all expected header parameters
- Make sure that the definitions contains authentication and authorisaiton requirements
- Make sure that the API definitions contain the expected
Content-Type
- Use an API gateway to expose APIs
- Validate all user-supplied input in the headers and in the body before they are processed
- Validate the type (e.g. integer, string, floating point number), size (e.g. minimum string lengths, minimum abd maximum values for numbers) and format the composition of expected inputs
- Validate the sizes of the JSON arrays and number of child elements in XML requests
- Use built-in libraries or annotations for input validation as much as possible, build custom validators if built-in functionality is inadequate
- Validate the size of the request body and request headers (at preferably at the API gateway)
- Validate that the
content-type
in the request header matches the expected content type - Do not attempt to sanitise input (e.g. remove certain bad characters or strings)
- Make sure that if input validation fail, the request is rejected with an appropriate error HTTP response
- Make sure that rate limiting/throttling is applied to each API based on either per-session or per-IP or based on other properties that's relevant
- Avoid developing custom authentication protocols as much as possible
- Use an identity provider (IDP) and use open standards and frameworks such as OpenID Connect for user identity and OAuth to delegate authorisation to API resources
- Avoid HTTP basic authentication or OAuth 2.0 Client Credentials Grant for user authorisaion
- Use Authorizaion Code grant with PKCE (Proof Key for Code Exchange) instead of the Implicit Grant for Single Page Applications (SPAs)
- Make sure that APIs are exposed through secure channels such as TLS
- Make sure that debug logging or error messages are disabled in production deployments
- Make sure that monitoring and diagnostic endpoints provided by frameworks (e.g. Spring Boot Actuator) are either disabled or secured (HTTPS) and the exposure is controlled
- Do not log entire the HTTP request or the HTTP headers or the entire request body as they can potentially contain sensitive information
- Do not log user and system credentials
- Do not log user session information (Cookies, JWT tokens, etc)
- Use third-party components that do not have vulnerabilities
- Make sure to incorporate security testing into CI/CD processes
- Make sure that static application security testing (SAST) is performed
- Make sure that software composition analysis (SCA) scanning is performed
- Make sure that dynamic application security testing (DAST) is performed