OWASP SCP Quick Reference Guide - en-US
OWASP SCP Quick Reference Guide - en-US
December 2022
1
December 2022
Table of Contents
Introduction
Software Security and Risk Principles Overview
Secure Coding Practices Checklist
Input Validation
Output Encoding
Authentication and Password Management
Session Management
Access Control
Cryptographic Practices
Error Handling and Logging
Data Protection
Communication Security
System Configuration
Database Security
File Management
Memory Management
General Coding Practices
Appendix A: External References
Appendix B: Glossary
Version 2.0.1 2
December 2022
Introduction
This technology agnostic document defines a set of general software security coding practices, in a checklist
format, that can be integrated into the software development lifecycle. Implementation of these practices
will mitigate most common software vulnerabilities.
Generally, it is much less expensive to build secure software than to correct security issues after the software
package has been completed, not to mention the costs that may be associated with a security breach.
Securing critical software resources is more important than ever as the focus of attackers has steadily
moved toward the application layer. A 2009 SANS study found that attacks against web applications
constitute more than 60% of the total attack attempts observed on the Internet.
When utilizing this guide, development teams should start by assessing the maturity of their secure
software development lifecycle and the knowledge level of their development staff. Since this guide does not
cover the details of how to implement each coding practice, developers will either need to have the prior
knowledge or have sufficient resources available that provide the necessary guidance. This guide provides
coding practices that can be translated into coding requirements without the need for the developer to
have an in depth understanding of security vulnerabilities and exploits. However, other members of the
development team should have the responsibility, adequate training, tools and resources to validate that
the design and implementation of the entire system is secure.
A glossary of important terms in this document, including section headings and words shown in italics, is
provided in appendix B.
Guidance on implementing a secure software development framework is beyond the scope of this paper,
however the following additional general practices and resources are recommended:
• Clearly define roles and responsibilities
• Provide development teams with adequate software security training
• Implement a secure software development lifecycle
• Establish secure coding standards
– OWASP Development Guide Project
• Build a re-usable object library
– OWASP Enterprise Security API (ESAPI) Project
• Verify the effectiveness of security controls
– OWASP Application Security Verification Standard (ASVS) Project
• Establish secure outsourced development practices including defining security requirements and
verification methodologies in both the request for proposal (RFP) and contract.
Version 2.0.1 3
December 2022
Version 2.0.1 4
December 2022
Output Encoding:
□ Conduct all encoding on a trusted system (e.g., The server)
□ Utilize a standard, tested routine for each type of outbound encoding
□ Contextually output encode all data returned to the client that originated outside the application's
trust boundary. HTML entity encoding is one example, but does not work in all cases
□ Encode all characters unless they are known to be safe for the intended interpreter
□ Contextually sanitize all output of un-trusted data to queries for SQL, XML, and LDAP
□ Sanitize all output of un-trusted data to operating system commands
Version 2.0.1 5
December 2022
Version 2.0.1 6
December 2022
Session Management:
□ Use the server or framework’s session management controls. The application should only recognize
these session identifiers as valid
□ Session identifier creation must always be done on a trusted system (e.g., The server)
□ 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. In most cases it should be no more than several hours
□ Disallow persistent logins and enforce periodic session terminations, even when the session is active.
Especially for applications supporting rich network connections or connecting to critical systems.
Termination times should support business requirements and the user should receive sufficient
notification to mitigate negative impacts
□ 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. Session identifiers should only be
located in the HTTP cookie header. For example, do not pass session identifiers as GET parameters
□ Protect server side session data from unauthorized access, by other users of the server, by implementing
appropriate access controls on the server
□ Generate a new session identifier and deactivate the old one periodically. (This can mitigate certain
session hijacking scenarios where the original identifier was compromised)
Version 2.0.1 7
December 2022
□ Generate a new session identifier if the connection security changes from HTTP to HTTPS, as can
occur during authentication. Within an application, it is recommended to consistently utilize HTTPS
rather than switching between HTTP to HTTPS.
□ Supplement standard session management for sensitive server-side operations, like account manage-
ment, by utilizing per-session strong random tokens or parameters. This method can be used to
prevent Cross Site Request Forgery attacks
□ 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, "includes"
and requests from rich client-side technologies like AJAX and Flash
□ 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
catch 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.
The transactions/time should be above the actual business requirement, but low enough to deter
automated attacks
□ 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 (e.g., After no more than
30 days from the expiration of an account’s password.)
Version 2.0.1 8
December 2022
□ The application must support disabling of accounts and terminating sessions when authorization
ceases (e.g., Changes to role, employment status, business process, etc.)
□ 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 (e.g., The server)
□ Protect master 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 when these random values are
intended to be un-guessable
□ Cryptographic modules used by the application should be compliant to FIPS 140-2 or an equivalent
standard. (See http://csrc.nist.gov/groups/STM/cmvp/validation.html)
□ Establish and utilize a policy and process for how cryptographic keys will be managed
Version 2.0.1 9
December 2022
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, like authentication verification data, even on the server
side. Always use well vetted algorithms, see "Cryptographic Practices" for additional guidance
□ 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. This includes embedding in insecure formats
like: MS viewstate, Adobe flash or compiled code
□ 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 authen-
tication
□ Disable client side caching on pages containing sensitive information. Cache-Control: no-store, may
be used in conjunction with the HTTP header control "Pragma: no-cache", which is less effective,
but is HTTP/1.0 backward compatible
□ The application should support the removal of sensitive data when that data is no longer required.
(e.g. personal information or certain financial data)
□ 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
Version 2.0.1 10
December 2022
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. Then "Disallow" that entire parent directory in
the robots.txt file rather than Disallowing each individual 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, such as WebDAV extensions. If an extended HTTP method
that supports file handling is required, utilize a well-vetted authentication mechanism
□ If the web server handles both HTTP 1.0 and 1.1, ensure that both are configured in a similar
manor or insure that you understand any difference that may exist (e.g. handling of extended HTTP
methods)
□ 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. Development environments are often configured less securely than
production environments and attackers may use this difference to discover shared weaknesses or as
an avenue for exploitation
□ 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.
Version 2.0.1 11
December 2022
□ 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. Utilize strong passwords/phrases
or implement multi-factor authentication
□ Turn off all unnecessary database functionality (e.g., unnecessary stored procedures or services, utility
packages, install only the minimum set of features and options required (surface area reduction))
□ Remove unnecessary default vendor content (e.g., 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
(e.g., 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. Checking for file type by
extension alone is not sufficient
□ Do not save files in the same web context as the application. Files should either go to the content
server or in the database.
□ 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 a white list of allowed file names and types. Validate the value of
the parameter being passed and if it does not match one of the expected values, either reject it or
use a hard coded default file value for the content instead
□ Do not pass user supplied data into a dynamic redirect. If this must be allowed, then the redirect
should accept only validated, relative path URLs
□ 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 control for un-trusted data
□ Double check that the buffer is as large as specified
□ When using functions that accept a number of bytes to copy, such as strncpy(), be aware that if the
destination buffer size is equal to the source buffer size, it may not NULL-terminate the string
□ Check buffer boundaries if calling the function in a loop and make sure there is no danger of writing
past the allocated space
□ Truncate all input strings to a reasonable length before passing them to the copy and concatenation
functions
Version 2.0.1 12
December 2022
□ Specifically close resources, don’t rely on garbage collection. (e.g., connection objects, file handles,
etc.)
□ Use non-executable stacks when available
□ Avoid the use of known vulnerable functions (e.g., printf, strcat, strcpy etc.)
□ Properly free allocated memory upon the completion of functions and at all exit points
Version 2.0.1 13
December 2022
Version 2.0.1 14
December 2022
Appendix B: Glossary
Abuse Case: Describes the intentional and unintentional misuses of the software. Abuse cases should
challenge the assumptions of the system design.
Access Control: A set of controls that grant or deny a user, or other entity, access to a system resource.
This is usually based on hierarchical roles and individual privileges within a role, but also includes system
to system interactions.
Authentication: A set of controls that are used to verify the identity of a user, or other entity, interacting
with the software.
Availability: A measure of a system's accessibility and usability.
Canonicalize: To reduce various encodings and representations of data to a single simple form.
Communication Security: A set of controls that help ensure the software handles the sending and
receiving of information in a secure manner.
Confidentiality: To ensure that information is disclosed only to authorized parties.
Contextual Output Encoding: Encoding output data based on how it will be utilized by the application.
The specific methods vary depending on the way the output data is used. If the data is to be included
in the response to the client, account for inclusion scenarios like: the body of an HTML document, an
HTML attribute, within JavaScript, within a CSS or in a URL. You must also account for other use cases
like SQL queries, XML and LDAP.
Cross Site Request Forgery: An external website or application forces a client to make an unintended
request to another application that the client has an active session with. Applications are vulnerable when
they use known, or predictable, URLs and parameters; and when the browser automatically transmits all
required session information with each request to the vulnerable application.
This is one of the only attacks specifically discussed in this document and is only included because the
associated vulnerability is very common and poorly understood.
Cryptographic Practices: A set of controls that ensure cryptographic operations within the application
are handled securely.
Data Protection: A set of controls that help ensure the software handles the storing of information in a
secure manner.
Database Security: A set of controls that ensure that software interacts with a database in a secure
manner and that the database is configured securely.
Error Handling and Logging: A set of practices that ensure the application handles errors safely and
conducts proper event logging.
Exploit: To take advantage of a vulnerability. Typically this is an intentional action designed to
compromise the software's security controls by leveraging a vulnerability.
File Management: A set of controls that cover the interaction between the code and other system files.
General Coding Practices: A set of controls that cover coding practices that do not fit easily into other
categories.
Hazardous Character: Any character or encoded representation of a character that can effect the
intended operation of the application or associated system by being interpreted to have a special meaning,
outside the intended use of the character. These characters may be used to:
• Altering the structure of existing code or statements
• Inserting new unintended code
• Altering paths
• Causing unexpected outcomes from program functions or routines
• Causing error conditions
Version 2.0.1 15
December 2022
Version 2.0.1 16
December 2022
State Data: When data or parameters are used, by the application or server, to emulate a persistent
connection or track a client's status across a multi-request process or transaction.
System: A generic term covering the operating systems, web server, application frameworks and related
infrastructure.
System Configuration: A set of controls that help ensure the infrastructure components supporting the
software are deployed securely.
Threat Agent: Any entity which may have a negative impact on the system. This may be a malicious
user who wants to compromise the system's security controls; however, it could also be an accidental
misuse of the system or a more physical threat like fire or flood.
Trust Boundaries: Typically a trust boundary constitutes the components of the system under your
direct control. All connections and data from systems outside of your direct control, including all clients
and systems managed by other parties, should be consider untrusted and be validated at the boundary,
before allowing further system interaction.
Vulnerability: A weakness that makes the system susceptible to attack or damage.
Version 2.0.1 17