Как подавить декодирование закодированного значения текстового поля html с помощью преобразователя javax. xml .transform.Transformer - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь подготовить html с использованием javax. xml .transform.Transformer из xslt.

Для этого у меня есть код ниже ---

private static TransformerFactory factory;
    static {
        factory = TransformerFactory.newInstance();
    }
    private static synchronized String process(Source xmlSource, Source xslSheet, HashMap<?, ?> params, String systemId)  {
            if ( systemId != null ){
                xslSheet.setSystemId(systemId);
            }
            ByteArrayOutputStream buf = new ByteArrayOutputStream();
            StreamResult xmlResult = new StreamResult(buf);
            Transformer tfm;
            try {
                tfm = factory.newTransformer(xslSheet);
            } catch (TransformerConfigurationException e) {
                throw new IllegalStateException(e);
            }

            String result = ConversionUtils.toString(buf.toByteArray());
            IOUtils.close(buf);

            return result;
        }

Я использую xsl для определения HTML объекта-преобразователя. Ниже приведено определение xsl текстового поля (для которого я столкнулся с проблемой [кодировка удаляется для своего значения]) -

<xsl:text disable-output-escaping='yes'>&lt;input type="text" name="search" placeholder="Keyword search ..." size="40" value="</xsl:text>
                <xsl:value-of select="$search" disable-output-escaping='no'/>
<xsl:text disable-output-escaping='yes'>"/&gt;</xsl:text>

В приведенном выше коде значение текстового поля заполняется со 2-го линия. В этой строке я имею в виду переменную $ search java, имеющую закодированное значение.

Моя проблема в том, что объект Transformer декодирует это закодированное текстовое содержимое при подготовке html. Я не хочу этого поведения по умолчанию.

Из-за этого поведения по умолчанию final html имеет неэкранированное значение для этого текстового поля. Из-за этого общая страница html становится уязвимой для XSS-атаки.

Например, если у меня есть значение ниже для текстового поля -

1234"onmouseover="[window['location']='\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3a\x61\x6c\x65\x72\x74\x2820\x29']"

После кодирования это значение станет -

1234\x22onmouseover=\x22[window[\x27location\x27]=\x27\\x6a\\x61\\x76\\x61\\x73\\x63\\x72\\x69\\x70\\x74\\x3a\\x61\\x6c\\x65\\x72\\x74\\x2820\\x29\x27]\x22

Вышеупомянутое значение будет заполнено как содержимое текстового поля, если мы напрямую поместим его напротив значения текстового поля. Но объект-преобразователь снова декодирует это закодированное значение при подготовке html.

Есть ли способ отключить это поведение по умолчанию для объекта-преобразователя.

Заранее спасибо, Рахул

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...