All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.owasp.esapi.AccessReferenceMap Maven / Gradle / Ivy

Go to download

The Enterprise Security API (ESAPI) project is an OWASP project to create simple strong security controls for every web platform. Security controls are not simple to build. You can read about the hundreds of pitfalls for unwary developers on the OWASP website. By providing developers with a set of strong controls, we aim to eliminate some of the complexity of creating secure web applications. This can result in significant cost savings across the SDLC.

There is a newer version: 2.5.5.0
Show newest version
/**
 * OWASP Enterprise Security API (ESAPI)
 * 
 * This file is part of the Open Web Application Security Project (OWASP)
 * Enterprise Security API (ESAPI) project. For details, please see
 * http://www.owasp.org/index.php/ESAPI.
 *
 * Copyright (c) 2007 - The OWASP Foundation
 * 
 * The ESAPI is published by OWASP under the BSD license. You should read and accept the
 * LICENSE before you use, modify, and/or redistribute this software.
 * 
 * @author Jeff Williams Aspect Security
 * @created 2007
 */
package org.owasp.esapi;

import org.owasp.esapi.errors.AccessControlException;

import java.io.Serializable;
import java.util.Iterator;
import java.util.Set;


/**
 * The AccessReferenceMap interface is used to map from a set of internal
 * direct object references to a set of indirect references that are safe to
 * disclose publicly. This can be used to help protect database keys,
 * filenames, and other types of direct object references. As a rule, developers
 * should not expose their direct object references as it enables attackers to
 * attempt to manipulate them.
 * 

* Indirect references are handled as strings, to facilitate their use in HTML. * Implementations can generate simple integers or more complicated random * character strings as indirect references. Implementations should probably add * a constructor that takes a list of direct references. *

* Note that in addition to defeating all forms of parameter tampering attacks, * there is a side benefit of the AccessReferenceMap. Using random strings as indirect object * references, as opposed to simple integers makes it impossible for an attacker to * guess valid identifiers. So if per-user AccessReferenceMaps are used, then request * forgery (CSRF) attacks will also be prevented. * *

 * Set fileSet = new HashSet();
 * fileSet.addAll(...); // add direct references (e.g. File objects)
 * AccessReferenceMap map = new AccessReferenceMap( fileSet );
 * // store the map somewhere safe - like the session!
 * String indRef = map.getIndirectReference( file1 );
 * String href = "http://www.aspectsecurity.com/esapi?file=" + indRef );
 * ...
 * // if the indirect reference doesn't exist, it's likely an attack
 * // getDirectReference throws an AccessControlException
 * // you should handle as appropriate
 * String indref = request.getParameter( "file" );
 * File file = (File)map.getDirectReference( indref );
 * 
* *

* * @author Jeff Williams ([email protected]) * @author Chris Schmidt ([email protected]) */ public interface AccessReferenceMap extends Serializable { /** * Get an iterator through the direct object references. No guarantee is made as * to the order of items returned. * * @return the iterator */ Iterator iterator(); /** * Get a safe indirect reference to use in place of a potentially sensitive * direct object reference. Developers should use this call when building * URL's, form fields, hidden fields, etc... to help protect their private * implementation information. * * @param directReference * the direct reference * * @return * the indirect reference */ K getIndirectReference(T directReference); /** * Get the original direct object reference from an indirect reference. * Developers should use this when they get an indirect reference from a * request to translate it back into the real direct reference. If an * invalid indirect reference is requested, then an AccessControlException is * thrown. * * If a type is implied the requested object will be cast to that type, if the * object is not of the requested type, a AccessControlException will be thrown to * the caller. * * For example: *

    * UserProfile profile = arm.getDirectReference( indirectRef );
    * 
* * Will throw a AccessControlException if the object stored in memory is not of type * UserProfile. * * However, *
    * Object uncastObject = arm.getDirectReference( indirectRef );
    * 
* * Will never throw a AccessControlException as long as the object exists. If you are * unsure of the object type of that an indirect reference references you should get * the uncast object and test for type in the calling code. *
    * Object uncastProfile = arm.getDirectReference( indirectRef );
    * if ( uncastProfile instanceof UserProfile ) {
    *     UserProfile userProfile = (UserProfile) uncastProfile;
    *     // ...
    * } else {
    *     EmployeeProfile employeeProfile = (EmployeeProfile) uncastProfile;
    *     // ...
    * }
    * 
* * @param indirectReference * the indirect reference * * @return * the direct reference * * @throws AccessControlException * if no direct reference exists for the specified indirect reference * @throws ClassCastException * if the implied type is not the same as the referenced object type */ T getDirectReference(K indirectReference) throws AccessControlException; /** * Adds a direct reference to the AccessReferenceMap, then generates and returns * an associated indirect reference. * * @param direct * the direct reference * * @return * the corresponding indirect reference */ K addDirectReference(T direct); /** * Removes a direct reference and its associated indirect reference from the AccessReferenceMap. * * @param direct * the direct reference to remove * * @return * the corresponding indirect reference * * @throws AccessControlException * if the reference does not exist. */ K removeDirectReference(T direct) throws AccessControlException; /** * Updates the access reference map with a new set of direct references, maintaining * any existing indirect references associated with items that are in the new list. * New indirect references could be generated every time, but that * might mess up anything that previously used an indirect reference, such * as a URL parameter. * * @param directReferences * a Set of direct references to add */ void update(Set directReferences); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy