第十一课 粘包分包分析,如何避免socket攻击

1、消息如何在管道中流转

当前的一个handler如何往下面的一个handler传递一个对象

一个管道中会有多个handler

handler往下传递对象的方法是sendUpstream(event)
服务端

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

            @Override
            public ChannelPipeline getPipeline() throws Exception {

                ChannelPipeline pipeline = Channels.pipeline();
                //handler传递
                pipeline.addLast("FirstHandler", new FirstHandler());
                pipeline.addLast("SecondHandler", new SecondHandler());
                return pipeline;
            }
        });

public class FirstHandler extends SimpleChannelHandler {

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        //第一个handler
        ChannelBuffer buffer = (ChannelBuffer)e.getMessage();

        byte[] array = buffer.array();
        String message = new String(array);
        System.out.println("FirstHandler:" + message);

        //传递   发送到下一个Handler 

        // public UpstreamMessageEvent(Channel channel, Object message, SocketAddress remoteAddress)
        ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "abc", e.getRemoteAddress()));
        ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "def", e.getRemoteAddress()));
        ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "ghn", e.getRemoteAddress()));
    }
}
public class SecondHandler extends SimpleChannelHandler {

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        //这里接收从FirstHandler转发过来的请求
        String message = (String)e.getMessage();

        System.out.println("SecondHandler:" + message);
    }
}

2、看下粘包和分包是怎么样一个情况

hello hello
hellohe llo
服务端接收到的数据不稳定
解决方法:

  • 定义一个稳定的结构 length + hello

  1. 为什么FrameDecoder return的对象就是往下传递的对象 (还是调用了sendUpstream)

  2. buffer里面数据未被读取完怎么办? (cumulation缓存)

  3. 为什么return null就可以缓存buffer (cumulation缓存)

  4. FrameDecoder里面的cumulation其实就是一个缓存的buffer对象


把长度定义的很大,这种数据包,通常被称为socket攻击,字节流式攻击
解决方法传输的数据添加包头

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章