jueves, 27 de junio de 2019

Cómo ofuscar atributos de un XML con namespace usando XSLT

Cómo ofuscar atributos de un XML con namespace usando XSLT


Hola.

Estoy intentando ocultar los valores de algunos atributos XML usando XSLT.

Para quien no ha usado este método, es muy útil para cuando necesitas ocultar cierta información sensitiva en tus aplicaciones. Generalmente en los logs que generan las aplicaciones. Estos datos pueden ser datos personales como: nombre, teléfono, email, tarjeta de crédito, etc.

El problema que tengo es que los elementos que quiero ofuscar tienen como prefijo un namespace. No tuve ningún problema para ofuscar cuando los elementos no tienen namespace.

Después de investigar un poco, la solución pareciera bastante obvia. Se tiene que definir el mismo namespace que usa el XML en el archivo XSLT.

En mi caso el namespace es xmlns:ns1="http://www.sample.com/CustomerOrder/2.0"

Abajo les dejo mi XML y mi XSLT

Mi XML se ve así:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Envelope xmlns:ns0="http://www.sample.com/icc/wrapper/1.0">
    <ns0:Header>       
    </ns0:Header>
    <ns0:Body>
        <Payload>
            <ns1:CustomerOrder xmlns:ns1="http://www.sample.com/CustomerOrder/2.0">
                <ns1:CustomerOrderAddresses>
                    <ns1:CustomerOrderAddress AddressLine1="aaaaaaaaaa" City="dddddd" Country="eee" EmailAddress="nada@nada.com" FirstName="nombre" LastName="apellido" />
                     </ns1:CustomerOrderAddresses>
            </ns1:CustomerOrder>
        </Payload>
    </ns0:Body>
</ns0:Envelope>


Como pueden ver abajo en negritas, mi XSLT tiene definido el namespace ns1 que está definido en el XML de arriba también en negritas.

En mi elemento template defino el parent de los atributos usando como prefijo el namespace parent::ns1:CustomerOrderAddress

Mi XSLT se ve así.

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://www.sample.com/CustomerOrder/2.0">

<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
</xsl:template>

<xsl:template match="@AddressLine1[parent::ns1:CustomerOrderAddress]">
<xsl:attribute name="AddressLine1">
<xsl:if test="string-length(.)>'0'">
<xsl:value-of select="concat(substring(., 1 ,string-length(.)-16),'XXXXXXXXXXXXXXXX')"/>
</xsl:if>
<xsl:if test="string-length(.)&lt;'1' "></xsl:if>
</xsl:attribute>
</xsl:template>
<xsl:template match="@EmailAddress[parent::ns1:CustomerOrderAddress]">
<xsl:attribute name="EmailAddress">
<xsl:if test="string-length(.)>'0'">
<xsl:value-of select="concat(substring(., 1 ,string-length(.)-16),'XXXXXXXXXXXXXXXX')"/>
</xsl:if>
<xsl:if test="string-length(.)&lt;'1' "></xsl:if>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>


El resultado se ve así:


<ns0:Envelope xmlns:ns0="http://www.sample.com/icc/wrapper/1.0">
    <ns0:Header>       
    </ns0:Header>
    <ns0:Body>
        <Payload>
            <ns1:CustomerOrder xmlns:ns1="http://www.sample.com/CustomerOrder/2.0">
                <ns1:CustomerOrderAddresses>
                    <ns1:CustomerOrderAddress AddressLine1="XXXXXXXXXXXXXXXX"
                                         City="dddddd"
                                         Country="eee"
                                         EmailAddress="XXXXXXXXXXXXXXXX"
                                         FirstName="nombre"
                                         LastName="apellido"/>
                     </ns1:CustomerOrderAddresses>
            </ns1:CustomerOrder>
        </Payload>
    </ns0:Body>
</ns0:Envelope>


Pueden probar esto en la siguiente página: https://www.freeformatter.com/xsl-transformer.html



Espero les sirva.








No hay comentarios.:

Publicar un comentario