前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用户登录-访问权限+登录验证+xss过滤

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

作者头像
疯狂的KK
发布2020-01-17 15:32:59
2.4K0
发布2020-01-17 15:32:59
举报
文章被收录于专栏:Java项目实战

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

写公众号有啥好处么?

2020年1月12日每日一问

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

代码语言:javascript
复制
/**
 * @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,第二行同理

一:访问权限

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

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

代码语言:javascript
复制
     * 1) 方法自己调用自己
     * 2) 方法一定要有跳出的逻辑
     * 3) 方法在调用自身时,传递的参数需要有规律
代码语言:javascript
复制
   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

二:登录验证

代码语言:javascript
复制
/**
 * @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

例如:

代码语言:javascript
复制
select * from user where userName="" and passward="";

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

这时SQL就变成了

代码语言:javascript
复制
select * from user where userName="" or 1=1# and passward=""

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

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

啥是XSS攻击?

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

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

代码语言:javascript
复制
@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()
{

    }

}
代码语言:javascript
复制
上层父类就是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);
    }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 赵KK日常技术记录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
脆弱性检测服务
脆弱性检测服务(Vulnerability detection Service,VDS)在理解客户实际需求的情况下,制定符合企业规模的漏洞扫描方案。通过漏洞扫描器对客户指定的计算机系统、网络组件、应用程序进行全面的漏洞检测服务,由腾讯云安全专家对扫描结果进行解读,为您提供专业的漏洞修复建议和指导服务,有效地降低企业资产安全风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档