2008-09-19 34 views
11

Bu istisna biberimiz, üretimimizdeki catalina, basit bir 'getParameter()' çağrısı yapar.java.io.CharConversionException neden Tomcat'ta EOF veya isHexDigit iletilerine neden olur?

 
WARNING: Parameters: Character decoding failed. Parameter skipped. 

java.io.CharConversionException: EOF 
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:82) 
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48) 
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411) 
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393) 
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509) 
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266) 
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2361) 
    at org.apache.catalina.connector.Request.getParameter(Request.java:1005) 
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353) 
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158) 

Veya Bazen:

 
java.io.CharConversionException: isHexDigit 
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:87) 
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48) 
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411) 
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393) 
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509) 
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266) 
    at org.apache.catalina.connector.Request.parseParameters(Request.java:2361) 
    at org.apache.catalina.connector.Request.getParameter(Request.java:1005) 
    at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353) 
    at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158) 

cevap

5

Sadece burada hipotez. Parametrelerin URL kodu çözme işlemi veya değerlerinin başarısız olması gibi görünüyor (URL veya kodlama, XX veya XXXX'in ISO-8859-1 veya Unicode'daki karakterin onaltılık kodunda olduğu% XX veya% XXXX notasyonu kullanılarak bazı karakterleri kodlama anlamına gelir). İlk durumda,% karakterinden sonra yeteri kadar onaltılık karakter olmadığından hata meydana gelebilir. İkinci durumda bu olabilirdi çünkü% karakterinden sonraki bir karakter onaltılık değildir.

+1

'da kapsanmıştır. Teşekkürler, test ortamımızda tam olarak bu durum doğrulandı. Bu, genel isteği etkilemeyeceği (diğer parametreler normal olarak ayrıştırılır ve istek her zamanki gibi işlenir) de dikkate alınmaya değerdir. – Peter

+2

Hm ... Tomcat'ın günlük dosyalarına bir DoS saldırısı gerçekleştirmenin iyi bir yolu gibi görünüyor ... – Alexander

2

Araştırılması gereken başka bir şey, Tomcat "Connector" configuration.'unuzdaki URIEncoding'tir. Bağlantı, UTF-8 kodlu bir sayfada bulunuyorsa, URL'yi UTF-8 ile bayt olarak kodlar, sonra URL, gereken baytlardan herhangi birini kodlar. Ancak, varsayılan olarak, Tomcat bu baytların ISO-8859-1 olduğunu düşünmektedir, bu da sorunlara yol açabilir.

Ters de doğru olabilir: sayfa ISO-8859-1 ise ve Tomcat'ın URIEncoding UTF-8 olarak ayarlanmışsa, benzer bir hata ortaya çıkabilir. Charset Pitfalls in JSP/Servlet Containers

1

Ayrıca bu (Wikipedia'dan) olabilir: Burada

bu alanda sorunlar hakkında yararlı bir tartışma var% uXXXX, xxxx: Unicode karakterleri için standart dışı bir kodlama söz konusudur

dört onaltılık basamak olarak temsil edilen bir Unicode değeridir. Bu davranış herhangi bir RFC tarafından belirtilmemiş ve W3C tarafından reddedilmiştir. ECMA-262'nin üçüncü baskısı hala bu sözdizimini kullanan bir kaçış (dize) işlevi içerir, fakat aynı zamanda UTF-8'e dönüştüren ve her sekizliyi yüzde kodlayan bir encodeURI (uri) işlevi de içerir.

Dolayısıyla, Javascript'teki eski çıkış işlevini kullanıyor olabilirsiniz, ancak Tomcat'in daha sonraki sürümleri bu tür şeyler hakkında daha sıkı olduğundan (5.5.17 bu kodlama slaydının izin vermesi), yalnızca şimdi artık istisnalar görmeye başlıyorsunuz.

2

Kullanıcılar ajax isteği üzerinden '%' gönderdiğinde bu hatayı almaya başladım. İsteğin yapılmasından önce parametrelerden kaçmadığım ortaya çıktı. Bu senaryonun tam bir kopyası ve düzeltmesi bu blog post

İlgili konular