2016-07-21 17 views
6

Mam złożoną sytuację, że próbuję radzić sobie z udziałem kodowania znaków.kodowanie znaków oszczędzania, perl do java

Mam program perla, który komunikuje się z punktem końcowym java za pośrednictwem oszczędności, java jest następnie przy użyciu danych do żądania do starszych usług php. Jest brzydka, ale jest częścią planu migracji, więc musi działać przez krótki czas.

W języku Perl tworzony jest obiekt oszczędnościowy, w którym niektóre pola obiektu oszczędzania są kodowane przez json.

Problemem jest to, że gdy Perl umożliwia żądanie Java, jeden ze strumieni jest następujący (to jest z danych: samowyładowczego i jest następnie json kodowane i dodaje się do oszczędzania)

'offer_message' => "<&lt;>&gt; 
&&amp; 
\x{c3}\x{82}\x{c2}\x{a9}&copy; 
<script>alert(\"XSS\");</script> 
https://url.com/imghp?hl=uk", 

Jednak gdy dane są odbierane na stronie Java sekwencję \ x {c3} \ x {82} \ x {C2} \ x {A9} zostały zamienione tak, Jawa otrzymujemy następujące:

<&lt;>&gt;\\n&&amp;\\n���©&copy;\\n<script>alert(\"XSS\");</script>\\nhttps://www.google.com.ua/imghp?hl=uk 

problem polega na tym, że jeśli przekażę drugi ciąg do starszego programu php, to zawiedzie, jeśli przekażę ciąg pobrany z zrzutu p erl hash, to się udaje. Zakładam więc, że muszę przekonwertować otrzymany ciąg na inne kodowanie (popraw mnie, jeśli się mylę, nie jestem pewien, czy to jest właściwe rozwiązanie).

Próbowałem pobierać parametry odebrane w java i konwertować je do każdego kodowania, jakie tylko potrafię wymyślić, jednak nie działa. Na przykład:

byte[] utf8 = templateParams.getBytes("UTF8"); 
normallisedTemplateParams = new String(utf8, "UTF8"); 

Zmieniłem schematy kodowania w nadziei, że znajdę coś, co działa.

Jaki jest właściwy sposób rozwiązania tego problemu? Przez krótki czas to niechlujne rozwiązanie jest moją jedyną opcją, podczas gdy inne przeprojektowanie się dzieje.

+0

Tak, przepraszam, to dla mnie całkiem nowe. Pierwszy ciąg jest zrzutem danych dla skrótu perl i jest konwertowany na json, a następnie dodawany do oszczędzonego obiektu i przekazywany do java, drugi łańcuch jest tym, co otrzymuję po stronie java. – mark

+0

Myślę, że problem polega na tym, że łańcuch jest kodowany przy użyciu UTF-8, a nie powinien. 'utf8 :: decode ($ h {offer_message});' może pomóc. (Byłoby jeszcze lepiej, gdybyś zdekodował u źródła.) – ikegami

+0

Myślałem, że być może problem dotyczy serializacji oszczędzania, ale mogę zmienić kodowanie na stronie perl, którą wierzę. Czy masz pomysł na lepsze kodowanie do użycia? – mark

Odpowiedz

1

Problem na końcu trudny do zdiagnozowania, ale prosty do rozwiązania. Okazało się, że pakiet, którego używałem do konwertowania w Javie, używał domyślnego kodowania UTF-16 w java. Musiałem zmodyfikować pakiet i zmusić go do używania UTF-8. Potem wszystko działało.