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

举报
赵KK日常技术记录 发表于 2023/06/30 11:32:42 2023/06/30
【摘要】 在系统登录时,除了正常的用户名密码验证之外,需要做登录后的访问权限,登录验证,以及输入字符验证,有些非权限页面可以无权限访问,比如帮助页面,版本信息等,有些需要会员才可见的页面,需要权限分配,有些需要登录后才可访问,比如京东的购物车下单需要强制登录,且所有的输入框都应做特殊字符验证。写公众号有啥好处么?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(){
    }
}
上层父类就是HttpRequestpublic 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个月内不可修改。