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

来源:互联网 发布:趣头条刷阅读量软件 编辑:程序博客网 时间:2024/06/06 18:10

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攻击,字节流式攻击
解决方法传输的数据添加包头

原创粉丝点击