dromara / hutool

🍬A set of tools that keep Java sweet.
https://hutool.cn
Other
29.1k stars 7.51k forks source link

HttpRequest 模拟binary二进制文件上传,异常组装url #3314

Closed xk-ai closed 1 year ago

xk-ai commented 1 year ago

版本情况

JDK版本: openjdk 1.8.0_25 hutool版本: 5.8.16

问题描述(包括截图)

当前端传入二进制文件的时候,出现url解析错误,将二进制文件内容作为url的parameter传参,导致请求被污染,模拟的接口不必要真实,任意接口

  1. 复现代码
  HttpRequest httpRequest = HttpRequest.of(UrlBuilder.ofHttpWithoutEncode(url.toString()));
      httpRequest.setMethod(Method.valueOf(interfaceInfo.getRequestType()));
  if (RequestBodyTypeEnum.BINARY.getType().equals(interfaceInfo.getRequestBodyType())) {
            if (interfaceInfo.getFile() != null) {
                MultipartFile file = interfaceInfo.getFile();
                //binary格式 设置contentType
                try {
                    httpRequest.body(file.getBytes());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                httpRequest.header(Header.CONTENT_TYPE,"application/octet-stream");
            }

interfaceInfo中的file字段类型为 private MultipartFile file;

  1. 堆栈信息 cn.hutool.core.exceptions.UtilException: URISyntaxException: Malformed escape pair at index 141043: http://xxxx:xxx/test/getList?%5B0-9a-zA-Z-._%5C%5C%5B%5C%5C%5D:%5D+$%22,%0A%09%09%09%09%09%22type%22:%20%22string%22%0A%09%09%09%09%7D,。....

4.关键参数 debug模式观察下的HttpRequest最终 参数详情信息 Request Url: http://xxxx:xx/test/getList Request Headers: Accept: text/html,application/json,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 Hutool Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8 Content-Type: application/octet-stream Request Body: PK  �}W  [Content_Types].xml�S�n�0����6�PU�C���{�X�%����]8�R� q�cfgfW�d�q�ZCB|��|�h㻆},^�{Va�^K<4�6�N�XQ�dž�9�!P��$��҆�d�c�D�j);��ѝP�g��E�M'O�ʕ����H7L�h���R���G��^�'�{��zސʮB��3� ˙��h.�h�W�жF�j娄CQՠ똈���}ιL�U:D�����%އ����,�B���[� �� ;˱� �{N��~��X�p�ykOL��kN�V��ܿBZ~����q�� �ar��{O�PKz��q;  PK  �}W rels/.rels���j�0 ����8�`�Q��2�m��4[ILb��ږ���.[K �($}��v?�I�Q.���uӂ�h���x>=��@��p�H"�~�}� �n����"�H�׺؁�����8�Z�^'�#��7m{��O�3���G�u�ܓ�'��y|a�����D� ��lEYȾ� ���vql3�ML�eh������\3�Y0���oJ׏� :��^��}PK��z�� I PK  �}W  docProps/app.xmlM�� �0D��ro�z�4� �'{����MHV�盓z���T��E�1e�����Ɇ�ѳ����:�No7jH!bb�Y��V��������T�)$o���0M��9ؗGb�7�pe��~�R�>��Y�EB���nW������ PK6n�!� � PK  �}W  docProps/core.xmlm��J�0�%�=i;u��C���8p2�.$Ƕ�&!�v��i�Ի$�w>N�rsz��wFW4K%��Q�n���&kJ|Z��h��6tS��ri�B��D��\ڊ�!X�e���i$t _�D�W׀�U49c�0J�0�����J.J���Y�$���!K3�a���;0' y��B�㘎��ō2x��}��O:=}]"�˓�K�"�"Q�Ç��|'���z��u��"a�$��삯�8[=��k~~���/c!-�����-�%����PK7��B � PK  �}W  xl/sharedStrings.xml=�A �0 �{��D�i�/��tm�&f7�����0Ì�7mꃕc& ���B�y��Zx>� ��~72��X�I��nx�s�["�5���� R7�\���u�*����M��9��"��~PKh���y � PK  �}W
xl/styles.xml�V�n�0��?�7��v!)h��9)�+-QQ.IR��CR�ǂ�4��8�y�8����Qm�� �^L0�2S9�e�߮�,�U��Sll��ME�E!M�+k�oQd�� b.TM%�J b����Ԛ�ܸ ���d��a��܊��ej+m�'8J�B���������Ҝ6�e�+���iC�/�OA�p�����x�3��J;�`Ri�B��x�kF���/B�M�Z��� ���s����k��C�8|c��q�x����5��j����۶� �Jv��#��?5iO����
�k��=�Nܩ�Fq�����9�X� � ,�F�vx�@+ܻҘ��B�fe�Z�j�)k� #g�T�p����[��� �[��4ԓ���G`p �Ӝ�u��?BBX��������{����X=�y �;� 8,2�����S<�S j n�����;�{��� 4�����ŋhQS<��EO�G#R׼]+'��i o�R -��f�0��� Tc�H�,���5Ÿ�و�很~��q~]��P������s ӹ�^B/�-t��z��]��(O�PK�<W8 � PK  �}W  xl/workbook.xml���N�0Ew$��z;�A� B��P�]���ۑmZ�� ��| S�����N� #���=:��GӐ5����M��)m���7'�0-�����s+�x8�1�9�A�hD��mj獈)�% �G�B�MCO��Fh C���pU�%^;��ƃ�c#bZj�(��z�D�슝s�DhY�ͽ�M��H��z�s���z�����%V��������{yڿ~�w@|�?Sg@v�b6�F���PK��e� j PK  �}W  xl/_rels/workbook.xml.rels��Mk�0 @���}q���n/c���� c+qh"K�迟���@;�$��{��~Γy�"#���i� �# ^�O7�D=E?1�b�n��8y�?$�YLE�8H���Z g/ g����^� 6�p��U���r΀%�좃����/�I�`|�Rˤ��:f����~ ���mF� v�����:���ׯ�������p9HB�SyݵK~����� PK�;�� 3 PK  �}W  xl/worksheets/sheet1.xml��oo�F��W�w��~1 d�%P�IՒm/+�ld�{���T%J�$ڬ]����E���I,�/���-v��th�����I�~�=w���)^������M�$�K)Q F��t�U�ب|X��?�V�֖�&� 0�ئ���$ٍ6����#�KӴ�e]�%�=��Z u;R:��I]U7�rQӻ��G,�,�ˢT.�R'�m�w�4��� �$�����N:�A �S�O|Z�^ R�i i����Ԉ�jS6M�͓A �c?����^�����@�h��rKy��WD�ѷ���*�|1�%���47��� 7���,7�D��M�"2�M�#2�M"��M.G�27)�.TH%e�P�@�5���kE���k7�]����P7:�A֩�6��HZvNF�����s}U�(����^IBχC� D�����'�x�� �������y���ǘ�0q�q�',��Oׁ ����νc��S����� ������������!@W��h2�n�g��gw��+�0>�?�]�8�V���|�=l�j�}���v�����dL�{Q ��fYU�T5 ��-�����?�wAUq�'j7!!q)ȝZ���ℭښ�An�e� �27u2�;�:�hQ&�Etg����`��7yn>�%<�,���mg���p��y�<>�Mw~c:}{��OrZNC�����)P;q{�w�ԕB�P��4�� ���nQbS�D�M�Y�Db��lR����t�/Bo q2 '���)�,���D'Tۆ�!�!��<ĢCJR�t+ݲ�������Ɖ�S�H8��MT�j8��ĝh��X�)�T�~K8}%�����(,M����Aj�D�Z8�ŝZ����: �T8�Kŝb��X��T�<:�����^ݍ1�!�p�7z\�1R�;� 7Q� �&�#�@� �y�E� I�Uit4;y&��G��7�:t]�������N�� G ٸ�*Nd��� nw�ubѶ夶-]���������9�'b���E�;� 7QM��qOy8��ĝh���t�޽O-���L�Z�a �&er��Ԓ�B�i��X~�=H���]v:�I�O�����ًX����w� PK.�x|]  PK   �}Wz��q;   [Content_Types].xmlPK   �}W��z�� I | _rels/.relsPK   �}W6n�!� �  � docProps/app.xmlPK   �}W7��B �  i docProps/core.xmlPK   �}Wh���y �  � xl/sharedStrings.xmlPK   �}W�<W8 �
i xl/styles.xmlPK   �}W��e� j  � xl/workbook.xmlPK   �}W�;�� 3   xl/_rels/workbook.xml.relsPK   �}W.�x|]   + xl/worksheets/sheet1.xmlPK ? �

  1. 测试涉及到的文件(注意脱密) xx.xlsx
looly commented 1 year ago

看报错问题出在你的URL上。

HttpRequest httpRequest = HttpRequest.of(UrlBuilder.ofHttpWithoutEncode(url.toString()));

为何不直接使用HttpRequest.of(url) ?

UrlBuilder.ofHttpWithoutEncode方法不会转义你的URL,如果有特殊字符那肯定报错啊。

xk-ai commented 1 year ago

看报错问题出在你的URL上。

HttpRequest httpRequest = HttpRequest.of(UrlBuilder.ofHttpWithoutEncode(url.toString()));

为何不直接使用HttpRequest.of(url) ?

UrlBuilder.ofHttpWithoutEncode方法不会转义你的URL,如果有特殊字符那肯定报错啊。

不是的,我之前也有用了HttpRequest.of(url),我url是没有问题的。我代码里面有一个if判断,当我开始添加二进制文件的时候就报错了,其他时候都是正常的,url本身没有问题,最终报错信息把二进制文件的内容作为query参数给加到了url,才导致的报错

xk-ai commented 1 year ago

看报错问题出在你的URL上。

HttpRequest httpRequest = HttpRequest.of(UrlBuilder.ofHttpWithoutEncode(url.toString()));

为何不直接使用HttpRequest.of(url) ?

UrlBuilder.ofHttpWithoutEncode方法不会转义你的URL,如果有特殊字符那肯定报错啊。

我查看以往issue,说是可以用httpRequest.body(file.getBytes());进行二进制文件上传,可以看一下我最终调用前的httprequest参数

looly commented 1 year ago

@xk-ai 问题不是出在了body方法,而是你url本身没有被编码导致的特殊字符不能被解析。

xk-ai commented 1 year ago

HttpRequest.of(url)

我使用HttpRequest.of(url)一样报错

xk-ai commented 1 year ago

@xk-ai 问题不是出在了body方法,而是你url本身没有被编码导致的特殊字符不能被解析。

何况我的url没有特殊字符,就只是/test,

looly commented 1 year ago

@xk-ai 方便的话,加qq群私聊我。咱们看下啥问题。

xk-ai commented 1 year ago

@xk-ai 方便的话,加qq群私聊我。咱们看下啥问题。

我之前加了,给小磊老师提问了,您那边可能太忙,没看见

looly commented 1 year ago

@xk-ai 不好意思,可能消息太多没看到。麻烦私聊闪我一下,咱们看。

looly commented 1 year ago

SM%6LLP7TWV}D7~LCB`XM5L

如果GET请求需要带body,使用setRest(true)方法。