热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请问将全局配置放在application作用域中安全吗?

如题,最近在研究微信公众号开发,我搭建了一个项目,然后在服务器启动时把appidappsecret这类比较敏感的信息加载到application中了,如下:packagetest.weix
如题,最近在研究微信公众号开发,我搭建了一个项目,然后在服务器启动时把appid appsecret这类比较敏感的信息加载到application中了,如下:

package test.weixin.common.frame;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.ServletContextAware;

import test.weixin.common.entity.Config;
import test.weixin.common.entity.ConfigExample;
import test.weixin.common.mapper.ConfigMapper;
import test.weixin.common.util.Constants;

public class SystemInit implements InitializingBean, ServletContextAware, ServletContextListener {

private static final Logger logger = LoggerFactory.getLogger(SystemInit.class);

@Autowired
private ConfigMapper configMapper;

/**
 * 把数据库中查到的所有config加载到application中
 */
@Override
public void setServletContext(ServletContext application) {
logger.info("开始加载配置...");
List configList = configMapper.selectByExample(new ConfigExample());
Map map = new HashMap();
for (Config config : configList) {
logger.info(config.getConfigCode() + " -----> " + config.getConfigValue());
map.put(config.getConfigCode(), config.getConfigValue());
}
application.setAttribute(Constants.Application.CONFIG, map);
logger.info("加载配置完成");
}

/**
 * 启动进程
 */
@Override
public void contextInitialized(ServletContextEvent arg0) {
logger.info("开始定时获取access_token...");
TokenThread tokenThread = new TokenThread();
tokenThread.start();
}

@Override
public void afterPropertiesSet() throws Exception {}

@Override
public void contextDestroyed(ServletContextEvent arg0) {}

}



请问这样做安全性如何?如果我不在jsp页面上展示这些信息的话,用户是不是获取不到?


另外还有个问题:像这样加载全局配置的步骤,目前的主流方法是怎么做?是把这些信息储存在一个static的变量中?还是像我这样存在application中?

12 个解决方案

#1


我觉得放在哪不是最 主要的,最主要的是你要加密啊。。。

#2


引用 1 楼 zc881124 的回复:
我觉得放在哪不是最 主要的,最主要的是你要加密啊。。。

你的意思是“不加密就保存,放在哪里都不安全”?

#3


引用 1 楼 zc881124 的回复:
我觉得放在哪不是最 主要的,最主要的是你要加密啊。。。

黑客直接入侵服务器的情况先不谈,我想问的是:application会不会被用户的浏览器直接获取到?如果你不在jsp页里写<%= application.getAttribute(""); %>类似的东西的话

#4


先不说安不安全的问题,是不好,像 Session 正经开发的时候,都不常用到,因为服务器内存是有限的,如果真的有很多东西要存在 Session 中,也会重写 Session ,不会选择放在内存里,会选择放在 Memcached 或者其它非关系型数据库中。
Application 是全局共享的,也是存储在内存里,你可以认为所有人都能访问 application 存放的东西,它比 Session 范围更大。如果 Application 里存放的变量无上限,那这种做法是很致命的,会且一定会在某一个时刻让你的系统爆掉。
这就是不谈黑客入侵,单纯只说使用这个的局限性。
以上

#5


还有你说的用户浏览器直接获取到的什么鬼。 不会!
浏览器是有标准的,它不负责解析你的模板,你的模板始终是你服务器解析,浏览器只负责,而且仅仅负责解析你的 Html 代码。所以你服务器返回给浏览器的,只能是 Html 代码。你所用到的 JSP 是模板引擎,它的作用是将你的 JSP 动态代码,转换成 Html 返回给客户端,也就是浏览器。

#6


引用 5 楼 javaloverkehui 的回复:
还有你说的用户浏览器直接获取到的什么鬼。 不会!
浏览器是有标准的,它不负责解析你的模板,你的模板始终是你服务器解析,浏览器只负责,而且仅仅负责解析你的 Html 代码。所以你服务器返回给浏览器的,只能是 Html 代码。你所用到的 JSP 是模板引擎,它的作用是将你的 JSP 动态代码,转换成 Html 返回给客户端,也就是浏览器。

#7


/没有安全不全,那要看你的数据发挥什么养的作用了》》》》》page:当前页面,也就是只要跳到别的页面就失效了
request:一次会话,简单的理解就是一次请求范围内有效
session:浏览器进程,只要当前页面没有被关闭(没有被程序强制清除),不管怎么跳转都是有效的
application:服务器,只要服务器没有重启(没有被程序强制清除),数据就有效

#8


引用 4 楼 javaloverkehui 的回复:
先不说安不安全的问题,是不好,像 Session 正经开发的时候,都不常用到,因为服务器内存是有限的,如果真的有很多东西要存在 Session 中,也会重写 Session ,不会选择放在内存里,会选择放在 Memcached 或者其它非关系型数据库中。
Application 是全局共享的,也是存储在内存里,你可以认为所有人都能访问 application 存放的东西,它比 Session 范围更大。如果 Application 里存放的变量无上限,那这种做法是很致命的,会且一定会在某一个时刻让你的系统爆掉。
这就是不谈黑客入侵,单纯只说使用这个的局限性。
以上

那我在application中只储存一些简单的配置,可以吗?比如微信公众平台的appid和secret等,就是把application当成一个配置文件用

#9


引用 5 楼 javaloverkehui 的回复:
还有你说的用户浏览器直接获取到的什么鬼。 不会!
浏览器是有标准的,它不负责解析你的模板,你的模板始终是你服务器解析,浏览器只负责,而且仅仅负责解析你的 Html 代码。所以你服务器返回给浏览器的,只能是 Html 代码。你所用到的 JSP 是模板引擎,它的作用是将你的 JSP 动态代码,转换成 Html 返回给客户端,也就是浏览器。

为啥我会有这个疑问,因为在后台application对象可以由request获取,我知道浏览器不会解析jsp模板,但我担心服务器会不会把application的信息放在response中之类的。

#10


引用 4 楼 javaloverkehui 的回复:
先不说安不安全的问题,是不好,像 Session 正经开发的时候,都不常用到,因为服务器内存是有限的,如果真的有很多东西要存在 Session 中,也会重写 Session ,不会选择放在内存里,会选择放在 Memcached 或者其它非关系型数据库中。
Application 是全局共享的,也是存储在内存里,你可以认为所有人都能访问 application 存放的东西,它比 Session 范围更大。如果 Application 里存放的变量无上限,那这种做法是很致命的,会且一定会在某一个时刻让你的系统爆掉。
这就是不谈黑客入侵,单纯只说使用这个的局限性。
以上

还想请教一个问题:正经开发的时候,全局的配置一般会加载到哪里?放在某一个类的static变量中吗?

#11


引用 10 楼 Mikuru_Beam 的回复:
Quote: 引用 4 楼 javaloverkehui 的回复:

先不说安不安全的问题,是不好,像 Session 正经开发的时候,都不常用到,因为服务器内存是有限的,如果真的有很多东西要存在 Session 中,也会重写 Session ,不会选择放在内存里,会选择放在 Memcached 或者其它非关系型数据库中。
Application 是全局共享的,也是存储在内存里,你可以认为所有人都能访问 application 存放的东西,它比 Session 范围更大。如果 Application 里存放的变量无上限,那这种做法是很致命的,会且一定会在某一个时刻让你的系统爆掉。
这就是不谈黑客入侵,单纯只说使用这个的局限性。
以上

还想请教一个问题:正经开发的时候,全局的配置一般会加载到哪里?放在某一个类的static变量中吗?

放哪里都可以,比如弄一个 properties 加载进 spring 的容器中。比如你说的静态对象声明。但是不会往 application 里放,很奇怪,没这么做过,也不会这么做,至于原因,一时说不上来,很别扭,通常有这样不舒服的感觉,就不会这么做,相信大多数人也不会这么做。

#12


引用 9 楼 Mikuru_Beam 的回复:
Quote: 引用 5 楼 javaloverkehui 的回复:

还有你说的用户浏览器直接获取到的什么鬼。 不会!
浏览器是有标准的,它不负责解析你的模板,你的模板始终是你服务器解析,浏览器只负责,而且仅仅负责解析你的 Html 代码。所以你服务器返回给浏览器的,只能是 Html 代码。你所用到的 JSP 是模板引擎,它的作用是将你的 JSP 动态代码,转换成 Html 返回给客户端,也就是浏览器。

为啥我会有这个疑问,因为在后台application对象可以由request获取,我知道浏览器不会解析jsp模板,但我担心服务器会不会把application的信息放在response中之类的。

打开 firefox, firebug ,网络,访问一个链接,你看看 response 里有什么

推荐阅读
author-avatar
chen-yu2502881617
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有