Я пытаюсь подготовить 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'><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'>"/></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.
Есть ли способ отключить это поведение по умолчанию для объекта-преобразователя.
Заранее спасибо, Рахул