<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:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="&#1;" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@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;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 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";
        color:black;}
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;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
tt
        {mso-style-priority:99;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:black;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</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 bgcolor=white lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Maybe we haven&#8217;t always been as clear as we could be about
this&#8230;<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>It&#8217;s always best if developers can work within their
framework. The ESAPI project is trying to build some foundational security
controls so that developers don&#8217;t have to keep remaking the same mistakes
over and over.&nbsp; If your framework already provides a control already,
great.&nbsp; If your framework wants to use ESAPI and hide it from the
developer, great.&nbsp; In some cases, the framework might want to expose
ESAPI, and that&#8217;s fine too.<o:p></o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Sometimes, you may want to integrate ESAPI into your framework&#8217;s
existing security control. Generally this isn&#8217;t too hard. If you want to
use Struts Validators, for example, you can write a custom validator that
delegates to an ESAPI validator. This allows most developers to use the Struts
pattern as normal, but you get the advantage of canonicalization and intrusion
detection under the hood.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</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>&nbsp;</o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif";
color:windowtext'>From:</span></b><span style='font-size:10.0pt;font-family:
"Tahoma","sans-serif";color:windowtext'> esapi-user-bounces@lists.owasp.org
[mailto:esapi-user-bounces@lists.owasp.org] <b>On Behalf Of </b>Jim Manico<br>
<b>Sent:</b> Sunday, January 10, 2010 2:52 PM<br>
<b>To:</b> esapi-user@lists.owasp.org; 'Stephen de Vries'<br>
<b>Subject:</b> [Esapi-user] Stephen on ESAPI<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p class=MsoNormal>Stephen,<br>
<br>
I think this is very important and sage advice.<br>
<br>
Philosophically, we do not want to bring developers to ESAPI, we want to bring
ESAPI to developers. And that means working with where THEY are at and moving
form there.<br>
<br>
I have not seen a large company use ESAPI directly in their code (although
others may have). Due to the maturity level of ESAPI, I recommend that
companies integrate ESAPI into their own corporate library to fill in the gaps
(wrap it!). Everyone has a different nomenclature for function names. Also, I'm
a fan of calling <tt><span style='font-size:10.0pt'>ESAPI.encodeForHTML()</span></tt>
instead of <tt><span style='font-size:10.0pt'>ESAPI.encoder().encodeForHTML()</span></tt>
which is what every &quot;wrapper&quot; has done so far, from what I've seen.
(ie: YOUR ESAPI leveraging OWASP ESAPI).<br>
<br>
&gt;&nbsp; For the overlapping functions, I think that existing frameworks
already do an acceptable job of <b><u>providing authentication</u></b><br>
<br>
I agree 100%. I do not see a big use case for ESAPI authentication in most
large organizations - they usually have something like SSO or at least standard
authN classes in place already. We need more maturity in this area.<br>
<b><u><br>
&gt; , access control,</u></b> <br>
<br>
I think most frameworks get this wrong - in particular, I feel role based
access control is basically a design (or even security) anti-pattern - and we
need to move towards contextual/activity based access control. I am not saying
that ESAPI is there yet either, but Access Control is an area that merits a
great deal more research.<br>
<b><u><br>
&gt; data validation</u></b> <br>
<br>
I mostly agree - but keep in mind that most frameworks do NOT do
canonicalization, a crucial validation step. ESAPI does this better than the
average bear.<br>
<br>
<b><u>&gt; and logging,<br>
</u></b><br>
ESAPI provides something that log4j and others do not - security specific
logging. It's not groundbreaking - it's quite simple. But very crucial, IMO.<br>
<span style='font-size:10.0pt;font-family:"Courier New"'><br>
<tt>logger.error(Logger.SECURITY_FAILURE, &quot;Attempt to add unsafe data to
cookie (skip mode). Skipping cookie and continuing.&quot;);</tt></span><br>
<b><br>
&gt; so unless there's a compelling feature that the application needs from
ESAPI, I'd advise them to stick with their investment in their existing
frameworks.</b> <br>
<br>
I'd like to rephrase that a little&nbsp; &quot;Stick with your frameworks, but
use ESAPI to fill in the gaps&quot;<br>
<br>
Thanks for your thoughts, Stephen. I &quot;get&quot; where you are coming from,
and I think your head is in the right place. (About this topic, at least ;)<br>
<br>
Regards,<br>
- Jim<br>
<br>
<br>
<o:p></o:p></p>

<pre>On Jan 10, 2010, at 5:38 AM, Kevin W. Wall wrote:<o:p></o:p></pre><pre>&nbsp; <o:p></o:p></pre>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'><pre>IMO, I think the ideal situation would be if we could get the Spring and Struts,<o:p></o:p></pre><pre>etc. development communities to integrate their frameworks so that they could<o:p></o:p></pre><pre>be used with the ESAPI interfaces. (In many of these cases, these<o:p></o:p></pre><pre>implementations would replace the ESAPI reference implementation.) However,<o:p></o:p></pre><pre>that is obviously going to take some time. I don't think that the ESAPI<o:p></o:p></pre><pre>dev team can do it all.<o:p></o:p></pre><pre>&nbsp;&nbsp;&nbsp; <o:p></o:p></pre></blockquote>

<pre>I think this is overestimating ESAPI's place in the pecking order.&nbsp; Spring and J2E already have well established APIs for important security functions with a _lot_ of developers already invested in these APIs.&nbsp; A better approach would be for ESAPI to adapt its API to suit Spring and the other frameworks.<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>To touch on one of Dinis' questions, my advise would be for developers to use the features from their existing frameworks and only use ESAPI for the gaps.<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>I confess to not having used ESAPI (just scanned the API), but from what I know of other frameworks some of the gaps that ESAPI might plug would be:<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>- Output encoding in funky places, like JavaScript and CSS (Some apps never need this)<o:p></o:p></pre><pre>- CSRF protection (Sometimes the pageflow/workflow features of a framework will already give you CSRF protection, if not, then ESAPI)<o:p></o:p></pre><pre>- Intrusion detection (if the level of assurance demanded by the application requires it)<o:p></o:p></pre><pre>- Some methods from the HttpUtilities class could be useful (e.g. setNoCacheHeaders, setSafeContentType)<o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>For the overlapping functions, I think that existing frameworks already do an acceptable job of providing authentication, access control, data validation and logging, so unless there's a compelling feature that the application needs from ESAPI, I'd advise them to stick with their investment in their existing frameworks.<o:p></o:p></pre><pre> <o:p></o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>Stephen<o:p></o:p></pre><pre>_______________________________________________<o:p></o:p></pre><pre>Secure Coding mailing list (SC-L) <a
href="mailto:SC-L@securecoding.org">SC-L@securecoding.org</a><o:p></o:p></pre><pre>List information, subscriptions, etc - <a
href="http://krvw.com/mailman/listinfo/sc-l">http://krvw.com/mailman/listinfo/sc-l</a><o:p></o:p></pre><pre>List charter available at - <a
href="http://www.securecoding.org/list/charter.php">http://www.securecoding.org/list/charter.php</a><o:p></o:p></pre><pre>SC-L is hosted and moderated by KRvW Associates, LLC (<a
href="http://www.KRvW.com">http://www.KRvW.com</a>)<o:p></o:p></pre><pre>as a free, non-commercial service to the software security community.<o:p></o:p></pre><pre>_______________________________________________<o:p></o:p></pre><pre>&nbsp; <o:p></o:p></pre><pre>-- <o:p></o:p></pre><pre>Jim Manico<o:p></o:p></pre><pre>OWASP Podcast Host/Producer<o:p></o:p></pre><pre><a
href="http://www.manico.net">http://www.manico.net</a><o:p></o:p></pre></div>

</body>

</html>