2016-07-21 18 views
6

Tôi có một tình huống phức tạp mà tôi đang cố gắng giải quyết liên quan đến việc mã hóa ký tự.mã hóa ký tự tiết kiệm, perl để java

Tôi có một chương trình perl đang giao tiếp với điểm cuối java thông qua tiết kiệm, java sau đó sử dụng dữ liệu để đưa ra yêu cầu cho dịch vụ php cũ. Thật xấu xí, nhưng một phần của kế hoạch di trú lại cần phải hoạt động trong một thời gian ngắn.

Trong perl, đối tượng tiết kiệm được tạo ra trong đó một số trường của đối tượng tiết kiệm là các chuỗi được mã hóa json.

Vấn đề là khi perl làm cho các yêu cầu java, một trong những chuỗi như sau (đây là từ dữ liệu: dumper và sau đó json mã hóa và bổ sung vào tiết kiệm):

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

Tuy nhiên, khi dữ liệu này được nhận ở phía bên java chuỗi \ x {c3} \ x {82} \ x {c2} \ x {A9} đã được chuyển đổi như vậy trong java chúng tôi nhận được những điều sau:

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

các vấn đề là nếu tôi vượt qua chuỗi thứ hai để các chương trình php di sản, nó không thành công, nếu tôi vượt qua chuỗi lấy từ bãi chứa của p erl hash, nó thành công. Vì vậy, giả định của tôi là tôi cần phải chuyển đổi chuỗi nhận được để mã hóa khác (đúng tôi nếu tôi sai, tôi không chắc chắn rằng đây là giải pháp đúng).

Tôi đã thử lấy các tham số nhận được trong java và chuyển đổi chúng thành mọi mã hóa mà tôi có thể nghĩ đến, tuy nhiên nó không hoạt động. Vì vậy, ví dụ:

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

Tôi đã thay đổi các lược đồ mã hóa với hy vọng tôi tìm được thứ gì đó hoạt động.

Cách chính xác để giải quyết vấn đề này là gì? Trong một thời gian ngắn, giải pháp lộn xộn này là lựa chọn duy nhất của tôi trong khi các kỹ thuật tái diễn khác đang diễn ra.

+0

vâng xin lỗi, điều này khá mới đối với tôi. Chuỗi đầu tiên là một kết xuất dữ liệu của băm perl và được chuyển đổi thành json rồi thêm vào một đối tượng tiết kiệm và chuyển tới java, chuỗi thứ hai là những gì tôi nhận được ở phía bên java. – mark

+0

Tôi nghĩ rằng vấn đề là chuỗi được mã hóa bằng cách sử dụng UTF-8, và nó không nên. 'utf8 :: decode ($ h {offer_message});' có thể trợ giúp. (Nó sẽ tốt hơn nếu bạn giải mã tại nguồn.) – ikegami

+0

Tôi nghĩ có lẽ vấn đề là với việc serialization tiết kiệm nhưng tôi có thể thay đổi mã hóa ở phía bên perl mà tôi tin. Bạn có ý tưởng sử dụng mã hóa tốt hơn không? – mark

Trả lời

1

Vấn đề cuối cùng khó chẩn đoán nhưng dễ giải quyết. Nó bật ra rằng các gói tôi đã sử dụng để chuyển đổi trong Java đã sử dụng mã hóa mặc định của java UTF-16. Tôi đã phải sửa đổi gói và buộc nó sử dụng UTF-8. Sau đó, mọi thứ đều hiệu quả.

Các vấn đề liên quan