之前的一篇 常见漏洞总结 介绍了工作中可能常见的一些漏洞,今天来学习下关于这些漏洞的一些应对方式。
1. sql注入
1)JDBC的预编译
PreparedStatement ps = conn.preparedStatement(sql); ps.setString(1,username); ps.setString(2,password); ResultSet rs = ps.executeQuery();
如上图示例:使用预编译PreparedStatement,通过setXXX方法传递变量,可解决SQL注入问题。
2)MyBatis
示例如下:
select * from table where username = ${username} and passeord = #{password};
mybatis中,使用 # 可以解决注入问题。如上图示例,username存在注入风险,而password不存在。
3)总结
两种防注入方式实际都是通过对输入进行预处理,使输入都变为一个字符串,从而忽略sql语句的拼接来达到防注入的效果。
2. XSS漏洞
1)过滤
注意事项: 有时过滤会导致一些错误处理,例如将alice's 过滤为alices; 有时需要进行多次过滤操作,例如<htm<html>l> 过滤掉<html>之后还存在<html>标签 需要注意多个过滤器生效的先后顺序。多个过滤器一起生效时,有可能后生效的会导致先生效的过滤失效。
2)输入输出编码
输入编码往往有全局的解决方案,但是对于持久性的xss,已经入库之后,就难以使用编码来处理。
3)恶意流量拦截
通过一些前置的恶意流量检测和拦截,来提前预防攻击产生
4)CSP解决方案
内容安全策略(CSP):网站通过发送一个 CSP 头部,来告诉浏览器什么是被授权执行的与什么是需要被禁止的。通过配置浏览器渲染规则,来限制浏览器执行的js代码、html标签等。
3. CSRF漏洞
1)请求附带随机参数
每次请求带一次有效的随机数(隐藏 input)。
2)避免跨域请求
校验origin,referer;post发送json数据
3)跨域策略
Double Submit Cookie
4. 文件上传和下载
1)文件上传
- 限制目录不可执行
- 上传文件的类型和大小检查
2)文件下载
- 禁止用户自定义文件路径
- 对用户请求的文件名进行安全处理