OWASP Secure Coding Practices
OWASP Secure Coding Practices
Check list format that can be integrated into the software development lifecycle.
Introduction
• Generally it is much cheaper to build secure software than fixing security issues.
• Security breaches can have much cost themselves (coding secure, is much better)
• From SANS 2009 Study:
◦ More than 60% of attacks on internet, are against web application (application layer)
• Developers team should assess their level of secure coding knowledge
Input Validation
1. Perform Data Validation on Server
2. Classify data sources into trusted or untrusted :
◦ validate the untrusted data sources
3. There should be a centralized input validation routine for the app
4. Specify proper character sets, such as UTF-8 for all sources
5. Encode data to a common character set before validating
6. All validation failure should result in input rejection
7. Determine if the system supports UTF-8 and if so, validate after UTF-8 decoding is completed
8. Validate client data before processing
◦ all parameters
◦ headers
◦ cookies
◦ values
9. Verify that header values in both request and responses contain only ASCII characters
10. Validate data before redirection
11. Validate for expected data types
12. Validate data range
13. Validate data length
14. Validate all input against a white list of allowed characters, whenever possible
15. If any dangerous (Hazardous) character must be allowed, extra controls like output encoding
should be implemented. Examples of hazardous include:
◦ <, >
◦ ", '
◦ %
◦ (, )
◦ &
◦ \ , \' , \"
16. Extra checks:
◦ Null bytes: %00
◦ New Line Characters: %0d , %0a , \r , \n
◦ Check for "dot-dot-slash" ( ../ or ..\ )
◦ If UTF-8 extended character set encoding is supported:
▪ address alternate representation like: %c0%ae%c0%ae/
Output Encoding
17. all encoding on a trusted system e.g., the Server
18. Utilize a standard method for each type of output encoding
19. Encode output based on the context it will be in.
20. Encode all characters unless they are known to be safe for the intended interpreter
21. Sanitize output of un-trusted data to queries based on context e.g. SQL, XML, LDAP
22. Sanitize output of un-trusted data to OS Commands
Session Management
58. Use the server or framework's session management controls.
59. Session identifier creation must always be done on a trusted system e.g. Server
60. Session management controls should use well vetted algorithms that ensure sufficiently random
session identifiers
61. Set the domain and path for cookies containing authenticated session identifiers to an
appropriately restricted value for the site
62. Logout functionality should fully terminate the associated session or connection
63. Logout functionality should be available from all pages protected by authorization
64. Establish a session inactivity timeout that is a short as possible
◦ Balance Risk & Business Functional requirement\
◦ In most cases, it should be no more than several hours
65. Disallow persistent logins and enforce periodic session terminations, even when the session is
active
◦ user should receive notification to mitigate negative impact
66. If a session was established before login:
◦ close the session first
◦ then establish a new session
67. Generate a new session ID on any re-authentication
68. Do not allow concurrent logins with the same user ID
69. Do not expose session IDs in URLs , error messages or logs
◦ session IDs should only be located in HTTP Cookie header.
◦ Do not pass it as a GET parameter
70. Protect server side session data from unauthorized access: appropriate access control on
server
71. Generate a new session ID and deactivate the old ones periodically: avoid session hijacking
72. generate new session ID if the connection changes from HTTP to HTTPS
73. Supplement standard session management for sensitive server-side operations, like account
management, by utilizing per-session strong random tokens or parameters. This method can be
used to prevent Cross Site Request Forgery attacks
74. Supplement standard session management for highly sensitive or critical operations by utilizing
per-request, as opposed to per-session, strong random tokens or parameters
75. Set the secure attribute for cookies transmitted ofr HTTPS
76. Set cookies with the HttpOnly attribute, unless you specifically require client-side access to
cookie
Access Control
77. Use only trusted system objects, e.g. server side session objects, for making access authorization
decisions
78. Use a single site-wide component to check access authorization. This includes libraries that call
external authorization services
79. Access controls should fail securely
80. Deny all access if the application cannot access its security configuration information
81. 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
82. Separate privileged logic from other application code
83. Restrict access to files or other resources , including those outside the application's direct
control, to only authorized users
84. Restrict access to protected URLs to only authorized users
85. Restrict access to protected functions to only authorized users
86. Restrict direct object references to only authorized users
87. Restrict access to services to only authorized users
88. Restrict access to application data to only authorized users
89. Restrict access to user and data attributes and policy information used by access controls
90. Restrict access security-relevant configuration information to only authorized users
91. Server side implementation and presentation layer representations of access control rules must
match
92. If state data must be stored on the client, use encryption and integrity checking on it
93. Enforce application login flows to comply with business rules
94. Limit the number of transactions a single user or device can perform in a given period of time
95. Use the "referer" header as a supplemental check only, it should never be the sole authorization
check, as it can be spoofed
96. 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
97. Implement account auditing and enforce disable of unused accounts
◦ e.g. After no more than 30 days from the expiration of an account’s password
98. the application must support disabling of accounts and terminating sessions when authorization
ceases
99. Service accounts or accounts supporting connections to or from external systems should have
the least privilege possible
100. 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
101. All cryptographic functions must be implemented on a trusted e.g. server
102. Protect master secrets from unauthorized access
103. Cryptographic modules should fail securely
104. All random numbers, random file names, random GUIDs, and random string should be generated
using the cryptographic module's approved random number generator when these random
values are intended to be un-guessable
105. Cryptographic modules used by the application should be compliant to FIPS 140-2 or an
equivalent standard
106. Establish and utilize a policy and process for how cryptographic keys will be managed
Data Protection
131. implement least privilege
◦ user must only access to things that really needs
132. Protect all cached or temporary copies of sensitive data stored on the server from unauthorized
access and purge those temporary working files as soon as they are no longer required
133. 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
134. Protect server-side source code from being downloaded by a user
135. Do not store passwords , connection strings or other sensitive information in clear text or in
any non-cryptographically secure manner on the client side
136. Remove comments in user accessible production code that may reveal backend or other sensitive
information
137. Remove unnecessary application and system documentation as this can reveal useful information
to attackers
138. Do not include sensitive information in HTTP GET request parameters
139. Disable auto complete features on forms expected to contain sensitive information
140. 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
141. The application should support the removal of sensitive data when that data is no longer
required
142. 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
143. Implement encryption for the transmission of all sensitive information
144. TLS certificates should be valid and have the correct domain name , not be expired , and be
installed with intermediate certificates when required
145. Failed TLS connections should not fall back to an insecure connection
146. Utilize TLS connections for all content requiring authenticated access and for all other sensitive
information
147. Utilize TLS for connections to external systems that involve sensitive information or functions
148. Utilize a single standard TLS implementation that is configured appropriately
149. Specify character encodings for all connections
150. Filter parameters containing sensitive information from the HTTP referer , when linking to
external sites
System Configuration
151. Ensure servers, frameworks and system components are running the latest version
152. Ensure servers, frameworks and system components have all patches issued for the version in
use
153. Turn off directory listings
154. Restrict the web server, process and service accounts to the least privileges possible
155. When exceptions occur, fail securely
156. Remove all unnecessary functionality and files
157. Remove test code or any functionality not intended for production , prior to deployment
158. 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
159. Define which HTTP methods , GET or POST, the application will support and whether it will be
handled differently in different pages in the application
160. 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
161. if the web server handles both HTTP 1.0 and 1.1 , ensure that both are configured in a similar
way or ensure that you understand any difference that may exist (e.g. handling of extended HTTP
methods)
162. Remove unnecessary information from HTTP response headers related to the OS , web-server
version and application frameworks
163. The security configuration store for the application should be able to be output in human-
readable form to support auditing
164. Implement an asset management system and register system components and software in it
165. Isolate Production environment and Development environment (network)
◦ test or Development environments are often less secure
◦ test environment must be access only by authorized test groups
166. Implement a software change control system to manage and record changes to the code both
in development and production
Database Security
167. Use strongly typed parameterized queries
168. Utilize input validation and output encoding and be sure to address meta characters. If these
fail, do not run the database command
169. Ensure that variables are strongly typed
170. The application should use the lowest possible level of privilege when accessing the database
171. Use secure credentials for database access
172. 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 .
173. Use stored procedures to abstract data access and allow for the removal of permissions to the
base tables in the database
174. Close the connection as soon as possible
175. Remove or change all default database administrative passwords . Utilize strong
passwords/phrases or implement multi-factor authentication
176. 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))
177. Remove unnecessary default vendor content (e.g., sample schemas)
178. Disable any default accounts that are not required to support business requirements
179. The application should connect to the database with different credentials for every trust
distinction (e.g., user, read-only user, guest, administrators)
File Management
180. Do not pass user supplied data directly to any dynamic include function
181. Require authentication before allowing a file to be uploaded
182. Limit the type of files that can be uploaded to only those types that are needed for business
purposes
183. Validate uploaded files are the expected type by checking file headers . Checking for file type
by extension alone is not sufficient
184. Do not save files in the same web context as the application. Files should either go to the
content server or in the database
185. Prevent or restrict the uploading of any file that may be interpreted by the web server
186. Turn off execution privileges on file upload directories
187. Implement safe uploading in UNIX by mounting the targeted file directory as a logical drive
using the associated path or the chrooted environment
188. 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
189. 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
190. Do not pass directory or file paths, use index values mapped to pre-defined list of paths
191. Never send the absolute file path to the client
192. Ensure application files and resources are read-only
193. Scan user uploaded files for viruses and malware
Memory Management
194. Utilize input and output control for un-trusted data
195. Double check that the buffer is as large as specified
196. 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
197. Check buffer boundaries if calling the function in a loop and make sure there is no danger of
writing past the allocated space
198. Truncate all input strings to a reasonable length before passing them to the copy and
concatenation functions
199. Specifically close resources , don’t rely on garbage collection. (e.g., connection objects, file
handles, etc.)
200. Use non-executable stacks when available
201. Avoid the use of known vulnerable functions (e.g., printf , strcat , strcpy etc.)
202. Properly free allocated memory upon the completion of functions and at all exit points
210. Do not pass user supplied data to any dynamic execution function
211. Restrict users from generating new code or altering existing code
212. Review all secondary applications , third party code and libraries to determine business
necessity and validate safe functionality
213. Implement safe updating
◦ if applications uses automate updating, implement ways to verify signature of updates
◦ Use encrypted channels to transfer the code from the host server
Glossary
• See OWASP Secure Coding Practices Glossary Section