用户登录-访问权限+登录验证+xss过滤
在系统登录时,除了正常的用户名密码验证之外,需要做登录后的访问权限,登录验证,以及输入字符验证,有些非权限页面可以无权限访问,比如帮助页面,版本信息等,有些需要会员才可见的页面,需要权限分配,有些需要登录后才可访问,比如京东的购物车下单需要强制登录,且所有的输入框都应做特殊字符验证。
写公众号有啥好处么?
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); }}
你的压力来源于你无法自律。
- 点赞
- 收藏
- 关注作者
评论(0)