<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Luke,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">It’s a great question.  A logging services has a few requirements around security – the principal one being to ensure the integrity of the data being logged! 
 We should also be careful about injection into the log directly, and also downstream injection – including if the events get stored in a database or viewed in an HTML viewer.  A great logging service should also make it easy to handle handle sensitive information
 that is part of events to be logged (perhaps by using **** or other obfuscation).<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">So, I don’t think validating data to be logged is a great idea. It’s preferable to make the data safe to log and safe for downstream consumers of the log data. 
 Should you canonicalize?  While I generally prefer to deal with canonicalized data, here I’m leaning towards logging the original data.  That way you know exactly what people are sending you and you’ll have the full evidence when you’re in there doing forensics.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I think a two part strategy on sensitive data makes sense.  First to make it easy for developers to indicate which data is sensitive. For example, maybe the
 API (like ESAPI) allows you to log a request or other collection of data, and enables you to specify which parts of that collection are sensitive.  The second piece is to monitor for attempts to log sensitive data in particular formats, such as credit card
 and social security numbers. <o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">You need to do something to make sure that events can’t corrupt your log format.  Often this means detecting and handling CR/LF and other characters (TAB?)
 that your log might use for formatting.  You also want to make sure that there is no SQL injection if the data is going into a database – primarily through the use of parameterized queries.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Finally, you want to prevent injection in downstream systems that will be rendering the logs, such as the HTML viewer you mentioned.  Should you escape the
 data in the logs?  I typically recommend against this, and put the requirement on the log viewer to properly handle “untrusted” data.  But if this isn’t possible, and you know the downstream systems in question, you can escape at the time of logging – at the
 cost of a little log event integrity.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">ESAPI has support for a lot of this in the Logger – would be interesting to hear how it goes exposing this as a service.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">--Jeff<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> esapi-user-bounces@lists.owasp.org [mailto:esapi-user-bounces@lists.owasp.org]
<b>On Behalf Of </b>Luke Biddell<br>
<b>Sent:</b> Wednesday, January 30, 2013 5:25 AM<br>
<b>To:</b> esapi-user@lists.owasp.org<br>
<b>Subject:</b> [Esapi-user] Validation help<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Chaps,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I'm hoping to canvas your opinion around some input validation/canonicalization we're looking to do.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The scenario is that we're building a form of event logger. The API to the event logger is internal only at the moment, but we will open it up as an authenticated REST API at some point in the future.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The event itself is pretty standard in most respects, it has a title, tags and so forth. Validating these is pretty easy using the ESAPI validator and I'm comfortable we've got that part correct.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The part I'm uncomfortable with is validating the body of the event. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The intention is that we might store some xml (etc of a failed soap call) or some json or maybe even HTML. It's going to be pretty free form.and we don't want to restrict it too much. However, the events will surface in an HTML event viewer
 application.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">So I'm fishing for advice on how to validate the event body. We could do some black-listing  but that always feels like the path to the dark side. But, white-listing something that's so free format is also proving hard to envision.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Do you chaps have any experience around this pattern? Do we need to narrow our scope around the format?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Extremely grateful of any help you can provide.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Luke<o:p></o:p></p>
</div>
</div>
</div>
</body>
</html>