Secure Coding Practices Checklist -
OWASP
Input validation
Conduct all input validation on a trusted system (server side not client side)
Identify all data sources and classify them into trusted and untrusted
Validate all data from untrusted sources (databases, file streams, etc)
Use a centralized input validation routine for the whole application
Specify character sets, such as UTF-8, for all input sources (canonicalization)
Encode input to a common character set before validating
All validation failures should result in input rejection
If the system supports UTF-8 extended character sets and validate after UTF-8
decoding is completed
Validate all client provided data before processing
Verify that protocol header values in both requests and responses contain only
ASCII characters
Validate data from redirects
Validate for expected data types using an "allow" list rather than a "deny" list
Validate data range
Validate data length
If any potentially hazardous input must be allowed then implement additional
controls
If the standard validation routine cannot address some inputs then use extra
discrete checks
Utilize canonicalization to address obfuscation attacks
Output encoding
Conduct all output encoding on a trusted system (server side not client side)
Utilize a standard, tested routine for each type of outbound encoding
Specify character sets, such as UTF-8, for all outputs
Contextually output encode all data returned to the client from untrusted
sources
Ensure the output encoding is safe for all target systems
Contextually sanitize all output of un-trusted data to queries for SQL, XML,
and LDAP
Sanitize all output of untrusted data to operating system commands
Authentication and password management
Require authentication for all pages and resources, except those specifically
intended to be public
All authentication controls must be enforced on a trusted system
Establish and utilize standard, tested, authentication services whenever
possible
Use a centralized implementation for all authentication controls, including
libraries that call external authentication services
Segregate authentication logic from the resource being requested and use
redirection to and from the centralized authentication control
All authentication controls should fail securely
All administrative and account management functions must be at least as
secure as the primary authentication mechanism
If your application manages a credential store, use cryptographically strong
one-way salted hashes
Password hashing must be implemented on a trusted system server side not
client side)
Validate the authentication data only on completion of all data input
Authentication failure responses should not indicate which part of the
authentication data was incorrect
Utilize authentication for connections to external systems that involve
sensitive information or functions
Authentication credentials for accessing services external to the application
should be stored in a secure store
Use only HTTP POST requests to transmit authentication credentials
Only send non-temporary passwords over an encrypted connection or as
encrypted data
Enforce password complexity requirements established by policy or regulation
Enforce password length requirements established by policy or regulation
Password entry should be obscured on the user's screen
Enforce account disabling after an established number of invalid login
attempts
Password reset and changing operations require the same level of controls as
account creation and authentication
Password reset questions should support sufficiently random answers
If using email based resets, only send email to a pre-registered address with a
temporary link/password
Temporary passwords and links should have a short expiration time
Enforce the changing of temporary passwords on the next use
Notify users when a password reset occurs
Prevent password re-use
Passwords should be at least one day old before they can be changed, to
prevent attacks on password re-use
Enforce password changes based on requirements established in policy or
regulation, with the time between resets administratively controlled
Disable "remember me" functionality for password fields
The last use (successful or unsuccessful) of a user account should be reported
to the user at their next successful login
Implement monitoring to identify attacks against multiple user accounts,
utilizing the same password
Change all vendor-supplied default passwords and user IDs or disable the
associated accounts
Re-authenticate users prior to performing critical operations
Use Multi-Factor Authentication for highly sensitive or high value
transactional accounts
If using third party code for authentication, inspect the code carefully to
ensure it is not affected by any malicious code
Session management
Use the server or framework’s session management controls. The application
should recognize only these session identifiers as valid
Session identifier creation must always be done on a trusted system (server
side not client side)
Session management controls should use well vetted algorithms that ensure
sufficiently random session identifiers
Set the domain and path for cookies containing authenticated session
identifiers to an appropriately restricted value for the site
Logout functionality should fully terminate the associated session or
connection
Logout functionality should be available from all pages protected by
authorization
Establish a session inactivity timeout that is as short as possible, based on
balancing risk and business functional requirements
Disallow persistent logins and enforce periodic session terminations, even
when the session is active
If a session was established before login, close that session and establish a new
session after a successful login
Generate a new session identifier on any re-authentication
Do not allow concurrent logins with the same user ID
Do not expose session identifiers in URLs, error messages or logs
Implement appropriate access controls to protect server side session data from
unauthorized access from other users of the server
Generate a new session identifier and deactivate the old one periodically
Generate a new session identifier if the connection security changes from
HTTP to HTTPS, as can occur during authentication
Consistently utilize HTTPS rather than switching between HTTP to HTTPS
Supplement standard session management for sensitive server-side operations,
like account management, by utilizing per-session strong random tokens or
parameters
Supplement standard session management for highly sensitive or critical
operations by utilizing per-request, as opposed to per-session, strong random
tokens or parameters
Set the "secure" attribute for cookies transmitted over an TLS connection
Set cookies with the HttpOnly attribute, unless you specifically require client-
side scripts within your application to read or set a cookie's value
Access control
Use only trusted system objects, e.g. server side session objects, for making
access authorization decisions
Use a single site-wide component to check access authorization. This includes
libraries that call external authorization services
Access controls should fail securely
Deny all access if the application cannot access its security configuration
information
Enforce authorization controls on every request, including those made by
server side scripts
Segregate privileged logic from other application code
Restrict access to files or other resources, including those outside the
application's direct control, to only authorized users
Restrict access to protected URLs to only authorized users
Restrict access to protected functions to only authorized users
Restrict direct object references to only authorized users
Restrict access to services to only authorized users
Restrict access to application data to only authorized users
Restrict access to user and data attributes and policy information used by
access controls
Restrict access security-relevant configuration information to only authorized
users
Server side implementation and presentation layer representations of access
control rules must match
If state data must be stored on the client, use encryption and integrity checking
on the server side to detect state tampering
Enforce application logic flows to comply with business rules
Limit the number of transactions a single user or device can perform in a given
period of time, low enough to deter automated attacks but above the actual
business requirement
Use the "referer" header as a supplemental check only, it should never be the
sole authorization check as it is can be spoofed
If long authenticated sessions are allowed, periodically re-validate a user’s
authorization to ensure that their privileges have not changed and if they have, log
the user out and force them to re-authenticate
Implement account auditing and enforce the disabling of unused accounts
The application must support disabling of accounts and terminating sessions
when authorization ceases
Service accounts or accounts supporting connections to or from external
systems should have the least privilege possible
Create an Access Control Policy to document an application's business rules,
data types and access authorization criteria and/or processes so that access can be
properly provisioned and controlled. This includes identifying access
requirements for both the data and system resources
Cryptographic practices
All cryptographic functions used to protect secrets from the application user
must be implemented on a trusted system
Protect secrets from unauthorized access
Cryptographic modules should fail securely
All random numbers, random file names, random GUIDs, and random strings
should be generated using the cryptographic module’s approved random number
generator
Cryptographic modules used by the application should be compliant to FIPS
140-2 or an equivalent standard
Establish and utilize a policy and process for how cryptographic keys will be
managed
Error handling and logging
Do not disclose sensitive information in error responses, including system
details, session identifiers or account information
Use error handlers that do not display debugging or stack trace information
Implement generic error messages and use custom error pages
The application should handle application errors and not rely on the server
configuration
Properly free allocated memory when error conditions occur
Error handling logic associated with security controls should deny access by
default
All logging controls should be implemented on a trusted system
Logging controls should support both success and failure of specified security
events
Ensure logs contain important log event data
Ensure log entries that include un-trusted data will not execute as code in the
intended log viewing interface or software
Restrict access to logs to only authorized individuals
Utilize a central routine for all logging operations
Do not store sensitive information in logs, including unnecessary system
details, session identifiers or passwords
Ensure that a mechanism exists to conduct log analysis
Log all input validation failures
Log all authentication attempts, especially failures
Log all access control failures
Log all apparent tampering events, including unexpected changes to state data
Log attempts to connect with invalid or expired session tokens
Log all system exceptions
Log all administrative functions, including changes to the security
configuration settings
Log all backend TLS connection failures
Log cryptographic module failures
Use a cryptographic hash function to validate log entry integrity
Data protection
Implement least privilege, restrict users to only the functionality, data and
system information that is required to perform their tasks
Protect all cached or temporary copies of sensitive data stored on the server
from unauthorized access and purge those temporary working files a soon as they
are no longer required.
Encrypt highly sensitive stored information, such as authentication verification
data, even if on the server side
Protect server-side source-code from being downloaded by a user
Do not store passwords, connection strings or other sensitive information in
clear text or in any non-cryptographically secure manner on the client side
Remove comments in user accessible production code that may reveal
backend system or other sensitive information
Remove unnecessary application and system documentation as this can reveal
useful information to attackers
Do not include sensitive information in HTTP GET request parameters
Disable auto complete features on forms expected to contain sensitive
information, including authentication
Disable client side caching on pages containing sensitive information
The application should support the removal of sensitive data when that data is
no longer required
Implement appropriate access controls for sensitive data stored on the server.
This includes cached data, temporary files and data that should be accessible only
by specific system users
Communication security
Implement encryption for the transmission of all sensitive information. This
should include TLS for protecting the connection and may be supplemented by
discrete encryption of sensitive files or non-HTTP based connections
TLS certificates should be valid and have the correct domain name, not be
expired, and be installed with intermediate certificates when required
Failed TLS connections should not fall back to an insecure connection
Utilize TLS connections for all content requiring authenticated access and for
all other sensitive information
Utilize TLS for connections to external systems that involve sensitive
information or functions
Utilize a single standard TLS implementation that is configured appropriately
Specify character encodings for all connections
Filter parameters containing sensitive information from the HTTP referer,
when linking to external sites
System configuration
Ensure servers, frameworks and system components are running the latest
approved version
Ensure servers, frameworks and system components have all patches issued
for the version in use
Turn off directory listings
Restrict the web server, process and service accounts to the least privileges
possible
When exceptions occur, fail securely
Remove all unnecessary functionality and files
Remove test code or any functionality not intended for production, prior to
deployment
Prevent disclosure of your directory structure in the robots.txt file by placing
directories not intended for public indexing into an isolated parent directory
Define which HTTP methods, Get or Post, the application will support and
whether it will be handled differently in different pages in the application
Disable unnecessary HTTP methods
If the web server handles different versions of HTTP ensure that they are
configured in a similar manner and ensure any differences are understood
Remove unnecessary information from HTTP response headers related to the
OS, web-server version and application frameworks
The security configuration store for the application should be able to be output
in human readable form to support auditing
Implement an asset management system and register system components and
software in it
Isolate development environments from the production network and provide
access only to authorized development and test groups
Implement a software change control system to manage and record changes to
the code both in development and production
Database security
Use strongly typed parameterized queries
Utilize input validation and output encoding and be sure to address meta
characters. If these fail, do not run the database command
Ensure that variables are strongly typed
The application should use the lowest possible level of privilege when
accessing the database
Use secure credentials for database access
Connection strings should not be hard coded within the application.
Connection strings should be stored in a separate configuration file on a trusted
system and they should be encrypted.
Use stored procedures to abstract data access and allow for the removal of
permissions to the base tables in the database
Close the connection as soon as possible
Remove or change all default database administrative passwords
Turn off all unnecessary database functionality
Remove unnecessary default vendor content (for example sample schemas)
Disable any default accounts that are not required to support business
requirements
The application should connect to the database with different credentials for
every trust distinction (for example user, read-only user, guest, administrators)
File management
Do not pass user supplied data directly to any dynamic include function
Require authentication before allowing a file to be uploaded
Limit the type of files that can be uploaded to only those types that are needed
for business purposes
Validate uploaded files are the expected type by checking file headers rather
than by file extension
Do not save files in the same web context as the application
Prevent or restrict the uploading of any file that may be interpreted by the web
server.
Turn off execution privileges on file upload directories
Implement safe uploading in UNIX by mounting the targeted file directory as
a logical drive using the associated path or the chrooted environment
When referencing existing files, use an allow-list of allowed file names and
types
Do not pass user supplied data into a dynamic redirect
Do not pass directory or file paths, use index values mapped to pre-defined list
of paths
Never send the absolute file path to the client
Ensure application files and resources are read-only
Scan user uploaded files for viruses and malware
Memory management
Utilize input and output controls for untrusted data
Check that the buffer is as large as specified
When using functions that accept a number of bytes ensure that NULL
terminatation is handled correctly
Check buffer boundaries if calling the function in a loop and protect against
overflow
Truncate all input strings to a reasonable length before passing them to other
functions
Specifically close resources, don’t rely on garbage collection
Use non-executable stacks when available
Avoid the use of known vulnerable functions
Properly free allocated memory upon the completion of functions and at all
exit points
Overwrite any sensitive information stored in allocated memory at all exit
points from the function
General coding practices
Use tested and approved managed code rather than creating new unmanaged
code for common tasks
Utilize task specific built-in APIs to conduct operating system tasks. Do not
allow the application to issue commands directly to the Operating System,
especially through the use of application initiated command shells
Use checksums or hashes to verify the integrity of interpreted code, libraries,
executables, and configuration files
Utilize locking to prevent multiple simultaneous requests or use a
synchronization mechanism to prevent race conditions
Protect shared variables and resources from inappropriate concurrent access
Explicitly initialize all your variables and other data stores, either during
declaration or just before the first usage
In cases where the application must run with elevated privileges, raise
privileges as late as possible, and drop them as soon as possible
Avoid calculation errors by understanding your programming language's
underlying representation
Do not pass user supplied data to any dynamic execution function
Restrict users from generating new code or altering existing code
Review all secondary applications, third party code and libraries to determine
business necessity and validate safe functionality
Implement safe updating using encrypted channels