一、二、三有空补
四. Web应用的安全
1. CSS攻击,跨站脚本攻击
跨站脚本,顾名思义,就是恶意攻击者利用网站漏洞往Web页面里插入恶意代码,一般需要以下几个
条件:
(1)客户端访问的网站是一个有漏洞的网站,但是他没有意识到;
(2)在这个网站中通过一些手段放入一段可以执行的代码,吸引客户执行(通过鼠标点击等);
(3)客户点击后,代码执行,可以达到攻击目的。
解决方案:对用户输入的数据进行HTML转移处理。如今很多开源框架默认就支持HTML的转义。
2. CSRF攻击(Cross Site Request Forgery, 跨站域请求伪造)
你这可以这么理解 CSRF 攻击:攻击者盗用了你的身份,伪装成你发送恶意请求。CSRF能够做的事
情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包
括:个人隐私泄露以及财产安全。
具体攻击过程如下:
(1)用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
(2)在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正
常发送请求到网站A;
(3)用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
(4)网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A
解决方案:
(1)将cookie设置成HttpOnly
(2)增加token
其原理是在请求中放入攻击者所不能伪造的信息,并且该新信息不存在于cookie中。鉴于此,系
统开发人员可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务端进行token验证,
如果请求中没有token或者token内容不正确,则认为CSRF攻击而拒绝该请求。例如,token可以存放
在表单中的隐藏域中:<input type="hidden" name="_token" value="tokenvalue"/>。token的值通过服
务端生成,表单提交后token的值通过POST请求与参数一同带到服务端,每次会话可以使用相同的
token,会话过期,则token失效,攻击者因无法获取token,也就无法伪造请求。
HttpSession session=request.getSession() Object token=session.getAttribute("_token") if(token==null||"".equals(token)) { session.setAttribute("_token",UUID.randomUUID().toString()); }
3.SQL注入攻击
解决方案:
(1)使用预编译语句(PreparedStatement)
预编译语句使用参数占位符来替代需要动态传入的参数,这样攻击者无法改变SQL语句的结构,
SQL语句的语义不会发生变化,即便用户输入sql,它会将其转义。
例如,原语句:
select * from hhuser where nick=nickname and password=password
例如用户输入 ‘or ‘1‘=‘1时,不使用预编译,生成语句为:
select * from hhuser where nick=‘zhangsan‘ and password=‘‘ or ‘1‘=‘1‘
使用预编译:
select * from hhuser where nick=‘zhangsan‘ and password=‘\‘ or \‘1\‘=\‘1‘
可见发生了转义。
(2)使用ORM框架,如IBATIS和Hibernate等都支持输入变量的转义实现办法时通过#配置变量
4.文件上传漏洞
(1)一般处理方法
为了防止用户上传恶意的可执行文件和脚本,以及将文件服务器当做免费的文件存储服务器使用,
我们需要对上传的文件进行白名单校验并限制上传文件的大小,上传文件需要重新命名,使共攻者无
法猜测上传文件的访问路径。对于上传的文件来说,不能简单地通过后缀名称判断文件的类型,因为
恶意攻击可以将可执行文件的后缀名称改成图片或者其它后缀类型,诱导用户执行。因此,判断文件
类型需要使用更安全的方式,很多类型的文件起使得几个字节内容使固定得,根据这几个字节的内容,
就可以确定文件的类型,这几个字节被称为魔数。
(2)配合使用imagemaglck
对于图片类型的文件,可以上传后对图片进行相应的缩放,破坏恶意用户上传的二进制可执行文
件的结构。imagemaglck是一套功能强大、稳定并且开源的对图片进行处理的开发工具包,能处理多
种格式的图片文件,可以利用imagemaglck来对图片进行缩放。
魔数枚举类型:
public enum FileType { /** JPEG */ JPEG("FFD8FF"), /** PNG */ PNG("89504E47"), /** GIF */ GIF("47494638"), /** TIFF */ TIFF("49492A00"), /** Windows bitmap */ BMP("424D"), /** CAD */ DWG("41433130"), /** Adobe photoshop */ PSD("38425053"), /** Rich Text Format */ RTF("7B5C727466"), /** XML */ XML("3C3F786D6C"), /** HTML */ HTML("68746D6C3E"), /** Outlook Express */ DBX("CFAD12FEC5FD746F "), /** Outlook */ PST("2142444E"), /** doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db */ OLE2("0xD0CF11E0A1B11AE1"), /** Microsoft Word/Excel */ XLS_DOC("D0CF11E0"), /** Microsoft Access */ MDB("5374616E64617264204A"), /** Word Perfect */ WPB("FF575043"), /** Postscript */ EPS_PS("252150532D41646F6265"), /** Adobe Acrobat */ PDF("255044462D312E"), /** Windows Password */ PWL("E3828596"), /** ZIP Archive */ ZIP("504B0304"), /** ARAR Archive */ RAR("52617221"), /** WAVE */ WAV("57415645"), /** AVI */ AVI("41564920"), /** Real Audio */ RAM("2E7261FD"), /** Real Media */ RM("2E524D46"), /** Quicktime */ MOV("6D6F6F76"), /** Windows Media */ ASF("3026B2758E66CF11"), /** MIDI */ MID("4D546864"); private String value = ""; private FileType(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
原文:https://www.cnblogs.com/jialanshun/p/10592974.html