| <?xml version="1.0"?> |
| |
| <!-- |
| |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| |
| --> |
| |
| <!-- ========================================================================= --> |
| <!-- author vincent.hardy@sun.com --> |
| <!-- version $Id: security.xml 201374 2004-08-18 07:17:26Z vhardy $ --> |
| <!-- ========================================================================= --> |
| |
| <!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd"> |
| <document> |
| <header> |
| <title>Script security</title> |
| </header> |
| |
| <body> |
| <p> |
| With the addition of scripting support in Batik 1.5, security features |
| have also been added to enable users of the Batik toolkit to run |
| scripts in a secure manner. |
| </p> |
| <p> |
| If you are using script, please make sure you have reviewed the |
| <a href="../../index.html#SecurityWarning">Script Security |
| Warning</a> with regards to the Batik 1.5 release. |
| </p> |
| |
| <section id="sandbox"> |
| <title>Running scripts securely</title> |
| |
| <p> |
| The Java platform offers a lot of options for running applications |
| securely. Running an application securely requires that it runs in a |
| so-called security sand-box which controls all the access the |
| application makes to restricted resources (such as the file system). |
| </p> |
| |
| <p> |
| The concept of Java security is an application-wide concept. As such, |
| it has to be applied at the application level (and not at the |
| framework level). In the Batik distribution, the sample applications |
| (such as the <a href="site:browser">Squiggle Browser</a> and the |
| <a href="site:rasterizer">SVG rasterizer</a>) apply |
| security (or disable it) but the framework does not apply it: it is |
| security-aware (meaning that it is able to handle security |
| exceptions). |
| </p> |
| |
| <section id="enforcing"> |
| <title>Enforcing security in a Batik application</title> |
| |
| <p> |
| Enforcing security in a Batik application is done by setting a |
| <a class="class" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/SecurityManager.html">java.lang.SecurityManager</a>. |
| This security manager will apply the security settings of the Java |
| platform (as defined by the |
| <em>jre-dir</em><code>/lib/security/java.policy</code> and, |
| optionally, by the policy file whose URL is defined in the |
| <code>java.security.policy</code> system property). |
| </p> |
| |
| <p> |
| The |
| <a class="class" href="../../javadoc/org/apache/batik/util/ApplicationSecurityEnforcer.html">org.apache.batik.util.ApplicationSecurityEnforcer</a> |
| helper class makes it easier for Batik application |
| developers to add security support in their applications. That |
| helper class is used by the sample Batik applications. |
| </p> |
| </section> |
| |
| <section id="squiggle"> |
| <title>Squiggle security</title> |
| |
| <p> |
| The Squiggle browser lets the user decide whether or not scripts |
| should be run securely (see the “Browser Options” in the |
| preference dialog box). When scripts are run securely, Squiggle |
| will enforce the security settings as follows: |
| </p> |
| <ul> |
| <li> |
| The default policy is defined by the policy file found |
| in the distribution: <code>org/apache/batik/apps/svgbrowser/svgbrowser.policy</code>. |
| In the binary distribution, that file would be in the |
| <code>batik-squiggle.jar</code> file. In the source |
| distribution, that file would be in the |
| <code>resources</code> directory. The default policy |
| file gives appropriate permissions to the Batik code, |
| the XML parser and the Rhino scripting engine and very |
| limited permissions to scripts. |
| </li> |
| <li> |
| At startup time, and whenever the preference settings are |
| modified, Squiggle makes a copy of the default policy |
| and appends any additional permissions granted to |
| scripts by the user through the preference |
| settings. This policy file can be found in the |
| <code>[user.home]/.batik</code> directory, and is |
| called <code>__svgbrowser.policy</code>. Note that |
| this file is automatically generated and should not be |
| modified manually (as any edits would be lost). |
| </li> |
| <li> |
| The policy defined as described above is enforced |
| unless the <code>java.security.policy</code> system |
| property is defined. In that case, the policy defined |
| by the system property takes precedence and the policy |
| file generated from the Squiggle preferences is |
| ignored. |
| </li> |
| </ul> |
| |
| <p> |
| <strong>Important note:</strong> |
| The default policy files assume that the applications use the |
| Xerces parser and give appropriate permissions to its |
| <code>lib/xerces-2_5_0.jar</code> jar file. If you are using |
| a different XML parser, you need to modify the policy files to |
| grant the propser permissions to your XML parser instead of |
| Xerces. You will have to replace: |
| </p> |
| <source>grant codeBase "${app.dev.base}/lib/xerces_2_5_0.jar" { |
| permission java.security.AllPermission; |
| };</source> |
| <p>with:</p> |
| <source>grant codeBase "${app.dev.base}/lib/myXMLParser.jar" { |
| permission java.security.AllPermission; |
| };</source> |
| <p> |
| in the <code>resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.policy</code> |
| file (for the source distribution) and do the same in |
| <code>resources/org/apache/batik/apps/svgbrowser/resources/svgbrowser.bin.policy</code> (for |
| the binary distribution which will then need to be rebuilt with the <code>build dist-zip</code> |
| command. |
| </p> |
| <p> |
| Alternatively, you can write your own policy file and specify its |
| URL through the <code>java.security.policy</code> system property (which you can |
| specify through the <code>-Djava.security.policy=</code><em>url</em> command line |
| option). |
| </p> |
| </section> |
| </section> |
| |
| <section id="externalResources"> |
| <title>Controlling access to external resources</title> |
| |
| <p> |
| SVG makes a very powerful use of external resources in many elements |
| such as <code>image</code>, <code>use</code>, <code>font</code>, |
| <code>script</code> and <code>radialGradient</code>. There are over |
| fifteen SVG elements that may reference external resources that way. |
| </p> |
| <p> |
| In some environments, and typically for security reasons, it is |
| important to control the resources referenced by an SVG document |
| and be able to accept or reject these resources. |
| </p> |
| <p> |
| In the Batik toolkit, this flexibility is provided by the |
| <a class="class" href="../../javadoc/org/apache/batik/bridge/UserAgent.html">org.apache.batik.bridge.UserAgent</a> |
| interface which can define various strategies with regards to external |
| resources. By providing a new implementation of the |
| <code>UserAgent</code> interface, it is possible to apply the desired |
| security strategy for scripts and external resources. |
| </p> |
| <p> |
| The following <code>UserAgent</code> methods are provided for |
| that purpose: |
| </p> |
| <ul> |
| <li> |
| <code>getScriptSecurity(scriptType, scriptURL, docURL)</code> |
| should return the |
| <a class="class" href="../../javadoc/org/apache/batik/bridge/ScriptSecurity.html">ScriptSecurity</a> |
| strategy for a script of type <code>scriptType</code> (e.g., |
| <code>text/ecmascript</code>) coming from <code>scriptURL</code>, |
| when referenced from the document whose URL is <code>docURL</code>. |
| </li> |
| <li> |
| <code>getExternalResourceSecurity(resourceURL, docURL)</code> |
| should return the |
| <a class="class" href="../../javadoc/org/apache/batik/bridge/ExternalResourceSecurity.html">ExternalResourceSecurity</a> |
| strategry for a resource coming from <code>resourceURL</code> |
| referenced from the document at URL <code>docURL</code>. |
| </li> |
| </ul> |
| |
| <p> |
| The <code>ScriptSecurity</code> and <code>ExternalResourceSecurity</code> |
| interfaces have methods (<code>checkLoadScript</code> and |
| <code>checkLoadExternalResource</code> respectively) which should |
| throw a |
| <a class="class" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/SecurityException.html">SecurityException</a> |
| if accessing the script or resource is considered a security violation. |
| </p> |
| <note> |
| The <code>UserAgent</code> interface has two additional methods |
| (<code>checkLoadScript</code> and <code>checkLoadExternalResource</code> |
| which are meant to provide a short hand for getting a security strategy |
| object and calling the <code>checkLoad</code>* method on that object. |
| This is how the |
| <a class="class" href="../../javadoc/org/apache/batik/bridge/UserAgentAdapter.html">org.apache.batik.bridge.UserAgentAdapter</a> |
| class implements this method. |
| </note> |
| <p> |
| Batik provides the following set of <code>ScriptSecurity</code> |
| implementations: |
| </p> |
| |
| <dl> |
| <dt>NoLoadScriptSecurity</dt> |
| <dd> |
| <p>The script resource should not be loaded.</p> |
| </dd> |
| <dt>EmbededScriptSecurity</dt> |
| <dd> |
| <p> |
| The script resource will only be loaded if it is embeded in the SVG |
| document referencing it. This means that script attributes (such as |
| <code>onclick</code> on a <code>rect</code> element), |
| inline <code>script</code> elements and <code>script</code> elements |
| using a <code>data:</code> URL as its <code>xlink:href</code> attribute |
| value will be allowed. All other script resources should not be |
| loaded. |
| </p> |
| </dd> |
| <dt>DefaultScriptSecurity</dt> |
| <dd> |
| <p> |
| The script resource will only |
| be loaded if it is embeded in the SVG document (see the description |
| of <code>EmbededScriptSecurity</code>) or if it is coming from the same |
| location as the document referencing the script. If the document comes |
| from a network server, then any script coming from that server will |
| be allowed. If the document comes from the file system, then only |
| scripts under the same directory root as the SVG document will be allowed. |
| </p> |
| </dd> |
| <dt>RelaxedScriptSecurity</dt> |
| <dd> |
| <p> |
| Scripts from any location can be loaded. |
| </p> |
| </dd> |
| </dl> |
| |
| <p> |
| In addition, Batik provides the following set of |
| <code>ExternalResourceSecurity</code> implementations: |
| </p> |
| |
| <dl> |
| <dt>NoLoadExternalResourceSecurity</dt> |
| <dd> |
| <p>No external references are allowed.</p> |
| </dd> |
| <dt>EmbededExternalResourceSecurity</dt> |
| <dd> |
| <p> |
| Only resources embeded into the file are allowed (i.e., references |
| through the <code>data:</code> protocol). |
| </p> |
| </dd> |
| <dt>DefaultExternalResourceSecurity</dt> |
| <dd> |
| <p> |
| Embeded external resources (see above) and resources coming from |
| the same location as the document referencing them are allowed. |
| </p> |
| </dd> |
| <dt>RelaxedExternalResourceSecurity</dt> |
| <dd> |
| <p>Resources from any location can be loaded.</p> |
| </dd> |
| </dl> |
| |
| </section> |
| |
| </body> |
| </document> |