Soru JSTL işlevinde çift tırnak kaçmak için nasıl?


Değiştirmem gerek " için \" ile JSTL yerine giriş etiketindeki dizeyi kullanmak gibi işlev:

<input type="hidden" name="text" size="40" value="${text}">

Eğer ${text} var "HTML bozulacak.

Bende denedim

<input type="hidden" name="text" size="40" value="${fn:replace(text, "\"", "\\\""}">

ve

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"'}">

ama işe yaramadı. Sayfa gibi hatalar yapar

org.apache.el.parser.ParseException: Satırda ""} ""} "" ile karşılaşıldı   1, sütun 32. Aşağıdakilerden birini bekliyordum:       "" ...       ")" ...       "[" ... ...       "," ...       ">" ...       "gt" ...       "<... ...       "lt" ...       "> =" ...       "ge" ...       "<=" ...       "le" ...       "==" ...       "eq" ...       "! =" ...       "ne" ...       "&&" ...       "ve" ...       "||" ...       "veya" ...       "*" ...       "+" ...       "-" ...       "/" ...       "div" ...       "%" ...       "mod" ...

Bunu nasıl yapabilirim?

Güncelleştirme

Değiştir işlevinin yakın bir parasını özledim. Doğru olan bu bir yakın paren ile oldu:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '\"')}">

Update2

Metinleri gönderirken, kullanarak öğrendim \ bu sebepten dolayı iyi bir fikir değil HTML giriş etiketinde neden \ "kullanamazsınız?. Kod şöyle olmalı:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '"', '&quot;')}">

17
2017-08-18 01:31


Menşei




Cevaplar:


İşe yaramaz çünkü \ Java dizgisinde bir çıkış karakteri. Kelimeyi tam anlamıyla temsil etmek için, başka biriyle birlikte kaçmanız gerekir. \ tekrar. Ayrıca " EL'de özel bir karakterdir, aynı zamanda onu tam anlamıyla temsil etmek için sizden kaçmanız gerekir. Yani doğru sözdizimi şöyle olurdu:

<input type="hidden" name="text" size="40" value="${fn:replace(text, '\"', '\\\"'}">

Ama yapmalısın aslında kullanmak fn:escapeXml() XSS önlemek için. Sadece alıntılardan değil, diğer karakterlerden de kaçar.

<input type="hidden" name="text" size="40" value="${fn:escapeXml(text)}">

Ayrıca bakınız:


21
2017-08-18 18:03



Reddetme veya küçültme niyetinde olan herkes için, sorunun HTML için kaçmadığını, JavaScript için kaçmadığını lütfen unutmayın :) - BalusC
JavaScript'ten kaçmak için, değiştirmeyi kullanan ilk yöntem uygun yoldur, değil mi? - IcedDante
fn: escapeXml, XML'den çıkmak istediğinizde uygundur. Ya sadece dizelerden kaçmak istersen? - mcv
@mcv: "kaçış dizeleri" hiçbir anlam ifade etmiyor. "XML kaçış", "HTML kaçış", "Java kaçış", "JavaScript kaçış" vb. Var. "JavaScript'ten kaçış" demek değil misiniz? Bu, birçok JSP yolcusunun düştüğü yerdir. - BalusC
@BalusC Bir dizede kaçan alıntıları kastediyordum. Haklısın, nasıl yapılacağı, dile bağlı ve benim durumumda aslında Javascript. Ne fn: replace ne de fn: escapeXml benim için çalıştı, ancak Apache StringEscapeUtils.escapeEcamScript () öğesini kapsülleyen yeni bir escapeEcmaScript işlevi hile yapar. - mcv


Yazım hatası olabilir: Orada bir kapanış paren göremiyorum. Bunu dene:

${fn:replace(news.title, "\"", "\\\"")}

Ayrıca, sonuçları OUTPUT etmeye çalışıyorsunuz yoksa güncellemeye mi çalışıyorsunuz? news.title böylece bir dahaki sefere erişirsin news.title Değiştirme yerinde mi? Bu, sonucu vermek için çalışır, ancak gerçek değeri değiştirmez: news.title bu çağrı ile değiştirilmeyecek.


4
2017-08-18 01:53



Haklısın, kapanış parisi kaçırıldı. Çok aptaldım. Asıl değeri değiştirmem gerekmiyor. Bir sorum daha var. Bir giriş etiketinde nasıl çalıştırabilirim? - Sanghyun Lee
Bu ${fn:replace(news.title, '\"', '\\\"')} çalıştı. Teşekkürler. - Sanghyun Lee


Yanlış yapıyorsun fn: yerine).

Doğru yol:

<input type="hidden" name="text" size="40" value="<c:out value='${text}'/>">
(actually tested code - works 100%)

Düzenle: Daha fazla düşünce üzerine:

  • kullanarak yolu fn: escapeXML (BalusC tarafından yazıldığı gibi) çok çalışıyor ve daha güzel görünüyor (yuvalanmış etiketler yok)
  • kullanma fn: yerine taklit etmek fn: escapeXML bela istiyor. Sen irade Kaçması gereken bazı karakterleri dahil etmeyi unutmayın. Sadece mevcut, denenmiş ve test edilmiş kullanın fn: escapeXML (veya c: üzerinden)

4
2018-01-29 17:51