欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

web系统漏洞和安全问题

程序员文章站 2024-03-19 13:09:22
...

系统安全概述

互联网技术发展到现在,大部分系统都是基于b/s模式的,暴露在互联网环境下,就算是使用内网也难免会产生安全性问题.常见的安全问题一般有xss攻击,越权访问攻击,http报文安全问题,撞库攻击等 .这里简单记录下自己的解决方法。

xss攻击

简单来说就是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,一旦攻击成功,它可以获取用户的信息,删除日志,还可以其他攻击方式同时实施比如SQL注入攻击服务器和数据库等,是系统安全的头号敌人。
解决方案(过滤输入,转义输出)
1.过滤特殊字符,提交内容包括URL、查询关键字、http头、post数据等.xss攻击的本质是基于同源策略的html注入,客户端和服务端都需要对用户输入的字符进行特殊字符的过滤,比如如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等.
2.在输出方面,在用户输内容中使用标签。标签内的内容不会解释,直接显示。
3.严格控制用户输入字符的个数。
4.脚本执行区不允许用户有任何输入。

越权访问攻击

越权访问是由于开发人员在资源访问url中直接使用了id等信息,而又不校验资源所属从而存在被穷举id盗取本该不能访问的资源的攻击方式.越权访问分为水平越权和纵向越权两种,前者是指访问当前用户同级别的其他用户的资源,后者指访问更高级别用户的资源。
解决方案
水平越权:一般存在的问题是 用户id这些信息从客户端获取,交易id的增删改查不校验 所属用户;解决办法是用户信息从服务器session中获取,交易id的增删改查校验所属用户。但是如果每次都查询数据库校验用户是否拥有该交易id的资源,势必会造成延时和数据库压力增大,可以考虑通过用户名(由服务器获取)和标识作为key,资源id集合作为value存储到redis。用户资源新增时,更新redis,删除某个资源时因为不影响业务可以不用更新redis,等到下次用户资源新增在更新。
纵向越权:一般发生在权限菜单等信息控制在客户端或者浏览器,通过模拟参数获取更大权限,可以通过 责任链的方式 在交易请求进来时对所属交易权限跟session进行对比。

http安全

由于成本问题,很多系统都还是采用http协议进行访问,由于http协议是没有安全校验和加密验签的,很可能存在着http重放攻击和报文被截取的问题。
解决方案
1.最好的办法就是采用https协议,或者是采用自签的https证书
2.防重放攻击中,最重要的手段是给消息打上一个唯一、不可以重新生成的编号,保证这个编号只能使用一次。
3.参数报文采用加密机制,采用AES对称加密或者RSA非对称加密。

撞库攻击

撞库是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。很多用户在不同网站使用的是相同的帐号密码,因此黑客可以通过获取用户在A网站的账户从而尝试登录B网址,这就可以理解为撞库攻击。
解决方案
根本问题在于用户的安全意识不够,为了方便不同的账号使用了一样的密码,让不法人员有了可乘之机。但是不可能要求每个用户都按照我们的意愿去修改密码,从系统的层面上看只能尽可能地减少非法ip不断尝试去匹配用户密码导致密码泄露的风险。
1.应以HASH或者加密技术保存密码,不得以明文方式保存或者传输;当用户账号注销,应及时注销该账号下的相关业务账号使用。
2.内部系统,要求密码至少每90天更换一次。修改密码时,须保留密码修改记录,包含帐号、修改时间、修改原因等
3.登陆使用验证码,并配置验证码使用次数和有效时间,减少脚本暴力登陆
4.设置用户业务认证登录策略,限定失败登录次数(如5次)、锁定时间(如1小时)、解锁方式
5.应配置当来自同一终端的不同账号连续认证失败次数超过限定次数(如5次),锁定来自该终端的登录请求
6.审计登陆日志,及时通知管理员
(1)应配置登录日志留存,对用户登录进行记录,登录日志内容至少包括用户登录使用的账号,登录是否成功,登录时间,以及远程登录时,用户使用的IP地址。
(2)审计登录日志,如果在限定时间内(例如5分钟),同一用户名产生的登录日志条数超过限定数量,则报告账号异常。
(3)审计登录日志,如果在限定时间内(例如5分钟),登录失败的日志条数超过限定数量,则报告登录行为异常。
(4)审计登录日志,如果在限定时间内(例如5分钟),同一IP地址产生的登录日志条数超过限定数量,则报告登录行为异常。

配置验证码使用次数和有效时间

校验验证码并只能使用一次

//验证验证码是否正确
        if (KaptchaUtil.getKaptchaOnOff()) {  //springboot验证码开关
        //用户输入的验证码
            String kaptcha = super.getPara("kaptcha").trim();
            //获取session中的验证码
            String code = (String) super.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
            //验证码失效
            if(StringUtils.isBlank(code)){
                throw new KaptchaTimeoutException();
            }
            //销毁验证码,只允许使用一次
            super.getSession().removeAttribute(Constants.KAPTCHA_SESSION_KEY);
            if (ToolUtil.isEmpty(kaptcha) || !kaptcha.equalsIgnoreCase(code)) {
                throw new InvalidKaptchaException();
            }
//验证码通过,下一步校验账号密码

验证码有效时间2分钟,在生成验证码的方法中调用这个定时方法即可

  /**
     * 设置5分钟后删除session中的验证码
     * @param session
     * @param attrName
     */
    private void removeAttrbute(final HttpSession session, final String attrName) {
        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // 删除session中存的验证码
                session.removeAttribute(attrName);
                timer.cancel();
            }
        }, 2 * 60 * 1000);
    }

登陆次数限制和日志审计报警设计逻辑

这里是我的一些简单的实现,如果有不当的地方或者更好的方法欢迎指正
1.限定同一账号连续登录失败次数(如5次)、锁定时间(如1小时)、解锁方式
方案:用户表复用用户的状态字段和状态变更时间字段,一般用户状态有正常,冻结和注销状态,增加锁定状态;新增错误次数统计字段,密码错误统计次数加一,到达五次锁定用户并更新用户锁定时间;使用定时任务巡检用户表(时间间隔为5到10分钟),锁定的用户时间超过一个小时解锁用户。
2.同一终端的不同账号连续认证失败次数超过限定次数(如5次),锁定来自该终端的登录请求
方案:用户ip和特定标识作为key,失败次数作为value,存储到redis,登陆前先校验redis该ip的错误次数是否达到5次,达到则拒绝访问。设置该key的有效时间为10分钟。

  //判断用户错误登陆次数是否超限
        Integer errorSignNum = 0;
        try {
        //密码错误,查找数据库密码错误次数
            errorSignNum = userService.selectErrorSignNum(username);
        }catch(Exception e){
            //账号密码错误
            totalErrotNum = totalErrotNum +1;
            redisUtil.set(id,totalErrotNum+"",600L);//过期时间单位是秒
            throw new IncorrectCredentialsException();
        }
        if (errorSignNum>=5){
            throw new ErrorSignOverTimeException();
        }

3.日志审计(基于日志系统的升级,日志系统请自行百度):五分钟内,密码错误的日志超五条,报告账号异常;五分钟内,同一ip密码错误日志超过30条,报告ip异常;五分钟内,系统的错误日志超过30条,报告系统异常。
方案:设计到五分钟检查一次,考虑使用定时任务,五分钟巡检一次,审计日志表通过错误类型和登陆账号做区分,审计出现上面三种情况则发邮件提醒管理员。或者是把三面的三种情况作为撞库攻击的日志存入新的表,并以表中的数据作为系统通知栏的内容通知管理员;表中新增的日志都加上时间,只显示当天的日志异常。