用户登录-访问权限+登录验证+xss过滤

举报
赵KK日常技术记录 发表于 2023/06/24 13:37:16 2023/06/24
【摘要】 在系统登录时,除了正常的用户名密码验证之外,需要做登录后的访问权限,登录验证,以及输入字符验证,有些非权限页面可以无权限访问,比如帮助页面,版本信息等,有些需要会员才可见的页面,需要权限分配,有些需要登录后才可访问,比如京东的购物车下单需要强制登录,且所有的输入框都应做特殊字符验证。写公众号有啥好处么?2020年1月12日每日一问这成我们小群的特色了,遇见问题就发到群里讨论总结,每次都是我,...

在系统登录时,除了正常的用户名密码验证之外,需要做登录后的访问权限,登录验证,以及输入字符验证,有些非权限页面可以无权限访问,比如帮助页面,版本信息等,有些需要会员才可见的页面,需要权限分配,有些需要登录后才可访问,比如京东的购物车下单需要强制登录,且所有的输入框都应做特殊字符验证。

写公众号有啥好处么?

请在此添加图片描述

2020年1月12日每日一问

这成我们小群的特色了,遇见问题就发到群里讨论总结,每次都是我,有错就要认,挨打要立正,如下:

请在此添加图片描述

/**
 * @author zhaokkstart
 * @create 2020-01-12 11:02
 */
public class A {
    public static void main(String[] args) {
        Super asuper = new Sub();
        Sub sub = new Sub();
        test(asuper);
        test(sub);
    }
    static void test(Super su) {
        System.out.printf("Super----" + su.getName());
    }
    static void test(Sub su) {
        System.out.printf("Sub----" + su.getName());
    }
}
class Sub extends Super {
    @Override
    public String getName() {
        return "sub";
    }
}
class Super {
    public String getName() {
        return "Super";
    }
}

首先方法名相同,参数顺序,个数相同,参数类型不同,为方法的重载,此时只看类型不看引用,

第一行Super—sub,第二行同理

一:访问权限

访问权限即登录后需要分配当前角色的权限

// 采用递归算法实现许可数据查询

     * 1) 方法自己调用自己
     * 2) 方法一定要有跳出的逻辑
     * 3) 方法在调用自身时,传递的参数需要有规律
   public Msg getmenu(HttpServletRequest request) {
      User user=GwSessionUtils.getUser();
      Integer roleId = userService.selectRoleId(user.getId());
       //取出所有菜单   
        List<Menu> menuidlist = userService.selectMenuByRoleId(roleId);
        List<Menu> menuList = new ArrayList<Menu>();
        //组装返回数据
        JSONObject returnData = new JSONObject();
        for (Menu menu : menuidlist) {
        //获取子节点
            if (menu.getParentId() == null) {
                menuList.add(menu);
            }
        }
        
        for (Menu menu : menuList) {
            menu.setChildren(getChild(menu.getId(), menuidlist)) ;
        }
        returnData.put("list",menuList);
        return Msg.success().add("returnData",returnData);
    }
    private List<Menu> getChild(Integer id, List<Menu> menuidlist) {
        List<Menu> childs = new ArrayList<>();
        for (Menu menu : menuidlist) {
            if (menu.getParentId() != null) {
                if (menu.getParentId().equals(id)) {
                    childs.add(menu);
                }
            }
        }
        for (Menu e : childs) {
        //放入子节点
          e.setChildren(getChild(e.getId(), menuidlist));
        }
        if (childs.size() == 0) {
            List children=new ArrayList();
            return children;
        }
        return childs;
    }

获取父子节点关系的三种方法:

https://blog.csdn.net/weixin_42373241/article/details/86237766

二:登录验证

/**
 * @author zhaokkstart
 * @create 2020-01-12 11:34
 */
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        HttpSession session = request.getSession();
        //获取用户信息  查表/从session中获取
        User loginUser =(User) session.getAttribute("loginUser");
        if (loginUser==null){
            response.sendRedirect("/login");
            return false;
        }else{
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    }
}

三:XSS过滤

正常用户输入中避免最多的应该是SQL注入的危险,为了避免用户输入特殊字符跳过验证造成系统危险,除了SQL执行要用#取值以外,要避免输入特殊命令造成SQL执行

SQL注入扫描工具:SQLiv的批量SQL注入漏洞扫描工具

https://www.freebuf.com/column/150588.html

例如:

select * from user where userName="" and passward="";

用户在输入时填入了or 1=1# 123456

这时SQL就变成了

select * from user where userName="" or 1=1# and passward=""

此时的sql无论如何都会执行成功

#可以防止预编译效果,且把参数赋值为?在sql语句中执行防止注入

啥是XSS攻击?

百科:XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制–例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的"缓冲区溢出攻击",而JavaScript是新型的"ShellCode"。

除了正则表达式过滤特殊字符外,严谨性判断应在后端进行二次防范

@WebFilter(filterName = "xssFilter", urlPatterns = "/system/*")
public class XssFilter implements Filter
{

    /**
     * 排除链接
     */
    public List<String> excludes = new ArrayList<>();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException
{
        String temp = filterConfig.getInitParameter("excludes");
        if (temp != null)
        {
            String[] url = temp.split(",");
            for (int i = 0; url != null && i < url.length; i++)
            {
                excludes.add(url[i]);
            }
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException
{
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        if (handleExcludeURL(req, resp))
        {
            chain.doFilter(request, response);
            return;
        }
        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
        chain.doFilter(xssRequest, response);
    }

    private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
{
        if (excludes == null || excludes.isEmpty())
        {
            return false;
        }
        String url = request.getServletPath();
        for (String pattern : excludes)
        {
            Pattern p = Pattern.compile("^" + pattern);
            Matcher m = p.matcher(url);
            if (m.find())
            {
                return true;
            }
        }
        return false;
    }

    @Override
    public void destroy()
{

    }

}
上层父类就是HttpRequest
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
{

    /**
     * @param request
     */
    public XssHttpServletRequestWrapper(HttpServletRequest request)
    {
        super(request);
    }

    @Override
    public String[] getParameterValues(String name)
    {
    获取参数名称
        String[] values = super.getParameterValues(name);
    判空
        if (values != null)
        {
            int length = values.length;
            String[] escapseValues = new String[length];
            for (int i = 0; i < length; i++)
            {
                // 防xss攻击和过滤前后空格
                escapseValues[i] = Jsoup.clean(values[i], Whitelist.relaxed()).trim();
            }
            return escapseValues;
        }
        return super.getParameterValues(name);
    }
}

你的压力来源于你无法自律。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。