url动态加解密

表单提交(或其他需要请求后台url)的场景下,url对于客户端来说是可见的,攻击者可以通过url猜测到很多信息并伪造请求对url进行攻击。本文探讨了一种对url加密和解密的方案,并给出了关键代码。

发布于 technology

spring security csrf 学习笔记

最近在学习和研究csrf攻击,项目中使用了spring security,提供了csrf防御的能力,本文对该功能的使用做记录和说明、总结。

发布于 technology

CSRF(跨站请求伪造)学习笔记

记录CSRF跨站请求伪造攻击的原理和防御。

发布于 technology

ServerSocket 和 ThreadPoolExecutor学习笔记

ServerSocket部分123456789101112final ServerSocket server = new ServerSocket(9090);server.setReceiveBufferSize(1024 * 4);// 设置缓冲区大小4kdo { try { final Socket client = server.accept(); soaTransPool.execute(new SoaTransPool.SoaCodecTask(client)); } catch (IOException e) { //TODO e.printStackTrace(); }} while (true); 其中,soaTransPool是一个自定义的类,类中定义了ThreadPoolExecutor,以及实现了Runnable的静态类SoaCodecTask. ServerSocket监听9090端口,每当有请求到达,就创建一个socket,使用这个socket构造一个Runnable对象,即SoaCodecTask,再使用ThreadPoolExecutor来执行这个Runnable对象。也就是说,对每个请求创建一个任务,由线程池来执行这个任务。 事实上,ServerSocket的功能就是向系统注册一个服务,然后等待客户端请求,或者从请求队列中取出Socket,至于数据的传递则由Socket完成。 上面的例子中,使用的是线程池的处理方式,接收到的请求由线程池来处理;如果是简单的单线程ServerSocket,则可以这么写: 1234567891011121314151617ServerSocket server = new ServerSocket(9090);Socket client = null;do { try { client = server.accept(); System.out.println("新增链接: " + client.getInetAddress() + ": " + client.getPort()); // ...接收、处理、发送数据 } catch (IOException e) { //TODO e.printStackTrace(); }finally{ if(client != null){ client.close(); } }} while (true); 如果是想用多线程,就如第一个例子中那样,将socket作为参数创建一个Runnable对象,并新建一个线程并start以执行run方法。

发布于 technology

markdown 学习笔记

终于知道为什么github上面每个项目的说明文件都叫README.md,原来是使用markdown语法编写的文档,再通过工具生成html页面,我们在github上打开的readme.md都是经过渲染后的结果。

发布于 technology