Настройка безопасной обработки в TransformerFactory приводит к проблемам в XSL

Я создаю документ PDF с файлом XML в качестве входных данных, используя Apache FOP 2.4. Чтобы предотвратить XXE-атаки, мне нужно установить функцию безопасной обработки (FEATURE_SECURE_PROCESSING) в TransformerFactory:

InputStream xslTransformer = getClass().getClassLoader().getResourceAsStream("foo.xsl");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setFeature(FEATURE_SECURE_PROCESSING, true);
Transformer transformer = transformerFactory.newTransformer(new StreamSource(xslTransformer));
transformer.transform(new DOMSource(), new SAXResult(fop.getDefaultHandler()));

После настройки этой функции я не могу создать PDF-документ и получаю предупреждения:

SystemId Unknown; Line #49; Column #99; "master-name" attribute is not allowed on the fo:simple-page-master element!
SystemId Unknown; Line #49; Column #99; "initial-page-number" attribute is not allowed on the fo:simple-page-master element!
SystemId Unknown; Line #49; Column #99; "page-height" attribute is not allowed on the fo:simple-page-master element!
SystemId Unknown; Line #49; Column #99; "page-width" attribute is not allowed on the fo:simple-page-master element!
etc ...

Вот часть файла XSL (foo.xsl):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf">

    <xsl:template match="/">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4-portrait" initial-page-number="1"
                                       page-height="29.7cm" page-width="21.0cm" margin-top="0cm"
                                       margin-left="1cm" margin-right="1.3cm" margin-bottom="0cm">
                    <fo:region-body margin-top="2.2cm" margin-bottom="1.2cm" margin-left="1.3cm"/>
                    <fo:region-before region-name="xsl-region-before" extent="2.2cm"/>
                    <fo:region-after region-name="xsl-region-after" extent="1.2cm"/>
                    <fo:region-start region-name="xsl-region-start" extent="1.3cm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <fo:page-sequence master-reference="A4-portrait" font-family="Consolas" font-size="11">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block linefeed-treatment="preserve" font-weight="bold">
                        foo
                    </fo:block>

                    <fo:block linefeed-treatment="preserve">
                        bar
                    </fo:block>

                </fo:flow>
            </fo:page-sequence>

        </fo:root>
    </xsl:template>

</xsl:stylesheet>

Как мне использовать эту функцию и заставить ее работать? Ява версии 8.


person greggor    schedule 25.11.2019    source источник
comment
Это все ошибки ФОП. Но вы не предоставили входные файлы для создания этого файла FOP, и поэтому на ваш вопрос в текущем состоянии нет ответа. Предоставьте входные файлы (XML + XSLT или хотя бы выходной файл XML-FO).   -  person zx485    schedule 25.11.2019
comment
Я отредактировал свой пост и предоставил входной файл XSL. Я думаю, что файл XML на самом деле не нужен. Если я ошибаюсь, я тоже могу предоставить.   -  person greggor    schedule 25.11.2019
comment
Я проверил ваш код с определением fo:simple-page- master и, кроме initial-page-number="1", все соответствует стандарту. Итак, я думаю, что без соответствующей части XML я не могу воспроизвести ошибку.   -  person zx485    schedule 25.11.2019
comment
Входными файлами XML могут быть следующие счета: github.com/itplr-kosit/ xrechnung-testsuite/tree/master/ (или вы имеете в виду XML FOP-Config?) Я думаю, что моя проблема заключается в TransformerFactory, который я использую. Когда я меняю класс реализации, предупреждения исчезают. Знаете ли вы, какие классы реализации поддерживают эту функцию?   -  person greggor    schedule 25.11.2019
comment
Я попытался воспроизвести вашу ошибку с первым файлом XML из вашей ссылки. Затем я применил XSLT и после этого Apache FOP. Результатом является файл PDF, содержащий две строки: foo и bar. Кажется, что цепочка работает, но результат, похоже, нуждается в некотором улучшении. Однако я не могу воспроизвести ошибки.   -  person zx485    schedule 25.11.2019
comment
Скажите, пожалуйста, какой класс реализации TransformerFactory вы использовали? Цепочка работает и для меня, пока я не устанавливаю функцию безопасной обработки. Спасибо за помощь в любом случае.   -  person greggor    schedule 26.11.2019
comment
На самом деле, я вообще не использовал TransformerFactory. Я просто поместил XML и XSLT в процессор XSLT и передал результат в Apache FOP, чтобы преобразовать его в файл PDF. Затем я просмотрел PDF-файл с помощью стандартной программы просмотра PDF-файлов Ubuntu 18.04: okular. Итак, я использовал другой подход, который работает так, как хотелось бы, и указал, что ваш XML + XSLT, похоже, в порядке. Проблема должна быть где-то в другом.   -  person zx485    schedule 26.11.2019


Ответы (1)


Это связано с ксалан-2.7.2.

Вот ошибка в Xalan-J

Переход на xalan-2.7.1 или более раннюю версию решит вашу проблему.

Возможно, вам придется принудительно исключить xalan из зависимости Apache-FO.

Вы также можете перезаписать версию 2.7.2_3, которая устраняет эту проблему.

<dependency>
    <groupId>org.apache.servicemix.bundles</groupId>
    <artifactId>org.apache.servicemix.bundles.xalan</artifactId>
    <version>2.7.2_3</version><!--$NO-MVN-MAN-VER$-->
</dependency>

Использование <!--$NO-MVN-MAN-VER$--> предотвращает переопределение.

person JoshDM    schedule 01.04.2021