用户登录-访问权限+登录验证+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()
{
}
}
上层父类就是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);
}
}
你的压力来源于你无法自律。
- 点赞
- 收藏
- 关注作者
评论(0)