一、Web安全常见攻击手段
1 XSS
跨站脚本攻击(Cross Site Scripting)缩写为CSS,避免与CSS层叠样式名称冲突,缩写改写为XSS。
**攻击原理:**数据提交转发到另一个页面展示,使用js脚本语言,浏览器默认支持脚本语言执行
**攻击常见场景:**论坛,评论XSS
**防御手段:**特殊字符,使用转义字符转换
**解决办法**:服务后端使用过滤器统一拦截请求数据,将特殊字符转义处理,但是有的表单需要提交特殊字符,这种情况,在实际开发中,特殊考虑
2 SQL注入
原理:dao层采用sql拼接的方式,没有采用预编译方式。
攻击示例:
/login?username=xiaoming&password=' or 1='1;
后台sql:select * from user where username='${usernmae}' and password='${password}'
**mybatis中:** $是采用sql拼接的方式,#会预编译sql语句,防止sql语句攻击
3 防盗链
限制资源只能在某个服务器上访问
原理:使用http请求头中的referer属性,标识该链接的来源域名,服务端程序,通过检测请求头中的referer,是否给与响应
实际使用场景:图片、视频、接口等需要保护的资源,对请求做限制,例如添加黑名单、白名单来限制可访问的网站
技术实现:网关,过滤器,添加黑名单白名单,对需要保护的接口或特定请求地址进行访问限制
4 CSRF
跨站请求伪造(英语:Cross-site request forgery)
幂等性:唯一性,也就是防止表单重复提交,使用token作为令牌,每次请求前,必须获取一个令牌,将令牌token存在request header中,请求到达服务器后,服务端删除该令牌,当请求第二次达到时,发现token不存在,返回请求错误
场景:服务端api采用幂等设计,使用token令牌来控制请求。客户端可以提前生成很多token,然后多次发送相同请求,每次使用事先生成好的token,来发起攻击。
如何防止机器模拟请求发起攻击:
1 使用图形验证码
2 使用nginx对客户端限流
3 配置黑名单和白名单(发现恶意攻击后,将请求端IP加入黑名单,禁止访问)
如何防止伪造token请求:
须知:互联网上没有绝对防止通过抓包分析到token的方法。
在操作核心业务,比如修改密码,支付下单,转账等核心业务时,使用短信验证码方式或者人脸识别方式,确认是否为本人操作。(实际应用中,一般小金额不会验证,大金额会验证)
5 忘记密码漏洞
原理:抓包后,模拟请求,用程序不停的尝试登陆
如何防止:
1 密码字母数字符号
2 重试5次仍然错误,出图形验证码
3 配置防止DDOS,限流,限制IP访问,黑名单和白名单
6 不要用隐藏域传递关键数据
例如流程有第一步、第二部、第三步,前面步骤的数据不要存在隐藏域或者js变量,存在后台session中
7 上传漏洞
上传接口中,对文件格式做限制,黑客上传木马文件(可执行程序),可能会导致服务崩溃。比如,文件可以为jsp,exe,bat文件。
案例:如果服务为java web,使用tomcat服务器,且服务端未做动静分离,安全控制,在文件上传的时候,上传jsp,jsp页面植入java删除文件代码,浏览器访问该jsp,即可删除。
如何防御:
1 不能用文件后缀判断文件格式,读取文件流,判断文件格式(重要)
2 动静分离,Nginx + Tomcat,nginx不能执行jsp程序(重要)
3 服务器环境上硬盘不能删除操作
4 前端做后缀限制
5 服务器生产环境禁止热部署
6 限制上传class、jsp、exe等可执行程序
8 常见其他漏洞
- jsp注释,要使用java注释<%--%>,不要使用htm注释
- 全局捕获异常,统一返回异常信息
二、信息加密与漏洞扫描
加密算法,不能百分百防止,只是尽可能的消耗破解的成本
密码,一般用单向加密,不可被解密,使用MD5加密再加盐
- 对称加密
加解密使用同一个密钥。常见的对称加密方案:DES,AES
缺点:密码容易泄露
有点:速度非常快
场景:服务端与服务端通信,多方约定好相同的密钥后,各自保护好密钥
移动端APP,禁止使用对称加密,apk安装包可以反编译获取源码中的密钥
- 非对称加密
公钥 + 私钥 RSA
1 使用第三方工具生成非对称加密钥对,github上有代码可生成,公开公钥给客户端,自己保存好私钥(每个客户端对应一对公钥私钥)
2 公钥加密,私钥解密;(安全,比如github本地仓库同步)
私钥加密,公钥解密
有点:目前为止,最安全的加密手段
缺点:效率低
场景:第三方支付对接,核心金融结构对接
三、互联网API接口安全设计
- API幂等设计
防止网络延迟或接口重复提交导致数据重复的问题,保证数据唯一性
解决方案:请求端将token放入request header中,redis生成token,单机版可以使用uuid来保证token的唯一性,分布式应用需要使用分布式全局id,使用AOP技术,自定义注解,实现处理表单重复提交的逻辑,消费掉token
- web页面表单重复提交
同上,将token放入form表单中。当进入表单页面时(也可以用自定义注解实现,给每个需要token的页面生成token),后台生成一个token存入页面的hidden input
-
如何保证外网开放接口的安全性
1 搭建API网关控制接口访问权限
2 开放平台设计oauth2.0协议(安全认证),包括qq、微信、微博等第三方联合登陆
3 采用https加密传输协议(nginx配置https)
4 API接口数字签名,非对称加密,rsa2.5,基于令牌的方式实现API接口调用。防止抓包分析篡改数据一般来说,表结构设计
appName 机构名称
appId 应用id(一次注册,永远不变,相当于主键,便于后台控制该应用的使用权)
appSecret 应用密钥(可改变,避免泄露,发现泄露后更改密钥)
isFlag 是否可用(是否对某个机构开放)
accessToken 最近一次的accessToken服务端步骤:根据appId,appSecret查询token,有则删除原来的token,再生成新的token,用redis来控制token过期时间,token作为键,appId作为值;具体调用服务时携带token,后台判断token的有效性及是否对机构开放(根据isFlag)。
客户端:如果token过期,重新调用获取token的接口?一般采用job,根据过期时间来设定一个定时任务,设置最新的token,这样就可以保证调用服务时,从定时任务执行的结果拿到token,实现token永久有效
四、网站安全漏洞扫描与抓包分析
- 如何防止抓包篡改数据
场景:金融系统,传递用户userid,金额等数据
用户防御方式:使用关键联网业务时,尽量不要连接不可信wifi,使用4g流量 ,使用移动运营商提供的上网服务,除非4g流量使用伪基站发送诈骗短信。短信链接不要点击。
服务端程序防御方式:验证签名和令牌方式实现参数传递
令牌方式:
1 客户端界面传到主系统后台的userid,金额等参数,主系统服务器使用httpclient调用支付系统获取令牌参数接口,将userid,金额等参数传过去,获取到返回的参数令牌,并给客户端
2 客户端拿到参数令牌后,跳转到支付系统
3 支付系统通过该参数令牌,取到保存好的参数,完成支付相关业务
除非黑客能黑掉主系统服务端或者支付系统,常见的抓包是通过连接局域网,该局域网内有黑客对客户端发起的请求进行抓包获取明文数据或者篡改数据,发生安全事故
- 抓包工具
在请求前后可以进行拦截,修改请求参数或修改返回数据
1 测试工程,核对传入参数是否符合要求
2 黑客:获取明文数据,篡改数据
五、Https协议
- http协议
超文本传输协议,底层使用socket TCP长连接,基于请求与响应,同步请求
- 重定向
浏览器发起两次请求,如果返回状态302给客户端,在响应头中存放对应的值就是重定向地址,直接访问本地。后台可以直接写response.setStatus(302);response.setHeader("location", "loginPage");
- https协议
https底层实现,使用混合加密算法(对称加密和非对称加密)
先生成对称加密密钥SC,然后使用非对称加密生成的公钥SCP,对SC进行加密,最后通过SC对请求数据进行对称加密传输(因为对称加密效率高)
流程:
客户端为浏览器,服务端为证书服务
1 浏览器向服务器端发送https请求
2 服务端向客户端发送证书和公钥
3 浏览器验证证书是否有效,有效,则生成一个随机数,作为对称密钥,然后使用公钥对对称密钥进行加密,发送到服务端
4 服务端使用私钥对接收到的数据解密,得到随机数,然后使用该随机数进行对称加密传输数据到浏览器
5 浏览器使用随机数解密,得到正确的数据,验证可靠性
6 最后,浏览器使用随机数对传输参数进行对称加密传输
如何使用https:
阿里云申请免费一年的证书,支持nginx,apache,tomcat配置,按照官方教程配置即可,一般使用nginx来配置https,如果tomcat集群,每个集群都要配置相对来说较nginx会多一些工作量
六、电子商务风控与黑名单白名单系统
- 企业网关如何架构
- 企业级网关应用场景
路由地址,反向代理,黑名单与白名单,授权安全,跨域(保证域名(网关地址)相同使用nginx区分不同的项目路径进行转发跳转)
- 企业网关作用
- 常用网关框架,Nginx, Zuul
Zuul使用JAVA编写,微服务专用,springboot搭建一个zuul服务并起到,在application.yml文件中配置管理的项目地址
Nginx 使用C编写,针对服务器,配置搞定,nginx根据项目名进行转发
- 基于Zuul框架实现接口权限判断