SlideShare une entreprise Scribd logo
1  sur  66
Télécharger pour lire hors ligne
Securing JSF Applications
                            Against the OWASP Top Ten



                               David Chandler
                               Sr. Engineer, Intuit
                               dchandler@turbomanage.com

              JSF One
             Rich Web
            Experience         Copyright © 2007 - The OWASP Foundation
             Sep 2008          Permission is granted to copy, distribute and/or modify this document under the
                               terms of the Creative Commons Attribution-ShareAlike 2.5 License. To view this
                               license, visit http://creativecommons.org/licenses/by-sa/2.5/




                               The OWASP Foundation
http://www.webappsec.org/       http://www.owasp.org/
JSF is a Great Framework

 Tool-friendly
 MVC
 Component-orientation makes reuse easy
 But….




      Is it safe?
             JSF One / Rich Web Experience Sep 2008
Framework Security Continuum
  More
  secure   Framework makes it impossible for
             developers to write insecure code
           Developers must do all the right stuff, but
             you can use code scanning tools and
             limited inspection to find holes
           Possible, but developers must do all the
             right stuff
           Not possible to create a secure app
             (framework is flawed)
 Less secure



                JSF One / Rich Web Experience Sep 2008
Security Analysis Goals

 Address framework / implementation
 vulnerabilities
 Lock front door and back door
 Inspect application code for vulnerabilities
    Ideally, centralize validation and use other JSF
    extensions to minimize inspection points
    Use automated scanning tools to verify that
       Application code uses only safe components / extensions
       Application code does not access the external context
       directly (HttpSession) or use Lifecycle in unsafe ways




                JSF One / Rich Web Experience Sep 2008
Our Mission Today

 Learn how to secure JSF applications
 Using the OWASP Top Ten as a guide
 OWASP=Open Web Application Security Project
   Fantastic resource
   Go to an OWASP conference sometime
   If your security folks think that Firewalls Are
   The Answer To Everything, they might enjoy an
   OWASP conference, too




             JSF One / Rich Web Experience Sep 2008
What is JavaServer Faces (JSF)?

 What is JSF?
    Spec, not an implementation (JSR 127, 252)
    Many vendor implementations and two open source
      Mojarra (Sun)
      Apache MyFaces
 Where does it fit in the frameworks universe?
    MVC, component-based framework servlet
    Builds on Struts controller, form bean concepts
    Builds on Tapestry components




              JSF One / Rich Web Experience Sep 2008
What’s in a Typical JSF App

 View templates (JSP or Facelets)
 Managed bean for each view registered in faces-
 config.xml
 Navigation rules in faces-config.xml




            JSF One / Rich Web Experience Sep 2008
Major JSF Concepts

 Components
 Renderers
 Managed beans
 Converters / Validators
 Controller (navigation model)
 Event handling
 Request lifecycle



            JSF One / Rich Web Experience Sep 2008
JSF Components

 Separate business logic from presentation
 Every view is composed of a component hierarchy
 Components can be added to view programmatically or
 via template (JSP by default, Facelets for superior
 performance and ease of development)
 Standard components divided into two groups:
   Faces Core <f:view>, <f:loadBundle>
   HTML wrappers <h:dataTable>, <h:selectMany>, etc.
 Component = class + [renderer] + tag handler (JSP)




              JSF One / Rich Web Experience Sep 2008
JSF Renderers

 Component renderer encodes (generates the
 HTML) for the component
 Renderer also decodes (sets component values
 from URL query string and form vars)
 Renderers are grouped into render kits
   Default render kit is HTML
   Provide device independence w/o changing the
   templating language or components themselves
 Most String I/O happens in renderers


             JSF One / Rich Web Experience Sep 2008
JSF Managed Beans

 Link view to the model (like controller)
   Provide action methods which in turn call appropriate
   model code (save, new)
   Provide helper methods (getAvailableSelectItems)
   Hold references to one or more domain objects
 Managed by the framework in one of several
 scopes
   Standard: request, session, application, none
   SEAM offers conversation scope
   Spring Web Flow offers flashScope, flowScope,
   conversationScope

             JSF One / Rich Web Experience Sep 2008
JSF Value Binding

 Component values bind to model beans
 For each request, the framework
   Converts each input value (String) into the underlying
   Java type (MoneyAmount)
   On output, converts underlying Java type to String
 You register converters for custom types
 All security validation therefore handled centrally
 and automatically by model type




              JSF One / Rich Web Experience Sep 2008
JSF Value Binding Example

  view.xhtml




  In logger object




                     JSF One / Rich Web Experience Sep 2008
JSF Value Binding Example

   view.xhtml




   Managed beans are registered in faces-config.xml




                 JSF One / Rich Web Experience Sep 2008
JSF Converters / Validators

 Converters are bi-directional
    Input converter: getAsObject()
    Output converter: getAsString()
 Validators work with Objects, not just Strings
 JSF supplies standard converters for date / time,
 numbers, etc.
 You write custom converters for rich types or
 special behavior




              JSF One / Rich Web Experience Sep 2008
JSF Converters / Validators




            JSF One / Rich Web Experience Sep 2008
JSF Converter Example
   Converter is registered in faces-config.xml, so all
   ValuedTypesafeEnum properties of any bean will use this converter




   Validators also registered in faces-config.xml, but not by class




                  JSF One / Rich Web Experience Sep 2008
JSF Controller

 Stateful or stateless navigation model
 Framework selects next view based on
    Previous view
    Outcome of the event handler
    Event itself (regardless of outcome)
    Any combination of the above
 Possibilities
    Universal error view (triggered by “error” outcome)
    Wildcard matching permitted in outcomes, view IDs




                 JSF One / Rich Web Experience Sep 2008
JSF Event Handling

 <h:commandButton action=“#{ReportCtrl.save}”>
    Generates an event when pressed
    save() is a method on a managed bean
 JSF calls ReportController.save()
 Can also define action listeners associated with other
 components in the form
    Example: AccountSearch on any page without having to tell JSF
    navigation controller about each instance
 Custom ActionListenerImpl runs before invoking method




                JSF One / Rich Web Experience Sep 2008
JSF Request Lifecycle

Restore       Retrieve component tree
 View         from client or session                        May skip to
      Apply Request                                        render phase
                           Decode components
         Values                                           or abort request
                           (populate w/ String values)
                    Process             Convert Strings to Objects
                   Validations          Validate Objects
Request
Request
                                   Update            Call setters
                                   Model             on managed beans
              Invoke bean method(s)           Invoke
              Compute navigation            Application
Response
Response                      Call bean getters to         Render
                              populate components         Response



           JSF One / Rich Web Experience Sep 2008
JSF Extension Points

 Custom components
 Phase listeners (before, after any phase)
 Custom converters / validators
 Custom renderers
 Custion ActionListenerImpl to handle event
 Decorate or replace view handler, navigation
 handler, state manager, etc.




            JSF One / Rich Web Experience Sep 2008
JSF Configuration

 faces-config.xml
 Contains navigation rules as well as any
 customizations / extensions
 Can be split among directories and sub-
 directories as well as jars
   Set javax.faces.application.CONFIG_FILES in web.xml
   Or put META-INF/faces-config.xml in jars so can
   bundle required configuration with code




             JSF One / Rich Web Experience Sep 2008
OWASP Top Ten*

   A1 Unvalidated Input                         A6 Injection Flaws
   A2 Broken Access                             A7 Improper Error
  Control                                       Handling
   A3 Broken Authentication                     A8 Insecure Storage
  and Session Mgmt                              A9 Application Denial of
   A4 Cross Site Scripting                      Service
   A5 Buffer Overflow                           A10 Insecure
                                                Configuration Mgmt



* Previous Top Ten listing used for better presentation flow

                       JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input

Parameter tampering (hidden & list boxes)
Required fields
Length, data type, allowed values
Cross site request forgery (CSRF)
Buffer overflows (see A5)




           JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
JSF Validation Process

  Validation is part of the request lifecycle
  When validation fails
    Throw ConverterException or ValidationException
    Add message to the message queue
       Message is associated with offending component
       Use <h:messages/>
       or <h:message for=“component_id”/>
       Don’t forget one of these in your view!
    Skip directly to render response phase




                JSF One / Rich Web Experience Sep 2008
JSF Request Lifecycle
               Retrieve component tree
Restore
               from client or session                         May skip to
 View
       Apply Request                                         render phase
                            Decode components
          Values                                            or abort request
                            (populate w/ String values)
                      Process             Convert Strings to Objects
                     Validations          Validate Objects
Request
Request                              Update            Call setters
                                     Model             on managed beans
                 Invoke bean method(s)          Invoke
                 Compute navigation           Application

Response                        Call bean getters to         Render
Response
                                populate components         Response




             JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
JSF Validation Process

  Thing of beauty!
    Model values never updated with invalid data
    User remains on current view
    No action methods called
    Messages tagged with component ID
  Unless…
    immediate=“true” for some component
    If so, managed bean can access raw component values through
    component tree (don’t!)
    JSF will NEVER update model unless validation passes




                JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Parameter Tampering

  Hidden fields
  Multiple choices (radio, check box, select)
  Required fields




              JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Parameter Tampering (Hidden Fields)


                                    Did you say hidden
                                    fields…?

                                    YUCK!

                                    Of course, they can be
                                    tampered with!
                                    Must rely on validation as
                                    with any other field



             JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Parameter Tampering (Select Options)

  List boxes, radio buttons, check boxes
    <h:selectOneRadio value=“#{bean.choice}”>
     <f:selectItems value=“#{bean.allChoices}>
    </h:selectOneRadio>
    JSF selectOne and selectMany components validate
    selected items against available choices
      Component calls selectItems getter again and compares
      selected String with available Strings
      See java.faces.component.UISelectOne/Many




               JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Parameter Tampering (Req’d Fields)

  Required fields
  <h:inputText value=“#{bean.prop}”
      required=“true or EL” />
  If required field is empty (“”, not null),
  JSF will fail validation as usual
    Can change default msg in properties file
    Or for really custom requiredness checking, write a
    custom converter (because validator doesn’t get
    called for empty fields, but converter does)



               JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Validating Length, Format, Data Type

  Built-in validators for length & range
    <f:validateLength…/>, <f:validateDoubleRange…/>,
    <f:validateLongRange…/>
    maxLength DOESN’T affect validation
  Built-in converters
    For all wrapper types (Boolean, Byte, etc.)
    <f:convertDateTime…/>, <f:convertNumber…/>
  See Tomahawk for e-mail, regex, credit card
  Server + client validators in Spring Web Flow
    Number, text (regex), date, currency
    Client-side built on Dojo

              JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Custom Validators

  Simple interface
    public void validate(…)
     throws ValidatorException
  Can invoke one of three ways
    setValidator() in custom component
    As validator tag (Facelets auto-wiring ☺) like built-ins
    <my:customValidator … />
    <h:inputText validator=“id | #{bean.validator}…>




               JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Custom Converters

  Simple interface
    getAsObject(…)
    getAsString(…)
  Invoke one of four ways
    By type of model property bound to component
    setConverter() in custom component
    As converter tag (Facelets auto-wiring ☺) like built-
    ins <my:customConverter … />
    <h:inputText converter=“id | #{bean.converter}…>




               JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Rich Type (Model Centric) Converter

  <converter-for-class>StringAN</…>
public static class UserCode extends StringAN {
    Public UserCode (String value) throws InvalidStringException {
      super(value, 14); // length
    }
}
    In your model class, define & use type UserCode
    Now all components bound to property of type UserCode
    are automatically converted / validated
    StringAN does validation in constructor so an invalid
    instance can never be created




                   JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
JSF Validation Summary

  Strengths
    All validations declarative
    Associated with view, not action (so can’t be
    overlooked in case of multiple actions)
    Model never updated unless all validations pass
    Converter-for-class eliminates need for explicit
    validator on every widget




               JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
JSF Validation Summary

  Weaknesses
    Requires manual inspection of views and beans to
    confirm that you didn’t miss a validator or two
  But can be automated…
    You use only custom converters / validators that add
    the id of each validated component to a Request
    variable
    And use a phase listener after validation to walk the
    component tree and find unvalidated UIInputs
    Appropriate for QA, but likely not production



               JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
JSF Validation Extra

  How can I validate related fields together?
    i.e., StartDate < EndDate
    Can do in bean action method. Not part of validation
    lifecyle, but can have all the same effects
       Return null outcome to remain on view
       Add message to queue
       Skip remainder of action method
    Alternatively, put a dummy tag after last form field
    <h:inputHidden validator=“#{bean.method}” />
       But model not updated yet, so must hard code component
       IDs in bean


                JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
What About JSF and AJAX?

  Approach 1
    Separate servlet or JSF phase listener to intercept
    and handle AJAX queries
    Bypasses JSF validation (ouch)
  Approach 2
    ICEFaces and RichFaces provide simple AJAX
    components
    Retains JSF server-side validation (good!)
 Careful! Some AJAX components use JSON and
 may be subject to JavaScript hijacking

               JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Cross Site Request Forgery (CSRF)

  Aka session riding, one-click attack
    Example
     <img src="http://www.example.com/transfer.do?
     frmAcct=document.form.frmAcct&
     toAcct=4345754&toSWIFTid=434343&amt=3434.43">
  How to prevent?
    JSF always uses POST to invoke actions
       Attack above would therefore fail
       But attacker can POST via JavaScript
    Solution: random token in each request
    For sensitive transactions, also some form of
    transaction signing with request (token, etc.)

                JSF One / Rich Web Experience Sep 2008
A1 Unvalidated Input
Cross Site Request Forgery (CSRF)

  JSF can be extended to prevent all out-of-
  sequence requests, including CSRF
    Postback URL is obtained from the ViewHandler
    Decorate ViewHandlerImpl to override getActionURL()
    and append a hash of the URL
    Write custom phase listener to
       Generate new token in Session for each request
       Compare hash in the URL with expected token
    All <h:commandLink>s and <h:commandButton>s
    are now protected (w/ no mappings required!)
  JSF 1.2 isPostback() headed the right direction,
  but not there yet (no random token)
                JSF One / Rich Web Experience Sep 2008
A2 Broken Access Control

Insecure IDs
Forced Browsing Past Access Control Checks
Path Traversal
File Permissions
Client Side Caching




           JSF One / Rich Web Experience Sep 2008
A2 Broken Access Control
Forced Browsing Past Access Control

  Safe approaches to user authentication
    Use built-in features of servlet container or portal
    Servlet filter
    Spring / ACEGI (see Cagatay Civici’s presentation)
    Extend MyFacesGenericPortlet with auth hooks
    Portlet filter—see MyFaces JIRA 434
    Phase listener before RESTORE_VIEW
       ExternalContext.getUserPrincipal()
       ExternalContext.isUserInRole()
       Both servlet impl and portlet impl define these methods




                JSF One / Rich Web Experience Sep 2008
A2 Broken Access Control
Forced Browsing Past Access Control

  Safe ways to control access to views
    (easy) Use rendered attribute with bean permission
    getters for fine-grained control
    <h:column rendered=“#{bean.hasPermX}”/>
    Use above with CSRF preventer
       Only have to check view perms when you display a link
    Mapping approaches
       Phase listener that maps view IDs to user perms
       And/or custom component to restrict access to view
       <my:authChecker reqPerm=“view_accounts” />
    Spring Security



                JSF One / Rich Web Experience Sep 2008
A2 Broken Access Control
Forced Browsing Past Access Control

  Safe ways to control access to actions
    (easy) Check perms in each bean action method
    Use rendered attribute with bean permission getters
    when displaying links
       <h:commandLink rendered=“#{bean.hasEditPerm}” />
       JSF automatically prevents forcing the action, even without
       forced browsing preventer
    Centralized approach
       Decorate ActionListenerImpl to intercept events
       Conceivable to annotate bean methods with required
       permissions
    Spring Security


                JSF One / Rich Web Experience Sep 2008
A2 Broken Access Control
Client Side Caching

  Concern: browser caching, shared terminals
  Use phase listener to write no-cache headers




             JSF One / Rich Web Experience Sep 2008
A3 Broken Authentication
and Session Management

  Not JSF-specific
    Password policy, storage
    Roll-your-own session management (don’t!)
    Protect login via SSL
  Login page should always POST, not GET
    JSF forms are always POSTed




              JSF One / Rich Web Experience Sep 2008
A4 Cross Site Scripting

Two types of attacks
  Stored (ex: malicious input stored in DB)
  Reflected (ex: malicious e-mail submits a request
  with cookie-stealing Javascript in text field)
    Reflected attacks are initiated externally (as via e-mail)
    Forced browsing / session riding preventer stops these since
    request doesn’t contain a valid hash
    Just make sure you don’t put an unchecked HTTP header or
    cookie in the error message
Two approaches: input & output filtering



             JSF One / Rich Web Experience Sep 2008
A4 Cross Site Scripting
Approach 1: Input Filtering

  Filter all input with Converters, Validators
    Positive enforcement (allowed characters only)
    stronger than negative enforcement (remove “bad”
    chars)
    JSF numeric converters protect numeric properties
    Don’t forget HTTP headers & cookies are input, too
  Rich type converters greatly help with text input
  (i.e., UserCode = alphanumeric, maxlen 14)
    Then you only need to worry about value bindings to
    free form String model properties


              JSF One / Rich Web Experience Sep 2008
A4 Cross Site Scripting
Approach 2: Output Filtering

  JSF does this mostly for you
    <h:outputText>, <h:outputFormat>,
    <h:outputLabel>, and <h:select…> values are
    escaped unless you turn off with escape=”false”
    <h:outputLink> URIs beginning with “javascript:” are
    escaped
    All other MyFaces 1.1.x components and attributes
    are safely rendered, but in 1.2 spec…
       image attribute of <h:commandButton> not esc’d
       src attribute of <h:graphicImage> not esc’d
    Escaped output chars are < > “ &
       NOT sufficient if JSF component within a JavaScript block!
                JSF One / Rich Web Experience Sep 2008
A4 Cross Site Scripting
XSS Code Review

  What to look for in view templates
     escape=“false”
     <h:outputLink value=“#{bean.property}” />
     Any output components between <script> tags
  What to look for elsewhere
    Rich type (custom) converters should properly escape
    output characters < > “ &
    Likewise custom components and renderers




              JSF One / Rich Web Experience Sep 2008
A5 Buffer Overflows

Not an issue in Java per se
Might be an issue for 3rd party systems (DB)
Always validate input for length
  Numeric types are safe (Integer, Long, etc.)
  Prefer rich types to Strings
  Use <f:maxLength> for String properties
  Keeping max lengths short also helps with XSS




            JSF One / Rich Web Experience Sep 2008
A6 Injection Flaws

Ex: SQL injection
SELECT * FROM users where ID = URL.ID
Suppose URL.ID = “34; DROP TABLE users”
Most effective protection is nearest the calls to
external system
  Use O/R mapping
  Parameterize all queries
JSF can help prevent often related information
leakage


             JSF One / Rich Web Experience Sep 2008
A6+ Information Leakage
Common Problem: IDs in URLs




  JSF <h:dataTable> uses indexed rows
    Don’t use <f:param> with real IDs
    Use ListDataModel and getRowData(). JSF will do the
    mapping and get the Object for you
    What if an item is added to the table between clicks?
    Could write custom HtmlDataTable component that
    overrides getClientId() to hash row values vs. index
    UIData is broken, see RichFaces ExtendedDataModel

              JSF One / Rich Web Experience Sep 2008
A6+ Information Leakage
Common Problem: IDs in OPTIONs

 Values of select options, radio buttons, check
 boxes often use real IDs
    Parameter tampering OK, but possible info leakage
  Several ways to avoid this
    Populate <f:selectItems> with Integer values that
    index into an array stored in your managed bean
       Could write SelectItemsHelper to map real values to indexed
       values, but creates dependency
    Better: create a custom converter w/ encrypted hash
       <my:hashConverter> used inside Select components
       Or perhaps even <my:selectItems> to replace JSF’s

                JSF One / Rich Web Experience Sep 2008
A6 Injection Flaws + Information Leakage
Summary

  Command injection not an issue with JSF per se
  But JSF can help prevent related information
  leakage
  Once again, converters are the key




             JSF One / Rich Web Experience Sep 2008
A7 Improper Error Handling

Not a JSF issue per se
Use standard servlet techniques
  <error-page> in web.xml, etc.
Try not to
  Show the user a stack trace
  Reveal names of internal machines, etc.




             JSF One / Rich Web Experience Sep 2008
A7 Improper Error Handling
Facelets Has Beautiful Error Messages

                                           Beautiful, but more
                                           than the customer
                                           needs to know
                                        <context-param>
                                          <param-name>
                                             facelets.DEVELOPMENT
                                          </param-name>
                                          <param-value>
                                             false
                                          </param-value>
                                        </context-param>




              JSF One / Rich Web Experience Sep 2008
A8 Insecure Storage

Not a Web tier problem
  Use hash vs. encryption for password DB, etc.
  Don’t write your own encryption algorithm!
Except for one thing in web.xml (see A10)




            JSF One / Rich Web Experience Sep 2008
A9 Application Denial of Service

All Web apps are vulnerable to some degree
  Forced browsing listener will minimize damage by
  rejecting bogus requests early
No known “magic bullets” for JSF like
ping –L 65510
Load test
Load test
Load test



            JSF One / Rich Web Experience Sep 2008
A10 Insecure Config Mgmt

Primarily concerned with
  Server OS, software, misconfigurations
  Improper file & directory permissions, etc.
  Unnecessary services
What about JSF configuration?
  State saving method
  View handler (JSP or Facelets)




             JSF One / Rich Web Experience Sep 2008
A10 Insecure Configuration Mgmt
Beware Client State Saving

  Server- (default) or client-side state saving
  Out of the box, client-side state saving is Base64
  encoded only (no encryption!)
    Allows hacker to alter component tree(!)
    Replace converters & validators
    Change EL expressions that populate fields, select
    boxes
    Change EL in command link to call different event
    handler, remove action listener




               JSF One / Rich Web Experience Sep 2008
A10 Insecure Configuration Mgmt
Enable Client State-Saving Encryption

  If client saving, provide encryption key in <init-
  param> org.apache.myfaces.secret
  Default algorithm is DES
  See myfaces-shared-impl StateUtils class to
  change
    Org.apache.myfaces.algorithm
    Org.apache.myfaces.algorithm.parameters
    Org.apache.myfaces.secret.cache




              JSF One / Rich Web Experience Sep 2008
A10 Insecure Configuration Mgmt
Lock Down .xhtml with Facelets

  Lock down .xhtml extension if using Facelets
    Rejecting servlet
    Or <security-constraint> in web.xml
    See Facelets doc for details




              JSF One / Rich Web Experience Sep 2008
Putting It All Together

  Use only rich types in model beans
  Rich type converter(s) should
    Provide positive input validation
    Index values for select components (radio, check,
    menu)
    Escape all other output
 Use listener to check for unvalidated
 components
 Use forced browsing / session riding preventer
 Dump JSP for Facelets
              JSF One / Rich Web Experience Sep 2008
Resources


owasp.org
facelets.dev.java.net
springframework.org
icefaces.org
labs.jboss.com/jbossrichfaces



dchandler@turbomanage.com
              JSF One / Rich Web Experience Sep 2008

Contenu connexe

Tendances

RichFaces 4 webinar #1: Everything You Need To Know
RichFaces 4 webinar #1: Everything You Need To KnowRichFaces 4 webinar #1: Everything You Need To Know
RichFaces 4 webinar #1: Everything You Need To KnowMax Katz
 
JSF Component Behaviors
JSF Component BehaviorsJSF Component Behaviors
JSF Component BehaviorsAndy Schwartz
 
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011Max Katz
 
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011Max Katz
 
25+ Reasons to use OmniFaces in JSF applications
25+ Reasons to use OmniFaces in JSF applications25+ Reasons to use OmniFaces in JSF applications
25+ Reasons to use OmniFaces in JSF applicationsAnghel Leonard
 
Spring MVC
Spring MVCSpring MVC
Spring MVCyuvalb
 
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)Kazuyuki Kawamura
 
Mastering OmniFaces - A Problem to Solution Approach
Mastering OmniFaces - A Problem to Solution ApproachMastering OmniFaces - A Problem to Solution Approach
Mastering OmniFaces - A Problem to Solution ApproachAnghel Leonard
 
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces Skills Matter
 
PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014cagataycivici
 
JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)Alexander Casall
 
Boston 2011 OTN Developer Days - Java EE 6
Boston 2011 OTN Developer Days - Java EE 6Boston 2011 OTN Developer Days - Java EE 6
Boston 2011 OTN Developer Days - Java EE 6Arun Gupta
 
Java Server Faces (JSF) - advanced
Java Server Faces (JSF) - advancedJava Server Faces (JSF) - advanced
Java Server Faces (JSF) - advancedBG Java EE Course
 
Liferay Devcon presentation on Workflow & Dynamic Forms
Liferay Devcon presentation on Workflow & Dynamic FormsLiferay Devcon presentation on Workflow & Dynamic Forms
Liferay Devcon presentation on Workflow & Dynamic FormsWillem Vermeer
 
Kaleo workflow in Liferay
Kaleo workflow in LiferayKaleo workflow in Liferay
Kaleo workflow in LiferayWillem Vermeer
 

Tendances (20)

RichFaces 4 webinar #1: Everything You Need To Know
RichFaces 4 webinar #1: Everything You Need To KnowRichFaces 4 webinar #1: Everything You Need To Know
RichFaces 4 webinar #1: Everything You Need To Know
 
Jsf intro
Jsf introJsf intro
Jsf intro
 
Introduction to jsf 2
Introduction to jsf 2Introduction to jsf 2
Introduction to jsf 2
 
JSF Component Behaviors
JSF Component BehaviorsJSF Component Behaviors
JSF Component Behaviors
 
Jsf presentation
Jsf presentationJsf presentation
Jsf presentation
 
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
Ajax Applications with JSF2 and New RichFaces 4 at JAX 2011
 
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
Ajax Applications with JSF 2 and New RichFaces 4 - CONFESS 2011
 
Java server faces
Java server facesJava server faces
Java server faces
 
25+ Reasons to use OmniFaces in JSF applications
25+ Reasons to use OmniFaces in JSF applications25+ Reasons to use OmniFaces in JSF applications
25+ Reasons to use OmniFaces in JSF applications
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
Spring as a Cloud Platform (Developer Summit 2011 17-C-5)
 
Mastering OmniFaces - A Problem to Solution Approach
Mastering OmniFaces - A Problem to Solution ApproachMastering OmniFaces - A Problem to Solution Approach
Mastering OmniFaces - A Problem to Solution Approach
 
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
In The Brain of Cagatay Civici: Exploring JavaServer Faces 2.0 and PrimeFaces
 
PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014
 
OmniFaces validators
OmniFaces validatorsOmniFaces validators
OmniFaces validators
 
JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)JavaFX in Action (devoxx'16)
JavaFX in Action (devoxx'16)
 
Boston 2011 OTN Developer Days - Java EE 6
Boston 2011 OTN Developer Days - Java EE 6Boston 2011 OTN Developer Days - Java EE 6
Boston 2011 OTN Developer Days - Java EE 6
 
Java Server Faces (JSF) - advanced
Java Server Faces (JSF) - advancedJava Server Faces (JSF) - advanced
Java Server Faces (JSF) - advanced
 
Liferay Devcon presentation on Workflow & Dynamic Forms
Liferay Devcon presentation on Workflow & Dynamic FormsLiferay Devcon presentation on Workflow & Dynamic Forms
Liferay Devcon presentation on Workflow & Dynamic Forms
 
Kaleo workflow in Liferay
Kaleo workflow in LiferayKaleo workflow in Liferay
Kaleo workflow in Liferay
 

Similaire à Securing JSF Applications Against the OWASP Top Ten

D22 Portlet Development With Open Source Frameworks
D22 Portlet Development With Open Source FrameworksD22 Portlet Development With Open Source Frameworks
D22 Portlet Development With Open Source FrameworksSunil Patil
 
D22 portlet development with open source frameworks
D22 portlet development with open source frameworksD22 portlet development with open source frameworks
D22 portlet development with open source frameworksSunil Patil
 
Introduction to Seam Applications
Introduction to Seam ApplicationsIntroduction to Seam Applications
Introduction to Seam Applicationsnuwanrg
 
Introduction to seam_applications_formated
Introduction to seam_applications_formatedIntroduction to seam_applications_formated
Introduction to seam_applications_formatednuwanrg
 
Introduction to seam_applications_formated
Introduction to seam_applications_formatedIntroduction to seam_applications_formated
Introduction to seam_applications_formatednuwanrg
 
Java New Evolution
Java New EvolutionJava New Evolution
Java New EvolutionAllan Huang
 
Introduction To JBoss Seam 2.1
Introduction To JBoss Seam 2.1Introduction To JBoss Seam 2.1
Introduction To JBoss Seam 2.1Priyatam M
 
Java Server Faces (JSF) - Basics
Java Server Faces (JSF) - BasicsJava Server Faces (JSF) - Basics
Java Server Faces (JSF) - BasicsBG Java EE Course
 
Introduction to ejb and struts framework
Introduction to ejb and struts frameworkIntroduction to ejb and struts framework
Introduction to ejb and struts frameworks4al_com
 
Java EE vs Spring Framework
Java  EE vs Spring Framework Java  EE vs Spring Framework
Java EE vs Spring Framework Rohit Kelapure
 
GlassFish OSGi Server
GlassFish OSGi ServerGlassFish OSGi Server
GlassFish OSGi ServerArtur Alves
 
Introduction to java ee
Introduction to java eeIntroduction to java ee
Introduction to java eeRanjan Kumar
 
Spring Portlet MVC
Spring Portlet MVCSpring Portlet MVC
Spring Portlet MVCJohn Lewis
 
Sprint Portlet MVC Seminar
Sprint Portlet MVC SeminarSprint Portlet MVC Seminar
Sprint Portlet MVC SeminarJohn Lewis
 

Similaire à Securing JSF Applications Against the OWASP Top Ten (20)

D22 Portlet Development With Open Source Frameworks
D22 Portlet Development With Open Source FrameworksD22 Portlet Development With Open Source Frameworks
D22 Portlet Development With Open Source Frameworks
 
D22 portlet development with open source frameworks
D22 portlet development with open source frameworksD22 portlet development with open source frameworks
D22 portlet development with open source frameworks
 
JBoss AS7 OSDC 2011
JBoss AS7 OSDC 2011JBoss AS7 OSDC 2011
JBoss AS7 OSDC 2011
 
JavaEE6 my way
JavaEE6 my wayJavaEE6 my way
JavaEE6 my way
 
Introduction to Seam Applications
Introduction to Seam ApplicationsIntroduction to Seam Applications
Introduction to Seam Applications
 
Introduction to seam_applications_formated
Introduction to seam_applications_formatedIntroduction to seam_applications_formated
Introduction to seam_applications_formated
 
Introduction to seam_applications_formated
Introduction to seam_applications_formatedIntroduction to seam_applications_formated
Introduction to seam_applications_formated
 
Jsf
JsfJsf
Jsf
 
Java New Evolution
Java New EvolutionJava New Evolution
Java New Evolution
 
Introduction To JBoss Seam 2.1
Introduction To JBoss Seam 2.1Introduction To JBoss Seam 2.1
Introduction To JBoss Seam 2.1
 
Java Server Faces (JSF) - Basics
Java Server Faces (JSF) - BasicsJava Server Faces (JSF) - Basics
Java Server Faces (JSF) - Basics
 
Introduction to ejb and struts framework
Introduction to ejb and struts frameworkIntroduction to ejb and struts framework
Introduction to ejb and struts framework
 
Java EE vs Spring Framework
Java  EE vs Spring Framework Java  EE vs Spring Framework
Java EE vs Spring Framework
 
GlassFish OSGi Server
GlassFish OSGi ServerGlassFish OSGi Server
GlassFish OSGi Server
 
Introduction to java ee
Introduction to java eeIntroduction to java ee
Introduction to java ee
 
Jsfsunum
JsfsunumJsfsunum
Jsfsunum
 
Struts Ppt 1
Struts Ppt 1Struts Ppt 1
Struts Ppt 1
 
Customizing Oracle EBS OA Framework
Customizing Oracle EBS OA FrameworkCustomizing Oracle EBS OA Framework
Customizing Oracle EBS OA Framework
 
Spring Portlet MVC
Spring Portlet MVCSpring Portlet MVC
Spring Portlet MVC
 
Sprint Portlet MVC Seminar
Sprint Portlet MVC SeminarSprint Portlet MVC Seminar
Sprint Portlet MVC Seminar
 

Plus de David Chandler

Taking Your GWT App to Tablets with GXT 4.0
Taking Your GWT App to Tablets with GXT 4.0Taking Your GWT App to Tablets with GXT 4.0
Taking Your GWT App to Tablets with GXT 4.0David Chandler
 
StORM: a lightweight ORM for Android SQLite
StORM: a lightweight ORM for Android SQLiteStORM: a lightweight ORM for Android SQLite
StORM: a lightweight ORM for Android SQLiteDavid Chandler
 
Easy REST APIs with Jersey and RestyGWT
Easy REST APIs with Jersey and RestyGWTEasy REST APIs with Jersey and RestyGWT
Easy REST APIs with Jersey and RestyGWTDavid Chandler
 
Cómo trabajan los Googlers
Cómo trabajan los GooglersCómo trabajan los Googlers
Cómo trabajan los GooglersDavid Chandler
 
Google App Engine Update 2012
Google App Engine Update 2012Google App Engine Update 2012
Google App Engine Update 2012David Chandler
 
Scalable Apps with Google App Engine
Scalable Apps with Google App EngineScalable Apps with Google App Engine
Scalable Apps with Google App EngineDavid Chandler
 
Develop and Deploy Scalable Apps with Google App Engine
Develop and Deploy Scalable Apps with Google App EngineDevelop and Deploy Scalable Apps with Google App Engine
Develop and Deploy Scalable Apps with Google App EngineDavid Chandler
 
The 90-Day Startup with Google AppEngine for Java
The 90-Day Startup with Google AppEngine for JavaThe 90-Day Startup with Google AppEngine for Java
The 90-Day Startup with Google AppEngine for JavaDavid Chandler
 

Plus de David Chandler (14)

Taking Your GWT App to Tablets with GXT 4.0
Taking Your GWT App to Tablets with GXT 4.0Taking Your GWT App to Tablets with GXT 4.0
Taking Your GWT App to Tablets with GXT 4.0
 
StORM: a lightweight ORM for Android SQLite
StORM: a lightweight ORM for Android SQLiteStORM: a lightweight ORM for Android SQLite
StORM: a lightweight ORM for Android SQLite
 
Easy REST APIs with Jersey and RestyGWT
Easy REST APIs with Jersey and RestyGWTEasy REST APIs with Jersey and RestyGWT
Easy REST APIs with Jersey and RestyGWT
 
Cómo trabajan los Googlers
Cómo trabajan los GooglersCómo trabajan los Googlers
Cómo trabajan los Googlers
 
Life of an engineer
Life of an engineerLife of an engineer
Life of an engineer
 
StORM preview
StORM previewStORM preview
StORM preview
 
Google App Engine Update 2012
Google App Engine Update 2012Google App Engine Update 2012
Google App Engine Update 2012
 
GWT Plus HTML 5
GWT Plus HTML 5GWT Plus HTML 5
GWT Plus HTML 5
 
Scalable Apps with Google App Engine
Scalable Apps with Google App EngineScalable Apps with Google App Engine
Scalable Apps with Google App Engine
 
What's New in GWT 2.2
What's New in GWT 2.2What's New in GWT 2.2
What's New in GWT 2.2
 
Develop and Deploy Scalable Apps with Google App Engine
Develop and Deploy Scalable Apps with Google App EngineDevelop and Deploy Scalable Apps with Google App Engine
Develop and Deploy Scalable Apps with Google App Engine
 
Secrets of the GWT
Secrets of the GWTSecrets of the GWT
Secrets of the GWT
 
The 90-Day Startup with Google AppEngine for Java
The 90-Day Startup with Google AppEngine for JavaThe 90-Day Startup with Google AppEngine for Java
The 90-Day Startup with Google AppEngine for Java
 
GWT MVP Case Study
GWT MVP Case StudyGWT MVP Case Study
GWT MVP Case Study
 

Securing JSF Applications Against the OWASP Top Ten

  • 1. Securing JSF Applications Against the OWASP Top Ten David Chandler Sr. Engineer, Intuit dchandler@turbomanage.com JSF One Rich Web Experience Copyright © 2007 - The OWASP Foundation Sep 2008 Permission is granted to copy, distribute and/or modify this document under the terms of the Creative Commons Attribution-ShareAlike 2.5 License. To view this license, visit http://creativecommons.org/licenses/by-sa/2.5/ The OWASP Foundation http://www.webappsec.org/ http://www.owasp.org/
  • 2. JSF is a Great Framework Tool-friendly MVC Component-orientation makes reuse easy But…. Is it safe? JSF One / Rich Web Experience Sep 2008
  • 3. Framework Security Continuum More secure Framework makes it impossible for developers to write insecure code Developers must do all the right stuff, but you can use code scanning tools and limited inspection to find holes Possible, but developers must do all the right stuff Not possible to create a secure app (framework is flawed) Less secure JSF One / Rich Web Experience Sep 2008
  • 4. Security Analysis Goals Address framework / implementation vulnerabilities Lock front door and back door Inspect application code for vulnerabilities Ideally, centralize validation and use other JSF extensions to minimize inspection points Use automated scanning tools to verify that Application code uses only safe components / extensions Application code does not access the external context directly (HttpSession) or use Lifecycle in unsafe ways JSF One / Rich Web Experience Sep 2008
  • 5. Our Mission Today Learn how to secure JSF applications Using the OWASP Top Ten as a guide OWASP=Open Web Application Security Project Fantastic resource Go to an OWASP conference sometime If your security folks think that Firewalls Are The Answer To Everything, they might enjoy an OWASP conference, too JSF One / Rich Web Experience Sep 2008
  • 6. What is JavaServer Faces (JSF)? What is JSF? Spec, not an implementation (JSR 127, 252) Many vendor implementations and two open source Mojarra (Sun) Apache MyFaces Where does it fit in the frameworks universe? MVC, component-based framework servlet Builds on Struts controller, form bean concepts Builds on Tapestry components JSF One / Rich Web Experience Sep 2008
  • 7. What’s in a Typical JSF App View templates (JSP or Facelets) Managed bean for each view registered in faces- config.xml Navigation rules in faces-config.xml JSF One / Rich Web Experience Sep 2008
  • 8. Major JSF Concepts Components Renderers Managed beans Converters / Validators Controller (navigation model) Event handling Request lifecycle JSF One / Rich Web Experience Sep 2008
  • 9. JSF Components Separate business logic from presentation Every view is composed of a component hierarchy Components can be added to view programmatically or via template (JSP by default, Facelets for superior performance and ease of development) Standard components divided into two groups: Faces Core <f:view>, <f:loadBundle> HTML wrappers <h:dataTable>, <h:selectMany>, etc. Component = class + [renderer] + tag handler (JSP) JSF One / Rich Web Experience Sep 2008
  • 10. JSF Renderers Component renderer encodes (generates the HTML) for the component Renderer also decodes (sets component values from URL query string and form vars) Renderers are grouped into render kits Default render kit is HTML Provide device independence w/o changing the templating language or components themselves Most String I/O happens in renderers JSF One / Rich Web Experience Sep 2008
  • 11. JSF Managed Beans Link view to the model (like controller) Provide action methods which in turn call appropriate model code (save, new) Provide helper methods (getAvailableSelectItems) Hold references to one or more domain objects Managed by the framework in one of several scopes Standard: request, session, application, none SEAM offers conversation scope Spring Web Flow offers flashScope, flowScope, conversationScope JSF One / Rich Web Experience Sep 2008
  • 12. JSF Value Binding Component values bind to model beans For each request, the framework Converts each input value (String) into the underlying Java type (MoneyAmount) On output, converts underlying Java type to String You register converters for custom types All security validation therefore handled centrally and automatically by model type JSF One / Rich Web Experience Sep 2008
  • 13. JSF Value Binding Example view.xhtml In logger object JSF One / Rich Web Experience Sep 2008
  • 14. JSF Value Binding Example view.xhtml Managed beans are registered in faces-config.xml JSF One / Rich Web Experience Sep 2008
  • 15. JSF Converters / Validators Converters are bi-directional Input converter: getAsObject() Output converter: getAsString() Validators work with Objects, not just Strings JSF supplies standard converters for date / time, numbers, etc. You write custom converters for rich types or special behavior JSF One / Rich Web Experience Sep 2008
  • 16. JSF Converters / Validators JSF One / Rich Web Experience Sep 2008
  • 17. JSF Converter Example Converter is registered in faces-config.xml, so all ValuedTypesafeEnum properties of any bean will use this converter Validators also registered in faces-config.xml, but not by class JSF One / Rich Web Experience Sep 2008
  • 18. JSF Controller Stateful or stateless navigation model Framework selects next view based on Previous view Outcome of the event handler Event itself (regardless of outcome) Any combination of the above Possibilities Universal error view (triggered by “error” outcome) Wildcard matching permitted in outcomes, view IDs JSF One / Rich Web Experience Sep 2008
  • 19. JSF Event Handling <h:commandButton action=“#{ReportCtrl.save}”> Generates an event when pressed save() is a method on a managed bean JSF calls ReportController.save() Can also define action listeners associated with other components in the form Example: AccountSearch on any page without having to tell JSF navigation controller about each instance Custom ActionListenerImpl runs before invoking method JSF One / Rich Web Experience Sep 2008
  • 20. JSF Request Lifecycle Restore Retrieve component tree View from client or session May skip to Apply Request render phase Decode components Values or abort request (populate w/ String values) Process Convert Strings to Objects Validations Validate Objects Request Request Update Call setters Model on managed beans Invoke bean method(s) Invoke Compute navigation Application Response Response Call bean getters to Render populate components Response JSF One / Rich Web Experience Sep 2008
  • 21. JSF Extension Points Custom components Phase listeners (before, after any phase) Custom converters / validators Custom renderers Custion ActionListenerImpl to handle event Decorate or replace view handler, navigation handler, state manager, etc. JSF One / Rich Web Experience Sep 2008
  • 22. JSF Configuration faces-config.xml Contains navigation rules as well as any customizations / extensions Can be split among directories and sub- directories as well as jars Set javax.faces.application.CONFIG_FILES in web.xml Or put META-INF/faces-config.xml in jars so can bundle required configuration with code JSF One / Rich Web Experience Sep 2008
  • 23. OWASP Top Ten* A1 Unvalidated Input A6 Injection Flaws A2 Broken Access A7 Improper Error Control Handling A3 Broken Authentication A8 Insecure Storage and Session Mgmt A9 Application Denial of A4 Cross Site Scripting Service A5 Buffer Overflow A10 Insecure Configuration Mgmt * Previous Top Ten listing used for better presentation flow JSF One / Rich Web Experience Sep 2008
  • 24. A1 Unvalidated Input Parameter tampering (hidden & list boxes) Required fields Length, data type, allowed values Cross site request forgery (CSRF) Buffer overflows (see A5) JSF One / Rich Web Experience Sep 2008
  • 25. A1 Unvalidated Input JSF Validation Process Validation is part of the request lifecycle When validation fails Throw ConverterException or ValidationException Add message to the message queue Message is associated with offending component Use <h:messages/> or <h:message for=“component_id”/> Don’t forget one of these in your view! Skip directly to render response phase JSF One / Rich Web Experience Sep 2008
  • 26. JSF Request Lifecycle Retrieve component tree Restore from client or session May skip to View Apply Request render phase Decode components Values or abort request (populate w/ String values) Process Convert Strings to Objects Validations Validate Objects Request Request Update Call setters Model on managed beans Invoke bean method(s) Invoke Compute navigation Application Response Call bean getters to Render Response populate components Response JSF One / Rich Web Experience Sep 2008
  • 27. A1 Unvalidated Input JSF Validation Process Thing of beauty! Model values never updated with invalid data User remains on current view No action methods called Messages tagged with component ID Unless… immediate=“true” for some component If so, managed bean can access raw component values through component tree (don’t!) JSF will NEVER update model unless validation passes JSF One / Rich Web Experience Sep 2008
  • 28. A1 Unvalidated Input Parameter Tampering Hidden fields Multiple choices (radio, check box, select) Required fields JSF One / Rich Web Experience Sep 2008
  • 29. A1 Unvalidated Input Parameter Tampering (Hidden Fields) Did you say hidden fields…? YUCK! Of course, they can be tampered with! Must rely on validation as with any other field JSF One / Rich Web Experience Sep 2008
  • 30. A1 Unvalidated Input Parameter Tampering (Select Options) List boxes, radio buttons, check boxes <h:selectOneRadio value=“#{bean.choice}”> <f:selectItems value=“#{bean.allChoices}> </h:selectOneRadio> JSF selectOne and selectMany components validate selected items against available choices Component calls selectItems getter again and compares selected String with available Strings See java.faces.component.UISelectOne/Many JSF One / Rich Web Experience Sep 2008
  • 31. A1 Unvalidated Input Parameter Tampering (Req’d Fields) Required fields <h:inputText value=“#{bean.prop}” required=“true or EL” /> If required field is empty (“”, not null), JSF will fail validation as usual Can change default msg in properties file Or for really custom requiredness checking, write a custom converter (because validator doesn’t get called for empty fields, but converter does) JSF One / Rich Web Experience Sep 2008
  • 32. A1 Unvalidated Input Validating Length, Format, Data Type Built-in validators for length & range <f:validateLength…/>, <f:validateDoubleRange…/>, <f:validateLongRange…/> maxLength DOESN’T affect validation Built-in converters For all wrapper types (Boolean, Byte, etc.) <f:convertDateTime…/>, <f:convertNumber…/> See Tomahawk for e-mail, regex, credit card Server + client validators in Spring Web Flow Number, text (regex), date, currency Client-side built on Dojo JSF One / Rich Web Experience Sep 2008
  • 33. A1 Unvalidated Input Custom Validators Simple interface public void validate(…) throws ValidatorException Can invoke one of three ways setValidator() in custom component As validator tag (Facelets auto-wiring ☺) like built-ins <my:customValidator … /> <h:inputText validator=“id | #{bean.validator}…> JSF One / Rich Web Experience Sep 2008
  • 34. A1 Unvalidated Input Custom Converters Simple interface getAsObject(…) getAsString(…) Invoke one of four ways By type of model property bound to component setConverter() in custom component As converter tag (Facelets auto-wiring ☺) like built- ins <my:customConverter … /> <h:inputText converter=“id | #{bean.converter}…> JSF One / Rich Web Experience Sep 2008
  • 35. A1 Unvalidated Input Rich Type (Model Centric) Converter <converter-for-class>StringAN</…> public static class UserCode extends StringAN { Public UserCode (String value) throws InvalidStringException { super(value, 14); // length } } In your model class, define & use type UserCode Now all components bound to property of type UserCode are automatically converted / validated StringAN does validation in constructor so an invalid instance can never be created JSF One / Rich Web Experience Sep 2008
  • 36. A1 Unvalidated Input JSF Validation Summary Strengths All validations declarative Associated with view, not action (so can’t be overlooked in case of multiple actions) Model never updated unless all validations pass Converter-for-class eliminates need for explicit validator on every widget JSF One / Rich Web Experience Sep 2008
  • 37. A1 Unvalidated Input JSF Validation Summary Weaknesses Requires manual inspection of views and beans to confirm that you didn’t miss a validator or two But can be automated… You use only custom converters / validators that add the id of each validated component to a Request variable And use a phase listener after validation to walk the component tree and find unvalidated UIInputs Appropriate for QA, but likely not production JSF One / Rich Web Experience Sep 2008
  • 38. A1 Unvalidated Input JSF Validation Extra How can I validate related fields together? i.e., StartDate < EndDate Can do in bean action method. Not part of validation lifecyle, but can have all the same effects Return null outcome to remain on view Add message to queue Skip remainder of action method Alternatively, put a dummy tag after last form field <h:inputHidden validator=“#{bean.method}” /> But model not updated yet, so must hard code component IDs in bean JSF One / Rich Web Experience Sep 2008
  • 39. A1 Unvalidated Input What About JSF and AJAX? Approach 1 Separate servlet or JSF phase listener to intercept and handle AJAX queries Bypasses JSF validation (ouch) Approach 2 ICEFaces and RichFaces provide simple AJAX components Retains JSF server-side validation (good!) Careful! Some AJAX components use JSON and may be subject to JavaScript hijacking JSF One / Rich Web Experience Sep 2008
  • 40. A1 Unvalidated Input Cross Site Request Forgery (CSRF) Aka session riding, one-click attack Example <img src="http://www.example.com/transfer.do? frmAcct=document.form.frmAcct& toAcct=4345754&toSWIFTid=434343&amt=3434.43"> How to prevent? JSF always uses POST to invoke actions Attack above would therefore fail But attacker can POST via JavaScript Solution: random token in each request For sensitive transactions, also some form of transaction signing with request (token, etc.) JSF One / Rich Web Experience Sep 2008
  • 41. A1 Unvalidated Input Cross Site Request Forgery (CSRF) JSF can be extended to prevent all out-of- sequence requests, including CSRF Postback URL is obtained from the ViewHandler Decorate ViewHandlerImpl to override getActionURL() and append a hash of the URL Write custom phase listener to Generate new token in Session for each request Compare hash in the URL with expected token All <h:commandLink>s and <h:commandButton>s are now protected (w/ no mappings required!) JSF 1.2 isPostback() headed the right direction, but not there yet (no random token) JSF One / Rich Web Experience Sep 2008
  • 42. A2 Broken Access Control Insecure IDs Forced Browsing Past Access Control Checks Path Traversal File Permissions Client Side Caching JSF One / Rich Web Experience Sep 2008
  • 43. A2 Broken Access Control Forced Browsing Past Access Control Safe approaches to user authentication Use built-in features of servlet container or portal Servlet filter Spring / ACEGI (see Cagatay Civici’s presentation) Extend MyFacesGenericPortlet with auth hooks Portlet filter—see MyFaces JIRA 434 Phase listener before RESTORE_VIEW ExternalContext.getUserPrincipal() ExternalContext.isUserInRole() Both servlet impl and portlet impl define these methods JSF One / Rich Web Experience Sep 2008
  • 44. A2 Broken Access Control Forced Browsing Past Access Control Safe ways to control access to views (easy) Use rendered attribute with bean permission getters for fine-grained control <h:column rendered=“#{bean.hasPermX}”/> Use above with CSRF preventer Only have to check view perms when you display a link Mapping approaches Phase listener that maps view IDs to user perms And/or custom component to restrict access to view <my:authChecker reqPerm=“view_accounts” /> Spring Security JSF One / Rich Web Experience Sep 2008
  • 45. A2 Broken Access Control Forced Browsing Past Access Control Safe ways to control access to actions (easy) Check perms in each bean action method Use rendered attribute with bean permission getters when displaying links <h:commandLink rendered=“#{bean.hasEditPerm}” /> JSF automatically prevents forcing the action, even without forced browsing preventer Centralized approach Decorate ActionListenerImpl to intercept events Conceivable to annotate bean methods with required permissions Spring Security JSF One / Rich Web Experience Sep 2008
  • 46. A2 Broken Access Control Client Side Caching Concern: browser caching, shared terminals Use phase listener to write no-cache headers JSF One / Rich Web Experience Sep 2008
  • 47. A3 Broken Authentication and Session Management Not JSF-specific Password policy, storage Roll-your-own session management (don’t!) Protect login via SSL Login page should always POST, not GET JSF forms are always POSTed JSF One / Rich Web Experience Sep 2008
  • 48. A4 Cross Site Scripting Two types of attacks Stored (ex: malicious input stored in DB) Reflected (ex: malicious e-mail submits a request with cookie-stealing Javascript in text field) Reflected attacks are initiated externally (as via e-mail) Forced browsing / session riding preventer stops these since request doesn’t contain a valid hash Just make sure you don’t put an unchecked HTTP header or cookie in the error message Two approaches: input & output filtering JSF One / Rich Web Experience Sep 2008
  • 49. A4 Cross Site Scripting Approach 1: Input Filtering Filter all input with Converters, Validators Positive enforcement (allowed characters only) stronger than negative enforcement (remove “bad” chars) JSF numeric converters protect numeric properties Don’t forget HTTP headers & cookies are input, too Rich type converters greatly help with text input (i.e., UserCode = alphanumeric, maxlen 14) Then you only need to worry about value bindings to free form String model properties JSF One / Rich Web Experience Sep 2008
  • 50. A4 Cross Site Scripting Approach 2: Output Filtering JSF does this mostly for you <h:outputText>, <h:outputFormat>, <h:outputLabel>, and <h:select…> values are escaped unless you turn off with escape=”false” <h:outputLink> URIs beginning with “javascript:” are escaped All other MyFaces 1.1.x components and attributes are safely rendered, but in 1.2 spec… image attribute of <h:commandButton> not esc’d src attribute of <h:graphicImage> not esc’d Escaped output chars are < > “ & NOT sufficient if JSF component within a JavaScript block! JSF One / Rich Web Experience Sep 2008
  • 51. A4 Cross Site Scripting XSS Code Review What to look for in view templates escape=“false” <h:outputLink value=“#{bean.property}” /> Any output components between <script> tags What to look for elsewhere Rich type (custom) converters should properly escape output characters < > “ & Likewise custom components and renderers JSF One / Rich Web Experience Sep 2008
  • 52. A5 Buffer Overflows Not an issue in Java per se Might be an issue for 3rd party systems (DB) Always validate input for length Numeric types are safe (Integer, Long, etc.) Prefer rich types to Strings Use <f:maxLength> for String properties Keeping max lengths short also helps with XSS JSF One / Rich Web Experience Sep 2008
  • 53. A6 Injection Flaws Ex: SQL injection SELECT * FROM users where ID = URL.ID Suppose URL.ID = “34; DROP TABLE users” Most effective protection is nearest the calls to external system Use O/R mapping Parameterize all queries JSF can help prevent often related information leakage JSF One / Rich Web Experience Sep 2008
  • 54. A6+ Information Leakage Common Problem: IDs in URLs JSF <h:dataTable> uses indexed rows Don’t use <f:param> with real IDs Use ListDataModel and getRowData(). JSF will do the mapping and get the Object for you What if an item is added to the table between clicks? Could write custom HtmlDataTable component that overrides getClientId() to hash row values vs. index UIData is broken, see RichFaces ExtendedDataModel JSF One / Rich Web Experience Sep 2008
  • 55. A6+ Information Leakage Common Problem: IDs in OPTIONs Values of select options, radio buttons, check boxes often use real IDs Parameter tampering OK, but possible info leakage Several ways to avoid this Populate <f:selectItems> with Integer values that index into an array stored in your managed bean Could write SelectItemsHelper to map real values to indexed values, but creates dependency Better: create a custom converter w/ encrypted hash <my:hashConverter> used inside Select components Or perhaps even <my:selectItems> to replace JSF’s JSF One / Rich Web Experience Sep 2008
  • 56. A6 Injection Flaws + Information Leakage Summary Command injection not an issue with JSF per se But JSF can help prevent related information leakage Once again, converters are the key JSF One / Rich Web Experience Sep 2008
  • 57. A7 Improper Error Handling Not a JSF issue per se Use standard servlet techniques <error-page> in web.xml, etc. Try not to Show the user a stack trace Reveal names of internal machines, etc. JSF One / Rich Web Experience Sep 2008
  • 58. A7 Improper Error Handling Facelets Has Beautiful Error Messages Beautiful, but more than the customer needs to know <context-param> <param-name> facelets.DEVELOPMENT </param-name> <param-value> false </param-value> </context-param> JSF One / Rich Web Experience Sep 2008
  • 59. A8 Insecure Storage Not a Web tier problem Use hash vs. encryption for password DB, etc. Don’t write your own encryption algorithm! Except for one thing in web.xml (see A10) JSF One / Rich Web Experience Sep 2008
  • 60. A9 Application Denial of Service All Web apps are vulnerable to some degree Forced browsing listener will minimize damage by rejecting bogus requests early No known “magic bullets” for JSF like ping –L 65510 Load test Load test Load test JSF One / Rich Web Experience Sep 2008
  • 61. A10 Insecure Config Mgmt Primarily concerned with Server OS, software, misconfigurations Improper file & directory permissions, etc. Unnecessary services What about JSF configuration? State saving method View handler (JSP or Facelets) JSF One / Rich Web Experience Sep 2008
  • 62. A10 Insecure Configuration Mgmt Beware Client State Saving Server- (default) or client-side state saving Out of the box, client-side state saving is Base64 encoded only (no encryption!) Allows hacker to alter component tree(!) Replace converters & validators Change EL expressions that populate fields, select boxes Change EL in command link to call different event handler, remove action listener JSF One / Rich Web Experience Sep 2008
  • 63. A10 Insecure Configuration Mgmt Enable Client State-Saving Encryption If client saving, provide encryption key in <init- param> org.apache.myfaces.secret Default algorithm is DES See myfaces-shared-impl StateUtils class to change Org.apache.myfaces.algorithm Org.apache.myfaces.algorithm.parameters Org.apache.myfaces.secret.cache JSF One / Rich Web Experience Sep 2008
  • 64. A10 Insecure Configuration Mgmt Lock Down .xhtml with Facelets Lock down .xhtml extension if using Facelets Rejecting servlet Or <security-constraint> in web.xml See Facelets doc for details JSF One / Rich Web Experience Sep 2008
  • 65. Putting It All Together Use only rich types in model beans Rich type converter(s) should Provide positive input validation Index values for select components (radio, check, menu) Escape all other output Use listener to check for unvalidated components Use forced browsing / session riding preventer Dump JSP for Facelets JSF One / Rich Web Experience Sep 2008