You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Checklist of the most important security countermeasures when designing, testing, and releasing your API.
Authentication
Don't use Basic Auth Use standard authentication (e.g. JWT, OAuth).
Don't reinvent the wheel in Authentication, token generating, password storing use the standards.
JWT (JSON Web Token)
Use random complicated key (JWT Secret) to make brute forcing token very hard.
Don't extract the algorithm from the payload. Force algorithm in the backend (HS256 or RS256).
Make token expiration (TTL, RTTL) as short as possible.
Don't store sensitive data in the JWT payload, it can be decoded easily.
OAuth
Always validate redirect_uri on server side to allow only whitelisted URLs.
Always try to exchange for code not tokens (don't allow response_type=token).
Use state parameter with a random hash to prevent CSRF on OAuth authentication process.
Define default scope, and validate scope parameter for each application.
Access
Limit requests (Throttling) to avoid DDoS / Bruteforce attacks.
Use HTTPS on server side to avoid MITM (Man In The Middle Attack).
Use HSTS header with SSL to avoid SSL Strip attack.
Input
Use proper HTTP method according to operation , GET (read), POST (create), PUT (replace/update) and DELETE (to delete a record).
Validate content-type on request Accept header ( Content Negotiation ) to allow only your supported format (e.g. application/xml , application/json ... etc) and respond with 406 Not Acceptable response if not matched.
Validate content-type of posted data as you accept (e.g. application/x-www-form-urlencoded , multipart/form-data ,application/json ... etc ).
Validate User input to avoid common vulnerabilities (e.g. XSS, SQL-Injection , Remote Code Execution ... etc).
Don't use any sensitive data ( credentials , Passwords, security tokens, or API keys) in the URL, but use standard Authorization header.
Processing
Check if all endpoint protected behind the authentication to avoid broken authentication.
User own resource id should be avoided. Use /me/orders instead of /user/654321/orders
Don't use auto increment id's use UUID instead.
If you are parsing XML files, make sure entity parsing is not enabled to avoid XXE (XML external entity attack).
If you are parsing XML files, make sure entity expansion is not enabled to avoid Billion Laughs/XML bomb via exponential entity expansion attack.
Use CDN for file uploads.
If you are dealing with huge amount of data, use Workers and Queues to return response fast to avoid HTTP Blocking.
Remove fingerprinting headers - X-Powered-By, Server, X-AspNet-Version etc.
Force content-type for your response , if you return application/json then your response content-type is application/json.
Don't return sensitive data like credentials , Passwords, security tokens.
Return the proper status code according to the operation completed. (e.g. 200 OK , 400 Bad Request , 401 Unauthorized, 405 Method Not Allowed ... etc).
Contribution
Feel free to contribute , fork -> edit -> submit pull request. For any questions drop us an email at [email protected].
The text was updated successfully, but these errors were encountered:
(中文版请戳这:中文版)
API Security Checklist
Checklist of the most important security countermeasures when designing, testing, and releasing your API.
Authentication
Basic Auth
Use standard authentication (e.g. JWT, OAuth).Authentication
,token generating
,password storing
use the standards.JWT (JSON Web Token)
JWT Secret
) to make brute forcing token very hard.HS256
orRS256
).TTL
,RTTL
) as short as possible.OAuth
redirect_uri
on server side to allow only whitelisted URLs.response_type=token
).state
parameter with a random hash to prevent CSRF on OAuth authentication process.Access
HSTS
header with SSL to avoid SSL Strip attack.Input
GET (read)
,POST (create)
,PUT (replace/update)
andDELETE (to delete a record)
.content-type
on request Accept header ( Content Negotiation ) to allow only your supported format (e.g.application/xml
,application/json
... etc) and respond with406 Not Acceptable
response if not matched.content-type
of posted data as you accept (e.g.application/x-www-form-urlencoded
,multipart/form-data ,application/json
... etc ).XSS
,SQL-Injection
,Remote Code Execution
... etc).credentials
,Passwords
,security tokens
, orAPI keys
) in the URL, but use standard Authorization header.Processing
/me/orders
instead of/user/654321/orders
UUID
instead.XXE
(XML external entity attack).Billion Laughs/XML bomb
via exponential entity expansion attack.Output
X-Content-Type-Options: nosniff
header.X-Frame-Options: deny
header.Content-Security-Policy: default-src 'none'
header.X-Powered-By
,Server
,X-AspNet-Version
etc.content-type
for your response , if you returnapplication/json
then your responsecontent-type
isapplication/json
.credentials
,Passwords
,security tokens
.200 OK
,400 Bad Request
,401 Unauthorized
,405 Method Not Allowed
... etc).Contribution
Feel free to contribute , fork -> edit -> submit pull request. For any questions drop us an email at [email protected].
The text was updated successfully, but these errors were encountered: