报表单独部署时跨应用访问报表安全控制
2016-11-28 17:36
204 查看
润乾报表与用户的系统集成,一般有两种方案。一是集成到用户系统中。二是将润乾单独部署到一个应用下。
两种方案各有利弊:第一种方案对于安全性等方面可以统一管理,但是报表本身如果数据量大并发大造成的压力会直接影响用户自己的系统。第二种方案在报表服务器承受压力过大数据量过大的时候,不会影响到用户本身的系统,也就是说就算报表服务器压力饱和进入等待状态,用户的系统也可以正常的使用,众所周知润乾报表的调用一般直接通过url的方式进行调用,那么第二种方案中的url就无法被用户系统所控制,造成了一定的安全隐患。
下面就介绍几种解决此类问题的方案之中的一种:通过ip在过滤器中判断权限。
案例场景:
通过用户系统访问一张报表时,当然会带着一些用户信息或是其他参数传递过来。如果这时这个url被其他人复制或者记住,拿到其他客户机上直接访问,由于采用的是第二种方案,用户系统并不能控制,就会导致信息的泄漏。
解决思路:
这时我们可以采取从用户系统获取客户端ip然后拼成访问报表的参数,传递到报表服务器,然后在报表服务器中对该ip是否有权限打开这张报表进行判断,如果有权限继续访问,如果没有权限跳转到错误页面或者用户登陆页面等。
实现方法:
一、首先搭建报表服务器,这里以润乾自带demo为例。
正常访问报表url为:http://127.0.0.1:6001/demo/reportJsp/showReport.jsp?raq=test.raq
这个url就当做用户系统请求一张报表的url,这时可以在这个url后加上登录用户系统的ip,假设用户以192.168.0.58这个ip登陆的,那么url为:http://127.0.0.1:6001/demo/reportJsp/showReport.jsp?raq=test.raq&ipValue=192.168.0.58
二、写一个filter
在doFilter中获取url中带的的参数以及客户端的ip,然后进行比较
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// 过滤器获取客户端IP地址
String ip = ((HttpServletRequest) request).getHeader(“x-forwarded-for”);
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader(“Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader(“WL-Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader(“HTTP_CLIENT_IP”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request)
.getHeader(“HTTP_X_FORWARDED_FOR”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 根据获取的客户端IP,进行判断,返回相关结果为isValid=true
boolean isValid = false;
String ipValue = request.getParameter(“ipValue”);
if (ip.equals(ipValue)) {// 自行增加条件
isValid = true;
}
// 如果满足条件允许登录,否则调准
if (isValid) {
request.setCharacterEncoding(“GBK”);
filterChain.doFilter(request, response);
} else {
request.setCharacterEncoding(“GBK”);
// 定向到Error页面,或者指定跳到登录界面
request.getRequestDispatcher(“/reportJsp/iperror.jsp”).forward(
request, response);
}
}
三、在web.xml中加入filter配置
<filter>
<filter-name>IpFilter</filter-name>
<filter-class>com.runqian.filter.IpFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>IpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后重启服务,如果将url拷贝到其他ip的客户端访问,救活跳转到相应的错误页面
两种方案各有利弊:第一种方案对于安全性等方面可以统一管理,但是报表本身如果数据量大并发大造成的压力会直接影响用户自己的系统。第二种方案在报表服务器承受压力过大数据量过大的时候,不会影响到用户本身的系统,也就是说就算报表服务器压力饱和进入等待状态,用户的系统也可以正常的使用,众所周知润乾报表的调用一般直接通过url的方式进行调用,那么第二种方案中的url就无法被用户系统所控制,造成了一定的安全隐患。
下面就介绍几种解决此类问题的方案之中的一种:通过ip在过滤器中判断权限。
案例场景:
通过用户系统访问一张报表时,当然会带着一些用户信息或是其他参数传递过来。如果这时这个url被其他人复制或者记住,拿到其他客户机上直接访问,由于采用的是第二种方案,用户系统并不能控制,就会导致信息的泄漏。
解决思路:
这时我们可以采取从用户系统获取客户端ip然后拼成访问报表的参数,传递到报表服务器,然后在报表服务器中对该ip是否有权限打开这张报表进行判断,如果有权限继续访问,如果没有权限跳转到错误页面或者用户登陆页面等。
实现方法:
一、首先搭建报表服务器,这里以润乾自带demo为例。
正常访问报表url为:http://127.0.0.1:6001/demo/reportJsp/showReport.jsp?raq=test.raq
这个url就当做用户系统请求一张报表的url,这时可以在这个url后加上登录用户系统的ip,假设用户以192.168.0.58这个ip登陆的,那么url为:http://127.0.0.1:6001/demo/reportJsp/showReport.jsp?raq=test.raq&ipValue=192.168.0.58
二、写一个filter
在doFilter中获取url中带的的参数以及客户端的ip,然后进行比较
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// 过滤器获取客户端IP地址
String ip = ((HttpServletRequest) request).getHeader(“x-forwarded-for”);
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader(“Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader(“WL-Proxy-Client-IP”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request).getHeader(“HTTP_CLIENT_IP”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = ((HttpServletRequest) request)
.getHeader(“HTTP_X_FORWARDED_FOR”);
}
if (ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
// 根据获取的客户端IP,进行判断,返回相关结果为isValid=true
boolean isValid = false;
String ipValue = request.getParameter(“ipValue”);
if (ip.equals(ipValue)) {// 自行增加条件
isValid = true;
}
// 如果满足条件允许登录,否则调准
if (isValid) {
request.setCharacterEncoding(“GBK”);
filterChain.doFilter(request, response);
} else {
request.setCharacterEncoding(“GBK”);
// 定向到Error页面,或者指定跳到登录界面
request.getRequestDispatcher(“/reportJsp/iperror.jsp”).forward(
request, response);
}
}
三、在web.xml中加入filter配置
<filter>
<filter-name>IpFilter</filter-name>
<filter-class>com.runqian.filter.IpFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>IpFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后重启服务,如果将url拷贝到其他ip的客户端访问,救活跳转到相应的错误页面
相关文章推荐
- 润乾报表单独部署url安全之加解密函数
- 润乾报表单独部署url安全之加解密函数
- 数据库应用安全:如何平衡加密与访问控制
- spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架
- 数据库应用安全:如何平衡加密与访问控制
- 润乾报表单独部署url安全之加解密
- weblogic部署应用,访问控制台就报内存溢出
- 网络访问控制的分布式部署与应用
- Linux网关及安全应用之(5)漏洞检测和远程访问控制
- Cisco路由器访问控制的安全配置
- [水晶报表]RECORDNUMBER应用之控制每页显示行数及隔行换色.
- 路由器访问控制的安全配置
- 网络安全之身份认证和访问控制实现原理(ZZ)
- 基于角色、标记及BLP模型的多级访问控制-B/S架构OA系统应用
- 内网服务应用―无需端口映射实现从外网访问控制内网电脑
- 用web.xml控制Web应用的行为( 限制对Web资源的访问)
- Weblogic9部署好修改自已的应用为默认访问页面
- 内网服务应用—实现从外网访问控制内网电脑
- 用网络访问控制(NAC)解决网络安全问题