套接字:Android到Unity,可能进行分配攻击?

时间:2019-05-20 08:34:12

标签: android sockets unity3d

我在使用Java的Android上有一个客户端应用程序,在Unity游戏中我的笔记本电脑上有一个服务器。两者都在同一网络上,我让它们连接起来。但是,当我从客户端向服务器发送小字符串消息时,服务器会使用以下警告阻止它: ReadMessageBlocking: possible allocation attack with a header of 1298494342 bytes.我什至应该开始走近这一障碍?

对于服务器,我正在使用Unity的Mirror库,该库建立在Telepathy框架之上。 对于客户,我遵循了this教程的客户部分。

This(来自Telepathy)包含引发此警告的相关方法(ReadMessageBlocking)。我尝试将MaxMessageSize设置为int.MaxValue(约2 GB),以便至少接受该消息,以便我可以通过打印其内容来检查它,但无济于事。

我对ReadMessageBlocking没问题,这是有充分理由的。我担心的是:为什么世界上我的android会发送带有字符串的1 GB标头?我该怎么办?

编辑:这是从客户端发送消息的相关功能(如前面提到的教程中所述。)

void sendMessage(final String message) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        if (null != socket) {
                            PrintWriter out = new PrintWriter(new BufferedWriter(
                                    new OutputStreamWriter(socket.getOutputStream())),
                                    true);
                            out.println(message);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

    }

对于(Unity)服务器要接收,我什么也没写。警告来自Telepathy的内部消息处理功能,我认为这里是ReceiveLoop

2 个答案:

答案 0 :(得分:0)

您发送的包的标头不正确,表示标头中的包很大,服务器随后检测到原因,它希望防止发送标头的多个包超载,原因是该包比实际包头大得多

让标题为合适的大小

  

我尝试将MaxMessageSize设置为int.MaxValue

太大了

答案 1 :(得分:0)

我知道了。心灵感应(以及扩展名,镜像)使用byte[]数组与常规格式为<size,message>的数据包进行通信。这就是说,首先要在数组中指定要发送的消息的大小(以字节为单位),然后是实际消息内容的字节。

由于我在另一端使用Java,DataOutputStream使其变得更简单:

DataOutputStream d_out = new DataOutputStream(socket.getOutputStream());
byte [] byte_message = message.getBytes();
d_out.writeInt(byte_message.length);
d_out.write(byte_message);

由于我之前没有使用DataOutputStream,因此Telepathy将完整的消息内容解释为size并在哭泣。因此完整的Send代码现在看起来像这样:

void sendMessage(final String message) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        if (null != socket) {
                            DataOutputStream d_out = new                             
                            DataOutputStream(socket.getOutputStream());
                            byte [] byte_message = message.getBytes();
                            d_out.writeInt(byte_message.length);
                            d_out.write(byte_message);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

    }