Saya ingin kemampuan untuk menyediakan utilitas pelarian yang dapat digunakan dalam XSL Stylesheet. Sebagai contoh:

<xsl:stylesheet version="2.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns:xs="http://www.w3.org/2001/XMLSchema" 
   xmlns:xalan="http://xml.apache.org/xalan" 
   xmlns:escape="xalan://com.example.myservice.MyEscapeTool">

Namun, dalam hal Java, pemahaman saya adalah bahwa kurangnya pengaturan berikut pada TransformerFactory Anda dapat menjadi tidak aman:

factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

Jadi saya melakukan itu, tetapi dapat dimengerti ini memblokir kemampuan Anda untuk menggunakan "panggilan fungsi eksternal" dengan kesalahan runtime berikut:

FATAL: XPath syntax error at char 12 in {escape:new()}:
    Cannot find a matching 0-argument function named 
{java:com.example.myservice.MyEscapeTool}new(). Note: external 
function calls have been disabled;

Menghapus tanda FEATURE_SECURE_PROCESSING yang disebutkan di atas akan memperbaiki masalah.

Bagaimana saya bisa menyertakan fungsi utilitas yang dapat dipanggil di XSLT, tanpa menyebabkan hilangnya keamanan dengan kemampuan untuk mengekspos APAPUN kelas Java arbitrer?

1
jbeale 12 Desember 2017, 23:53

1 menjawab

Jawaban Terbaik

Seperti yang ditunjukkan @MartinHonnen dalam komentarnya, jika Anda beralih menggunakan Saxon, maka Anda dapat membatasi stylesheet untuk hanya menggunakan "fungsi ekstensi terintegrasi" yang terdaftar dengan prosesor XSLT sebelum dieksekusi, tanpa mengizinkan stylesheet untuk memanggil kelas/ metode yang kebetulan berada di classpath.

1
Michael Kay 12 Desember 2017, 22:50