shiro安全框架扩展教程--基本行级数据安全控制

本文涉及的产品
数据安全中心,免费版
简介:          大家都知道shiro方法级,请求级保障是不错的,但是对于对于具体的行级数据安全控制是比较无力的,但是我们总是需要用一些手段来保证数据级的安全,举个比较简单的说明,有合法登...

         大家都知道shiro方法级,请求级保障是不错的,但是对于对于具体的行级数据安全控制是比较无力的,但是我们总是需要用一些手段来保证数据级的安全,举个比较简单的说明,

有合法登录A和B用户,A用户通过方法findById=A可以加载出自己的信息并修改密码,这个时候用户B可以通过findById=A也可以加载出A的信息,这样简单的入侵方式比较简单,

只要使用编辑器改动下表单的提交值即可,如果严谨是没事的,但是总有那么一些人不会那么严谨,所以经常都是通过id直出直入查询到数据,导致用户资料泄漏被修改,

那么问题来了,我们该如何防止这样的低级攻击呢?


下面我提供一个比较简单的方案,希望抛砖引玉,如果有更好的方案请分享出来,互相学习


一般来说,我们更新,删除或者查询单个记录都是需要一个唯一键,例如id?别人可以编辑这个id的值获取其他记录的信息,这个时候我们可以加一个认证值给请求路径,防止只修改了id

即可认为是合法请求


下面上些代码


<a href="#" onclick="removeById('/cms/user/removeById.do?id=${v.id}&rsv_=<@key id="${v.id}" />');return false;" style="cursor: pointer;">删除</a>

看到后面删除的参数有一个rsv_,这个是认证值,如果单独修改id的值,但是没有修改出相应的rsv_值那是认为是非法请求,因为id和rsv_是配套,通过一定算法出来的关联


而这里我的<@key id="${v.id}" /> 这个是我自定义的freemarker标签,相信看过前面的文章也知道该如何配置使用,下面我展示下生成的rsv_标签类


package com.silvery.core.freemarker;

import java.io.IOException;
import java.util.Map;

import com.silvery.utils.ShortLinkUtils;

import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;

/**
 * 
 * FreeMarker自定义标签,生成编号认证
 * 
 * @author shadow
 * 
 */
public class KeyTag implements TemplateDirectiveModel {

	@SuppressWarnings("unchecked")
	public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody directiveBody)
			throws TemplateException, IOException {

		Object id = params.get("id");
		validate(id, null);

		env.getOut().write(ShortLinkUtils.getSingleLink(id.toString()));

	}

	private void validate(Object id, Object body) throws TemplateException {
		if (id == null || id.toString().trim().equals("")) {
			throw new TemplateException("参数[id]不能为空", null);
		}
	}

}

然后看我们的请求拦截器,如何判断是否合法请求


package com.silvery.core.spring.handler;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.silvery.utils.ShortLinkUtils;

public class SystemHandler implements HandlerInterceptor {

	private final static Logger log = LoggerFactory.getLogger(SystemHandler.class);

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e)
			throws Exception {
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView view)
			throws Exception {
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
		return validateSafeRequest(request, response, obj);
	}

	/** 防止擅改数据提交 */
	private boolean validateSafeRequest(HttpServletRequest request, HttpServletResponse response, Object obj) {
		String newObj = request.getParameter("id");
		if (!isNull(newObj)) {
			String newToken = request.getParameter("rsv_");
			if (!isNull(newToken)) {
				if (ShortLinkUtils.getSingleLink(newObj).equals(newToken)) {
					return true;
				}
			}
			log.error(new StringBuffer().append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).append(
					" [").append(obj).append("] ").append(" appear insecure request ").toString());
			return false;
		}
		return true;
	}

	private boolean isNull(String s) {
		if (s == null || s.length() <= 0) {
			return true;
		}
		return false;
	}

}

这是spring-mvc的拦截器,当然你也可以用普通的filter,原理是一样的


大概流程就是这样,相信大家都能理解,比较简单,比较实用,请随意喷,最多我去蓝翔再深造下回来咯...

目录
相关文章
|
2月前
|
Kubernetes 安全 Cloud Native
解锁安全新纪元:利用服务网格Istio,打造全链路mTLS加密隧道,从入口网关到出口网关,守护数据安全的每一步
【8月更文挑战第2天】随着云原生技术的发展,服务网格(Service Mesh)如Istio已成为微服务架构的核心,通过双向TLS(mTLS)确保通信安全。首先,在Kubernetes部署Istio以管理服务通信。接着,配置入口网关实现所有入向流量的加密处理,防止数据泄露。最后,通过配置Sidecar代理如Envoy,确保服务网格安全访问外部mTLS服务,从而构建起全链路的数据安全防护。
60 11
|
3月前
|
存储 安全 数据安全/隐私保护
🔎Android安全攻防实战!守护你的应用数据安全,让用户放心使用!🛡️
【7月更文挑战第28天】在移动应用盛行的时代,确保Android应用安全性至关重要。本文以问答形式探讨了主要安全威胁(如逆向工程、数据窃取)及其对策。建议使用代码混淆、签名验证、数据加密等技术来增强应用保护。此外,还推荐了加密API、HTTPS通信、代码审计等措施来进一步加强安全性。综上所述,全面的安全策略对于构建安全可靠的应用环境必不可少。#Android #应用安全 #代码混淆 #数据加密
55 3
|
3月前
|
SQL 存储 安全
SQL安全深度剖析:守护数据安全的坚固防线
展望未来,随着技术的不断进步和攻击手段的不断翻新,SQL安全将面临更多的挑战。因此,我们需要持续关注SQL安全领域的最新动态和技术发展,并不断更新和完善我们的防护措施。同时,加强国际合作与信息共享也是提升全球SQL安全性的重要途径。让我们共同努力,为构建一个更加安全、可靠的数字化环境而奋斗。
|
4月前
|
存储 安全 网络安全
APP 安全评估报告:直面移动应用安全威胁,守护用户数据安全
移动APP安全问题日益严重,包括数据泄露、恶意软件和权限滥用等威胁。例如,Ring App安全漏洞导致用户信息曝光,13款Android应用暴露大量用户数据。此外,工信部通报50款APP违规收集个人信息。安全评估是保障APP安全的关键,涉及代码安全、数据传输安全、用户权限管理和隐私保护等方面。经过评估,这款APP在所有方面表现出色,符合最高安全标准,确保用户隐私和数据安全。
157 2
|
5月前
|
SQL 安全 数据库
安全编码:守护数据安全
安全编码:守护数据安全
|
5月前
|
存储 安全 算法
【专栏】保护数据安全的重要性以及安全加密算法在数据保护中的应用
【4月更文挑战第27天】在数字化时代,数据安全至关重要,关系到个人隐私、企业商业机密、国家安全及经济发展。安全加密算法(如对称加密、非对称加密和哈希算法)在保护数据方面发挥关键作用。它们应用于电子商务、金融、物联网、云存储和数字签名等领域,确保信息传输和存储的安全。面对日益复杂的挑战,我们需要持续研究和应用加密技术,提高数据安全意识,共同维护数字世界的繁荣与安全。
147 2
|
5月前
|
存储 安全 算法
保护数据安全的重要性:安全加密算法在数据保护中的应用
在数字时代,数据的安全性越来越受到重视。本文将探讨安全加密算法作为一种关键的数据保护手段的重要性和应用。通过分析现有的加密算法和其在数据保护中的角色,我们可以更好地理解如何保护数据免受黑客攻击和隐私泄露。
|
安全 数据处理 数据安全/隐私保护
数据安全最佳实践(7):通过多级安全分类构建业务安全体系【Dataphin V3.11】
在DataphinV3.11版本中,我们支持了构建多级安全分类体系的能力,用于支持客户定制和使用行业化的数据分类分级体系。 同时我们支持了识别特征的管理,可以使用内置的手机、姓名等识别特征;也在安全模型中内置了通用行业模型,便于客户直接应用,实现对大部分个人敏感数据和部分业务数据的识别和保护。
933 1
|
安全 关系型数据库 MySQL
MySQL安全与权限管理:保障数据安全与访问控制
本文深入探讨了MySQL数据库的安全与权限管理,通过详细的代码示例,介绍了用户与权限的概念,权限管理与访问控制的方法,以及数据库安全性策略的制定与实施。MySQL提供了强大的安全性功能,能够帮助管理员保护数据库的数据安全和限制用户的访问权限。了解如何创建用户、授予权限,以及如何制定数据库安全性策略,将使管理员能够有效地管理和保护数据库,降低潜在的安全风险。
1243 0
|
安全 数据安全/隐私保护
阿里云产品体系分为6大分类——安全——安全的6种模块——数据安全
阿里云产品体系分为6大分类——安全——安全的6种模块——数据安全自制脑图
124 1
下一篇
无影云桌面