qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          JVM調優總結:一些概念

          數據類型

            Java虛擬機中,數據類型可以分為兩類:基本類型和引用類型。基本類型的變量保存原始值,即:他代表的值就是數值本身;而引用類型的變量保存引用值。“引用值”代表了某個對象的引用,而不是對象本身,對象本身存放在這個引用值所表示的地址的位置。

            基本類型包括:byte,short,int,long,char,float,double,Boolean,returnAddress

            引用類型包括:類類型,接口類型和數組。

            堆與棧

            堆和棧是程序運行的關鍵,很有必要把他們的關系說清楚。

            棧是運行時的單位,而堆是存儲的單位。

            棧解決程序的運行問題,即程序如何執行,或者說如何處理數據;堆解決的是數據存儲的問題,即數據怎么放、放在哪兒。

            在Java中一個線程就會相應有一個線程棧與之對應,這點很容易理解,因為不同的線程執行邏輯有所不同,因此需要一個獨立的線程棧。而堆則是所有線程共享的。棧因為是運行單位,因此里面存儲的信息都是跟當前線程(或程序)相關信息的。包括局部變量、程序運行狀態、方法返回值等等;而堆只負責存儲對象信息。

            為什么要把堆和棧區分出來呢?棧中不是也可以存儲數據嗎?

            第一,從軟件設計的角度看,棧代表了處理邏輯,而堆代表了數據。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模塊化的思想在軟件設計的方方面面都有體現。

            第二,堆與棧的分離,使得堆中的內容可以被多個棧共享(也可以理解為多個線程訪問同一個對象)。這種共享的收益是很多的。一方面這種共享提供了一種有效的數據交互方式(如:共享內存),另一方面,堆中的共享常量和緩存可以被所有棧訪問,節省了空間。

            第三,棧因為運行時的需要,比如保存系統運行的上下文,需要進行地址段的劃分。由于棧只能向上增長,因此就會限制住棧存儲內容的能力。而堆不同,堆中的對象是可以根據需要動態增長的,因此棧和堆的拆分,使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。

            第四,面向對象就是堆和棧的完美結合。其實,面向對象方式的程序與以前結構化的程序在執行上沒有任何區別。但是,面向對象的引入,使得對待問題的思考方式發生了改變,而更接近于自然方式的思考。當我們把對象拆開,你會發現,對象的屬性其實就是數據,存放在堆中;而對象的行為(方法),就是運行邏輯,放在棧中。我們在編寫對象的時候,其實即編寫了數據結構,也編寫的處理數據的邏輯。不得不承認,面向對象的設計,確實很美。

          在Java中,Main函數就是棧的起始點,也是程序的起始點。

            程序要運行總是有一個起點的。同C語言一樣,java中的Main就是那個起點。無論什么java程序,找到main就找到了程序執行的入口:)

            堆中存什么?棧中存什么?

            堆中存的是對象。棧中存的是基本數據類型和堆中對象的引用。一個對象的大小是不可估計的,或者說是可以動態變化的,但是在棧中,一個對象只對應了一個4btye的引用(堆棧分離的好處:))。

            為什么不把基本類型放堆中呢?因為其占用的空間一般是1~8個字節——需要空間比較少,而且因為是基本類型,所以不會出現動態增長的情況——長度固定,因此棧中存儲就夠了,如果把他存在堆中是沒有什么意義的(還會浪費空間,后面說明)。可以這么說,基本類型和對象的引用都是存放在棧中,而且都是幾個字節的一個數,因此在程序運行時,他們的處理方式是統一的。但是基本類型、對象引用和對象本身就有所區別了,因為一個是棧中的數據一個是堆中的數據。最常見的一個問題就是,Java中參數傳遞時的問題。

            Java中的參數傳遞時傳值呢?還是傳引用?

            要說明這個問題,先要明確兩點:

            1、不要試圖與C進行類比,Java中沒有指針的概念

            2、程序運行永遠都是在棧中進行的,因而參數傳遞時,只存在傳遞基本類型和對象引用的問題。不會直接傳對象本身。

            明確以上兩點后。Java在方法調用傳遞參數時,因為沒有指針,所以它都是進行傳值調用(這點可以參考C的傳值調用)。因此,很多書里面都說Java是進行傳值調用,這點沒有問題,而且也簡化的C中復雜性。

            但是傳引用的錯覺是如何造成的呢?在運行棧中,基本類型和引用的處理是一樣的,都是傳值,所以,如果是傳引用的方法調用,也同時可以理解為“傳引用值”的傳值調用,即引用的處理跟基本類型是完全一樣的。但是當進入被調用方法時,被傳遞的這個引用的值,被程序解釋(或者查找)到堆中的對象,這個時候才對應到真正的對象。如果此時進行修改,修改的是引用對應的對象,而不是引用本身,即:修改的是堆中的數據。所以這個修改是可以保持的了。

            對象,從某種意義上說,是由基本類型組成的。可以把一個對象看作為一棵樹,對象的屬性如果還是對象,則還是一顆樹(即非葉子節點),基本類型則為樹的葉子節點。程序參數傳遞時,被傳遞的值本身都是不能進行修改的,但是,如果這個值是一個非葉子節點(即一個對象引用),則可以修改這個節點下面的所有內容。

            堆和棧中,棧是程序運行最根本的東西。程序運行可以沒有堆,但是不能沒有棧。而堆是為棧進行數據存儲服務,說白了堆就是一塊共享的內存。不過,正是因為堆和棧的分離的思想,才使得Java的垃圾回收成為可能。

            Java中,棧的大小通過-Xss來設置,當棧中存儲數據比較多時,需要適當調大這個值,否則會出現java.lang.StackOverflowError異常。常見的出現這個異常的是無法返回的遞歸,因為此時棧中保存的信息都是方法返回的記錄點。

            Java對象的大小

            基本數據的類型的大小是固定的,這里就不多說了。對于非基本類型的Java對象,其大小就值得商榷。

            在Java中,一個空Object對象的大小是8byte,這個大小只是保存堆中一個沒有任何屬性的對象的大小。看下面語句:

            Object ob = new Object();

            這樣在程序中完成了一個Java對象的生命,但是它所占的空間為:4byte+8byte。4byte是上面部分所說的Java棧中保存引用的所需要的空間。而那8byte則是Java堆中對象的信息。因為所有的Java非基本類型的對象都需要默認繼承Object對象,因此不論什么樣的Java對象,其大小都必須是大于8byte。

           有了Object對象的大小,我們就可以計算其他對象的大小了。

          1. Class NewObject {  
          2.    int count;  
          3.    boolean flag;  
          4.    Object ob;  
          5.    }  
          6. //其大小為:空對象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。
          7. 但是因為Java在對對象內存分配時都是以8的整數倍來分,因此大于17byte的最接近8的整數倍的是24,因此此對象的大
          8. 小為24byte。

            這里需要注意一下基本類型的包裝類型的大小。因為這種包裝類型已經成為對象了,因此需要把他們作為對象來看待。包裝類型的大小至少是12byte(聲明一個空Object至少需要的空間),而且12byte沒有包含任何有效信息,同時,因為Java對象大小是8的整數倍,因此一個基本類型包裝類的大小至少是16byte。這個內存占用是很恐怖的,它是使用基本類型的N倍(N>2),有些類型的內存占用更是夸張(隨便想下就知道了)。因此,可能的話應盡量少使用包裝類。在JDK5.0以后,因為加入了自動類型裝換,因此,Java虛擬機會在存儲方面進行相應的優化。

            引用類型

            對象引用類型分為強引用、軟引用、弱引用和虛引用。

            強引用:就是我們一般聲明對象是時虛擬機生成的引用,強引用環境下,垃圾回收時需要嚴格判斷當前對象是否被強引用,如果被強引用,則不會被垃圾回收

            軟引用:軟引用一般被做為緩存來使用。與強引用的區別是,軟引用在垃圾回收時,虛擬機會根據當前系統的剩余內存來決定是否對軟引用進行回收。如果剩余內存比較緊張,則虛擬機會回收軟引用所引用的空間;如果剩余內存相對富裕,則不會進行回收。換句話說,虛擬機在發生OutOfMemory時,肯定是沒有軟引用存在的。

            弱引用:弱引用與軟引用類似,都是作為緩存來使用。但與軟引用不同,弱引用在進行垃圾回收時,是一定會被回收掉的,因此其生命周期只存在于一個垃圾回收周期內。

            強引用不用說,我們系統一般在使用時都是用的強引用。而“軟引用”和“弱引用”比較少見。他們一般被作為緩存使用,而且一般是在內存大小比較受限的情況下做為緩存。因為如果內存足夠大的話,可以直接使用強引用作為緩存即可,同時可控性更高。因而,他們常見的是被使用在桌面應用系統的緩存。


          posted @ 2012-01-11 13:46 順其自然EVO 閱讀(159) | 評論 (0)編輯 收藏

          Java網絡編程菜鳥進階:TCP和套接字入門

               摘要: 我竟然到現在才發現《Fundamental Networking in Java》這本神作,真有點無地自容的感覺。最近幾年做的都是所謂的企業級開發,免不了和網絡打交道,但在實際工作中,往往會采用框架將底層細節和上層應用隔離開,感覺就像是在一個 Word 模板表單里面填寫內容,做出來也沒什么成就感。雖然沒有不使用框架的理由,但我還真是有點懷念當初直接用套接字做網絡編程的日子,既能掌控更多東西,還可以...  閱讀全文

          posted @ 2012-01-10 16:06 順其自然EVO 閱讀(881) | 評論 (0)編輯 收藏

          PHP開發者常犯的10個MySQL錯誤

           數據庫是Web大多數應用開發的基礎。如果你是用PHP,那么大多數據庫用的是MYSQL也是LAMP架構的重要部分。

            PHP看起來很簡單,一個初學者也可以幾個小時內就能開始寫函數了。但是建立一個穩定、可靠的數據庫確需要時間和經驗。下面就是一些這樣的經驗,不僅僅是MYSQL,其他數據庫也一樣可以參考。

            1、使用MyISAM而不是InnoDB

            MySQL有很多的數據庫引擎,單一般也就用MyISAM和InnoDB。

            MyISAM 是默認使用的。但是除非你是建立一個非常簡單的數據庫或者只是實驗性的,那么到大多數時候這個選擇是錯誤的。MyISAM不支持外鍵的約束,這是保證數據完整性的精華所在啊。另外,MyISAM會在添加或者更新數據的時候將整個表鎖住,這在以后的擴展性能上會有很大的問題。

            解決辦法很簡單:使用InnoDB。

            2、使用PHP的mysql方法

            PHP從一開始就提供了MySQL的函數庫。很多程序都依賴于mysql_connect、mysql_query、mysql_fetch_assoc等等,但是PHP手冊中建議:

            如果你使用的MySQL版本在4.1.3之后,那么強烈建議使用mysqli擴展。

            mysqli,或者說MySQL的高級擴展,有一些優點:

            有面向對象的接口

            prepared statements(預處理語句,可以有效防止SQL-注入攻擊,還能提高性能)

            支持多種語句和事務

            另外,如果你想支持多數據庫那么應該考慮一下PDO。

            3、不過濾用戶輸入

            應該是:永遠別相信用戶的輸入。用后端的PHP來校驗過濾每一條輸入的信息,不要相信Javascript。像下面這樣的SQL語句很容易就會被攻擊:

          1. $username = $_POST["name"];  
          2.   $password = $_POST["password"];  
          3.   $sql = "SELECT userid FROM usertable WHERE username='$username'AND password='$password';"; // run query...

            這樣的代碼,如果用戶輸入”admin’;”那么,就相當于下面這條了:

          SELECT userid FROM usertable WHERE username='admin';

            這樣入侵者就能不輸入密碼,就通過admin身份登錄了。

            4、不使用UTF-8

            那些英美國家的用戶,很少考慮語言的問題,這樣就造成很多產品就不能在其他地方通用。還有一些GBK編碼的,也會有很多的麻煩。

            UTF-8解決了很多國際化的問題。雖然PHP6才能比較完美的解決這個問題,但是也不妨礙你將MySQL的字符集設置為UTF-8。

            5、該用SQL的地方使用PHP

            如果你剛接觸MySQL,有時候解決問題的時候可能會先考慮使用你熟悉的語言來解決。這樣就可能造成一些浪費和性能比較差的情況。比如:計算平均值的時候不適用MySQL原生的AVG()方法,而是用PHP將所有值循環一遍然后累加計算平均值。

            另外還要注意SQL查詢中的PHP循環。通常,在取得所有結果之后再用PHP來循環的效率更高。

            一般在處理大量數據的時候使用強有力的數據庫方法,更能提高效率。

            6、不優化查詢

            99%的PHP性能問題都是數據庫造成的,一條糟糕的SQL語句可能讓你的整個程序都非常慢。MySQL的EXPLAIN statement,Query Profiler,many other tools的這些工具可以幫你找出那些調皮的SELECT。

            7、使用錯誤的數據類型

            MySQL提供一系列數字、字符串、時間等的數據類型。如果你想存儲日期,那么就是用DATE或者DATETIME類型,使用整形或者字符串會讓事情更加復雜。

            有時候你想用自己定義的數據類型,例如,使用字符串存儲序列化的PHP對象。數據庫的添加可能很容易,但是這樣的話,MySQL就會變得很笨重,而且以后可能導致一些問題。

            8、在SELECT查詢中使用*

            不要使用*在表中返回所有的字段,這會非常的慢。你只需要取出你需要的數據字段。如果你需要取出所有的字段,那么可能你的表需要更改了。

            9、索引不足或者過度索引

            一般來說,應該索引出現在SELECT語句中WHERE后面所有的字段。

            例如,假如我們的用戶表有一個數字的ID(主鍵)和email地址。登錄之后,MySQL應該通過email找到相應的ID。通過索引,MySQL可以通過搜索算法很快的定位email。如果沒有索引,MySQL就需要檢查每一項記錄直到找到。

            這樣的話,你可能想給每一個字段都添加索引,但是這樣做的后果就是在你更新或者添加的時候,索引就會重新做一遍,當數據量大的時候,就會有性能問題。所以,只在需要的字段做索引。

            10、不備份

            也許不常發生,但是數據庫損毀,硬盤壞了、服務停止等等,這些都會對數據造成災難性的破壞。所以你一定要確保自動備份數據或者保存副本。

            11、另外:不考慮其他數據庫

            MySQL可能是PHP用的最多的數據庫了,但是也不是唯一的選擇。 PostgreSQL和Firebird也是競爭者,他們都開源,而且不被某些公司所控制。微軟提供SQL Server Express,Oracle有10g Express,這些企業級的也有免費版。SQLite對于一些小型的或者嵌入式應用來說也是不錯的選擇。

          posted @ 2012-01-09 21:03 順其自然EVO 閱讀(147) | 評論 (0)編輯 收藏

          UML中關聯,組合與聚合等關系的辨析

          以前學習面向對象的時候,常聽到介紹對象之間的各種關系,常見的有關聯,組合與聚合。

            關聯:

            關聯是一種最普遍和常見的關系形式。一般是指一個對象可以發消息給另外一個對象。典型的實現情況下指某個對象有一個指針或者引用指向一個實體變量,當通過方法的參數來傳遞或者創建本地變量來訪問這種情況也可以稱之為關聯。

            典型的代碼如下:

          1. class A  
          2. {  
          3.     private B itemB;  
          4. }

            也可能有如下的形式:

          1. class A  
          2. {  
          3.     void test(B b) {...}  
          4. }

            籠統的情況下,一般兩個對象的引用,參數傳遞等形式產生的關系,我們都可以稱之為關聯關系。

            聚合(aggregation):

            聚合表示的是一種has-a的關系,同時,它也是一種整體-部分關系。它的特點在于,它這個部分的生命周期并不由整體來管理。也就是說,當整體這個對象已經不存在的時候,部分的對象還是可能繼續存在的。它的uml圖表示形式如下:

            我們用一個空心的箭頭來表示聚合關系。

            籠統的說聲明周期管理還是比較模糊。我們就以如圖的Person和Address類來進一步的解釋。假設我們要定義這兩個對象,對于每個人來說,他有一個關聯的地址。人和地址的關系是has-a的關系。但是,我們不能說這個地址是這個人的一個組成部分。同時,我們建立地址對象和人的對象是可以相對獨立存在的。

            用代碼來表示的話,典型的代碼樣式如下:

          1. public class Address  
          2. {  
          3. . . .  
          4. }  
          5. public class Person  
          6. {  
          7.      private Address address;  
          8.      public Person(Address address)  
          9.      {  
          10.          this.address = address;  
          11.      }  
          12.      . . .  
          13. }



          我們通常通過如下的方式來使用Person對象:

          1. Address address = new Address();  
          2. Person person = new Person(address);

            或者:

          Person person = new Person( new Address() );

            我們可以看到,我們是創建了一個獨立的Address對象,然后將這個對象傳入了Person的構造函數。當Person對象聲明周期結束的時候,Address對象如果還有其他指向它的引用,是可能繼續存在的。也就是說,他們的聲明周期是相對獨立的。

            組合(Composition):

            當理解了聚合的關系之后,再來看組合的關系就相對來說要好很多。和聚合比起來,組合是一種更加嚴格的has-a關系。它表示一種嚴格的組成關系。以汽車和引擎為例子,引擎是汽車的一個組成部分。他們是一種嚴格的部分組成關系,因此他們的聲明周期也應該是一致的。也就是說引擎的聲明周期是通過汽車對象來管理。

            組合的uml圖表示如下:

            一般用一個實心的箭頭表示組合。

            組合代碼的典型示例如下:

          1. public class Engine  
          2. {  
          3. . . .   
          4. }  
          5.  
          6. public class Car  
          7. {  
          8.     Engine e = new Engine();  
          9.     .......  
          10. }

            Engine對象是在Car對象里面創建的,所以在Car對象生命周期結束的時候,Engine對象的生命周期也同樣結束了。

          posted @ 2012-01-09 21:02 順其自然EVO 閱讀(212) | 評論 (0)編輯 收藏

          JIRAJIRA是集項目計劃、任務分配、需求管理、錯誤跟蹤于一體的商業軟件


          http://wenku.baidu.com/view/43d702600b1c59eef8c7b4fb.html
          http://baike.baidu.com/view/1094245.htm
          http://down.51cto.com/data/241953

          posted @ 2012-01-09 18:33 順其自然EVO 閱讀(158) | 評論 (0)編輯 收藏

          Mssql和Mysql的安全性分析

          Mssql和Mysql的安全性分析

          數據庫是電子商務、金融以及ERP系統的基礎,通常都保存著重要的商業伙伴和客戶信息。大多數企業、組織以及政府部門的電子數據都保存在各種數據庫中,他們用這些數據庫保存一些個人資料,還掌握著敏感的金融數據。但是數據庫通常沒有象操作系統和網絡這樣在安全性上受到重視。數據是企業,組織的命脈所在,因此選擇一款安全的數據庫是至關重要的。大型網站一般使用oracle或DB2,而中小型網站大多數使用更加靈活小巧的mssql數據庫或者mysql數據庫。那么,在同樣的條件下,微軟的mssql和免費的mysql哪個更加安全呢?

            我在我的機子上面用管理員帳號默認安裝了mssql和mysql以便在相同的情況下測試他們的安全性。我的系統配置如下:操作系統Microsoft Windows 2000 Version5.0,安裝了sp4,ftp服務和iis服務,支持asp和php。系統只有一個管理員帳號admin,guest帳號沒有禁用。

            一、系統內部安全性分析

            1、mysql數據庫權限控制問題

            mysql的權限控制是基于mysql這個數據庫的,叫做授權表,一共包括包括六個表columns_priv,db,func,host,tables_priv和user。先使用desc user命令查看非常重要的user表的結構以便查詢內容,現在可以查看他的權限設置了。

            使用命令select host,user,password,delete_priv,update_priv,drop_priv from user;這個命令查看了幾個比較危險的權限,顯示結果如下:

          +-----------+------+------------------+-------------+-------------+-----------+
          | host | user | password | delete_priv | update_priv | drop_priv |
          +-----------+------+------------------+-------------+-------------+-----------+
          | localhost | root |0e4941f53f6fa106 | Y | Y | Y |
          | % | root | | Y | Y | Y |
          | localhost | | | Y | Y | Y |
          | % | | | N | N | N |
          +-----------+------+------------------+-------------+-------------+-----------+
          4 rows in set (0.00 sec)

            第一條表示在本機使用root用密碼登陸,擁有刪除記錄,修改記錄,刪除表等權限,好,這是安全的。第二條表示在任何主機使用root不需密碼登陸,擁有刪除記錄,修改記錄,刪除表等權限。第三條表示在本機匿名登陸,擁有刪除記錄,修改記錄,刪除表等權限。最后條表示可以再任何主機匿名登陸,但是沒有任何權限。

            顯然,第二,三,四都是不安全的!第二條不用說,就第三條而言,就算你在本地是guest權限,但是也可以登陸mysql數據庫,而且擁有全部權限。這樣,就可以對數據庫為所欲為了。

            解決方法:如果你不需要遠程維護,刪除掉第二條,delete from user where host="%" and user="root";或者給它加個強壯的密碼。刪除第三條,delete from user where host="localhost" and user="";

            2、mysql安裝目錄權限問題

            mysql默認安裝到c:/mysql,但是c盤默認是everyone完全控制,由于權限的繼承性,c:/mysql對everyone也是完全控制的,顯然這樣是不安全的。因為惡意用戶可以刪除重要的數據文件。

            解決方法:重新設置mysql目錄的存取權限。或者將mysql安裝到其他目錄,如果你移動Mysql分發到D:/mysql,你就必須使用D:/mysql/bin/mysqld --basedir D:/mysql來啟動mysqld,甚至還需要修改它的配置文件。

            3、mssql數據庫權限控制問題

            mssql數據庫的權限控制是基于master庫的syslogins表,擁有所有權限的帳號是sa,其他還有sysadmin,db_owner等不同權限帳號。但是,mssql數據庫最高權限帳號sa的默認密碼是空,這樣如果安裝的時候不注意,就會給數據帶來毀滅性的災難。惡意攻擊者可以修改,刪除所有數據,更加重要的是mssql帳號可以利用擴展執行系統命令。

            解決方法:定期檢查所有登陸帳號,查看是否有不符合要求的密碼。

            Use master

            Select name,Password from syslogins where password is null命令檢查是否有空口令帳號存在。盡可能的刪除存儲擴展,防止本地用戶利用存儲擴展執行惡意命令。

            use master

            sp_dropextendedproc xp_cmdshell 命令刪除xp_cmdshell擴展。

           4、mssql安裝目錄權限問題

            同mysql一樣,mssql也是安裝到everyone完全控制c盤,由于存取控制問題,最好安裝到d盤等非系統盤進行嚴格的權限控制。而且,由于mssql數據庫與系統結合非常緊密,系統管理員在沒有數據庫密碼的情況下也可以通過選擇windows驗證來操作數據庫。因此,普通用戶有可能通過系統漏洞提升自己的權限,對數據庫進行破壞。

            解決辦法:除了嚴格的存取限制外,還要定期查看SQL Server日志檢查是否有可疑的登錄事件發生,或者使用DOS命令findstr /C:"登錄" d:/Microsoft SQL Server/MSSQL/LOG/*.*。

            mssql的安全是和windows系統安全緊密結合的,任何一個出現漏洞,都會威脅到另一個的安全。

            總結,在系統內部安全性上,mysql和mssql都沒有達到令人滿意的程度,帳號安全,存取權限都控制的不是很好。但是mssql有詳細的日志可以查看登陸情況,比mysql要高出一籌。如果進行了合理的設置,mysql反而要更加安全些,因為對mssql而言,只要有系統權限即可擁有數據庫權限。

            二、外部網絡安全性分析

            1、數據庫服務的探測

            為了安全,可以讓mysql服務運行在內網,但是如果你的機器有外網的接口,mysql也會自動被綁定在外網上面,暴露在internet中,而且系統會在TCP的3306端口監聽,非常容易被端口掃描工具發現,不能保證數據安全。如果默認,mssql則會打開TCP的1433端口監聽。雖然mssql可以人為的改變監聽端口,但是通過微軟未公開的1434端口的UDP探測可以很容易知道SQL Server使用的什么TCP/IP端口了。往UDP1434端口

            發送一個1個字節的內容為02的數據包,被探測的系統則會返回安裝的mssql服務信息,這些信息包括:主機名稱、實例名稱、版本、管道名稱以及使用的端口等。這個端口是微軟自己使用,而且不象默認的1433端口那樣可以改變,1434是不能改變的。一個典型的返回的信息如下:

          ServerName;Sky;InstanceName;sky;IsClustered;No;Version;8.00.194;tcp;3341;np;//sky/pipe/MSSQL$XHT310/sql/query;可以發現mssql的tcp端口改成了3341,為攻擊者打開了方便之門!只要會一點socket編程知識,很容易就可以寫出掃描mssql服務的程序,而且,由于利用了udp端口,一般的過濾是很難防范的。 補天的awen寫了個探測程序,用的是c#語言,代碼如下:

          using System; 
          using System.Net.Sockets; 
          using System.Net; 
          using System.Text; 
          using System.Threading;

          namespace ConsoleApplication3 
          {

          class Class1 

          //創建一個UDPCLIENT實例 
          private static UdpClient m_Client;

          //LISTEN用來獲取返回的信息 
          public static string Listen(string hostip) 

          string HostIP = hostip; 
          IPAddress thisIP = IPAddress.Parse(HostIP); 
          IPEndPoint host = new IPEndPoint(thisIP,1434); 
          byte [] data = m_Client.Receive(ref host); 
          Encoding ASCII = Encoding.ASCII; 
          String strData = ASCII.GetString(data); 
          return strData;


          //SEND 
          public static void Send(string hostip) 

          string HostIP = hostip; 
          byte [] buffer = {02}; 
          //02為要發送的數據,只有02、03、04有回應 
          int ecode = m_Client.Send(buffer,1,HostIP,1434); 
          //ecode用來返回是否成功發送 
          if(ecode <= 0) 

          Console.WriteLine("發送時出錯:" + ecode);

          }


          //對返回的信息的簡單的處理 
          public static void OutputInfo(string strdata) 

          string str = strdata; 
          //str.le 
          char [] that = {‘;‘,‘;‘}; 
          string [] strofthis =str.Split(that); 
          //int i= 0  
          for(int i=0;i{

          Console.Write(strofthis); 
          Console.Write(‘
          ‘); 
          }


          //輸入IP 
          public static string InputHostIP() 

          Console.Write("enter the ip you want to scan:

          "); 
          string hostip =Console.ReadLine(); 
          Console.Write(‘
          ‘); 
          return hostip; 

          //EXIT 
          public static void Exit() 

          Console.WriteLine("if you want to exit ,just input 1
          "); 
          int a = Console.Read(); 
          if(a!= 1) 

          Console.WriteLine("if you want to exit ,just input 1
          "); 
          Console.Read(); 

          else 


          }

          [STAThread]

          static void Main(string[] args) 

          string HostIP; 
          HostIP = InputHostIP(); 
          Console.WriteLine("Begin to send udp to the host"); 
          m_Client = new UdpClient(); 
          Send(HostIP); 
          string strData=Listen(HostIP); 
          OutputInfo(strData); 
          Exit();



          }


           3一個典型的返回的信息

            ServerName;AWEN;
            InstanceName;AWEN;
            IsClustered;No;
            Version;8.00.194;
            tcp;1044; (TCP的端口,可見就算改了端口也是很容易找到的)
            np;//AWEN/pipe/MSSQL$XHT310/sql/query;

            解決辦法:安裝防火墻,或者利用Windows2000系統的ipsec對網絡連接進行ip限制,實現IP數據包的安全性。對IP連接進行限制,只保證自己的IP能夠訪問,拒絕其他IP進行的端口連接,把來自網絡上的安全威脅進行有效的控制。重要的是,還要對端口作過濾,包括大部分的tcp和udp端口,因為僅僅做ip限制的話,有可能惡意攻擊者先攻擊被數據庫服務器信任的主機,控制之后作為跳板對數據庫服務器進行攻擊。

            2、數據庫的密碼探測

            密碼攻擊包括兩種,破解密碼和網絡監聽。破解密碼是使用工具不停的連接數據庫來猜測密碼, 包括字典攻擊,暴力攻擊和界于兩者之間的半暴力半字典攻擊。通常攻擊者先采用字典攻擊的方法,沒有成功的話依次采用半暴力半字典攻擊,暴力攻擊。在網絡速度夠好,電腦運算能力夠強的情況下,這樣的密碼攻擊危害是相當大的。網絡監聽則是控制一臺網絡設備,在上面運行監聽工具捕獲在網絡中傳送的密碼信息。網絡監聽可以分為兩種,一種是外部的監聽,將偵聽工具軟件放到網絡連接的設備或者 放到可以控制網絡連接設備的電腦上,這里的網絡連接設備,比如網關服務器,比如路由器等等。另外一 種是來自內部的監聽,對于不安全的局域網,數據是采用廣播的方式傳播的,只要把網卡設置為混雜模式即可接收到本來不屬于自己的數據包,當然可能包括密碼信息等資料。

            解決方法:針對密碼破解,只要把密碼設置為足夠強壯,并且對同個ip地址不停的連接請求進行屏蔽即可。 但是對于監聽來說,網絡傳輸的時候如果不加密的話,所有的網絡傳輸都是明文的,包括密碼、數據庫內容等 等,不管多么復雜的密碼都是于事無補的,這是一個很大的安全威脅。所以,在條件容許情況下,最好使用SSL

            來加密協議,當然,你需要一個證書來支持。并且,對于網絡監聽應該及時發現,如果網絡中的丟包率突然提 高,那么就有理由懷疑網絡遭到監聽。

            3、腳本安全

            腳本安全本身就是個非常復雜的問題,足以寫一篇專業的長篇分析文章,而且我對腳本不是很內行,mix,envymask,pskey,angel他們比較瘋狂,哈哈。腳本

            安全主要是對提交的數據缺乏嚴格的檢查導致的,比較危險的符號有“;”,“ ”,“#”,“--”,“$”,“/”等。這個問題最初被認為是asp+sqlserver的問題,但是很快就發現實質上它的影響非常大,后來有人繼續深入發現在php+mysql該問題依然會存在,san對php作過深入分析,有興趣的去安全焦點找他的文章。對于腳本

            好象沒有特有效的解決方法,只有依靠程序員的個人素質了……

            總結,不管是mysql,還是mssql,在外部網絡中,都受到相當大的威脅。相比而言,mssql受到的威脅甚至要更大些,最近2年來,mssql暴露出了多個遠程溢出漏洞。如果配置的比較好的話,我認為,mysql要比mssql安全一些,因為隨時會爆發的新溢出漏洞是防不勝防的,而且能夠執行系統命令的sql注入攻擊也非常可怕。好了,限于篇幅,這篇文章到此結束。

          posted @ 2012-01-06 11:39 順其自然EVO 閱讀(216) | 評論 (0)編輯 收藏

          《青花瓷》JAVA版:周杰倫告訴你怎么學Java

           “青花瓷Java版”為北京師范大學教育學部蔡蘇作詞原創,覆蓋教育技術學院專業選修課《面向對象程序設計》教學大綱中的所有知識點。

            視頻:http://player.youku.com/player.php/sid/XMjU3Mjk2NzA0/v.swf

            歌詞:

            JDK 和JRE 莫要混淆去

            環境變量的配置有時讓人迷

            初學的人莫貪圖上來I D E

            先用J D K +文本編輯器

            面向對象仨特點一定要牢記

            封裝繼承和多態一個不能離

            接口為多重繼承

            抽象類一定要有實例

            O b je c t呀 所有類爹地

            package在類中只能有唯一

            注釋命名時要既規范又明晰

            就當為好程序員伏筆

            G U I 不是鬼 千萬別恐懼

            四大布局管理 多練才熟悉

            勤能補拙熟能生巧到考試時

            你眼帶笑意

            三整兩浮一布爾再加字節符

            基本數據Byte數了然于心底

            碰到異常一定記得try/catch

            要打包發布使用jar命令

            線程何時被調用全看調度器

            睡眠同步和死鎖使用要仔細

            網頁中Applet

            獨立程序Application

            ApplicationO b je c t呀所有類爹地

            package在類中只能有唯一

            注釋命名時要既規范又明晰就當為好程序員伏筆

            (這樣程序員才是好樣滴)

            G U I 不是鬼

            千萬別恐懼四大布局管理

            多練才熟悉

            勤能補拙熟能生巧到考試時你眼帶笑意

          歌詞理解:

            JDK 和JRE 莫要混淆去

            JRE(Java Runtime Environment):即Java運行環境,運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。

            JDK(Java Development Kit):是整個Java的核心,包括了Java運行環境,Java工具和Java基礎的類庫。

            環境變量的配置有時讓人迷

            JAVA_HOME、CLASSPATH、PATH

            記得加入當前目錄“.”

            初學的人莫貪圖上來IDE

            IDE(Integrated Development,集成開發環境)

            不錯的Java IDE:Eclipse、Netbeans、Jbuilder、 Jcreator

            先用JDK +文本編輯器

            vim、javac、java

            面向對象仨特點一定要牢記,封裝繼承和多態一個不能離

            封裝:隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別

            繼承:對已有類的復用和修改

            多態:指一個程序中,同名的不同方法共存的情況

            接口為多重繼承

            抽象類一定要有實例

            Object呀,所有類爹地

            所有類都是從Object類繼承而來的。

            package在類中只能有唯一

            package 語句必須是文件中除注釋以外的第一句程序代碼

            package 將文件中的類都遮蔽到一定的名字空間下,別的文件導入須用到import關鍵字

            注釋命名時要既規范又明晰,就當為好程序員伏筆

            GUI 不是鬼,千萬別恐懼

            四大布局管理 多練才熟悉

            勤能補拙熟能生巧到考試時,你眼帶笑意

           三整兩浮一布爾再加字節符

            三整:short int long

            兩浮:float double

            一布爾:boolean

            字節符:byte char

            基本數據Byte數了然于心底

            boolean:特殊,表示1 bit的信息,但不明確指定占用內存空間的大小。

            char:2 Byte

            byte:1 Byte

            short:2 Byte

            int:4 Byte

            long:8 Byte

            float:4 Byte

            double:8 Byte

            碰到異常一定記得try/catch

            要打包發布使用jar命令

            線程何時被調用全看調度器

            睡眠同步和死鎖使用要仔細

            網頁中Applet

            獨立程序Application

          posted @ 2012-01-06 11:37 順其自然EVO 閱讀(205) | 評論 (0)編輯 收藏

          服務器重啟前請做完你該做的工作

           對于系統管理員來說如何管理自己的服務器已經是再簡單不過,但是如何管理好服務器卻不是一個簡單的事情。對于管理員來說重啟服務器可不是一件鬧著玩的事情。對于Windows服務器管理員來說經常性重啟Windows設備已經成為一種生活常態,但在Unix系統中這種辦法卻難以奏效——在默認情況下重新啟動不會帶來任何形式的改善。

            我打算借此機會跟大家詳細聊聊重啟的問題。對于每一位服務器管理員來說這都算得上熱門話題,但在Unix極客們眼中它則屬于一種層次更深的課題——可能因為Windows管理員們往往把重啟當成故障排查工作的首要步驟之一,而Unix團隊則一般只在束手無策的情況下才進行嘗試。

            Unix服務器重啟的兩種情況

            實際情況是:服務器重啟操作應該極少出現——請注意是極少。在這里我列舉內核更新與硬件更換作為例子,因為它們是Unix領域中引發重新啟動的兩大主要原因。有些人一直在鼓吹什么不重啟服務器的話會帶來某些嚴重的安全風險,這簡直是一派胡言。如果服務項目與應用程序中確實存在安全風險,那么打上漏洞補丁就能解決問題了,而且補丁往往不要求重啟設備。而如果安全風險存在于內核模塊中,一般來說只需卸載對應模塊、安裝補丁,最后重新加載模塊。沒錯,我承認一旦內核中存在安全風險,那么重啟操作的確是必要的。但在這種情況之外,大家根本沒有切實的理由重新啟動Unix服務器。

            有些人認為如果不進行重啟操作,其它形式的風險往往會接踵而至,例如某些關鍵性服務項目在開機時沒有得到正確啟用,而這將導致一系列隱患。當然,這種說法本身是正確的,但只要管理工作執行到位,這其實根本就是種杞人憂天。只有剛剛接掌服務器設備的菜鳥才會忘記正確設置服務項目的啟動參數。不過話說回來,如果大家的服務器正處于構建階段,且其中還不涉及任何生產方面的內容,那么不妨隨意進行各類重啟測試,這不會帶來任何不良影響。而且我認為這正是熟悉重啟機制的最好時機。

            但還有另一方面需要考慮:那些將重啟操作當成故障排查重要步驟之一的家伙是抱著死豬不怕開水燙的心態,打算一次性把問題都暴露出來。就說一套已經出現問題的Unix設備吧,某些還處于運行中的服務項目實際上已經無法再次啟動,而這一點在重啟之后就會顯現出來——也許是由于分段故障或者其它稀奇古怪的原因。

            造成Unix服務器重啟的原因

            如果我們只是簡單查看幾分鐘之后就一拍腦門決定重啟設備,那么也許故障的真正原因就徹底湮沒在時光中了——也許是某位初級管理員在運行一套自己編寫的愚蠢腳本時無意中刪除了/boot目錄或者/etc、/usr/lib64目錄下的部分內容。這正是引發分段故障以及設備不穩定情況的罪魁禍首。然而一旦我們選擇直接重啟服務器而沒有深入挖掘問題,那么顯然問題會變得更加嚴重,接下來不出意外的話大家應該會啟動恢復鏡像——這就代表需要面對大量恢復工作——而與此同時生產服務器也將陷入停機狀態。

            以上只是我們在Unix領域中應該盡量避免重啟操作的原因之一。與其說這算是種故障排查方法,不如把它看作一類孤注一擲的豪賭——要么發現問題,要么親手毀掉一切再慢慢重建。總之,沒人能利用/var分區重啟設備就完全修正錯誤。(另外請別提什么打開文件句柄這類迂腐的蠢話——我想大家應該理解我的意思)

            服務器重啟前請做完你該做的工作

            在大多數情況下,不進行重啟是極其重要的,因為系統中能夠幫助我們修復問題的關鍵性內容在重啟前是一定存在的,但在重啟后卻未必還在。重啟之后問題絕對會再次出現,然而一旦解決方案隨重啟行為而煙消云散,那么故障本身就陷入了無解的死循環中。除非有人決定不進行重啟,而是嘗試找出問題的根源。遺憾的是,能做了這種明智選擇的人實在少之又少。實際情況是:一根小小的故障內存條就能給系統正常運行與設備啟動狀態帶來極大的麻煩。而這個時候,對癥下藥才是上策,一味重啟只會帶來額外的損失。

            因此,今后大家在面對問題時,如果有某個家伙說什么“嘿,不如先重啟一下看看”,不妨直接給他兩個大嘴巴。重啟當然是方案之一,但在實施重啟前請務必確保我們已經采取了一切能夠想到的處理措施;畢竟節省下來的都是咱們自己的時間跟精力嘛。

          posted @ 2012-01-05 17:50 順其自然EVO 閱讀(186) | 評論 (0)編輯 收藏

          J2EE總結:Java命名與目錄接口JNDI

          JNDI 是什么

            JNDI是 Java 命名與目錄接口(Java Naming and Directory Interface),在J2EE規范中是重要的規范之一,不少專家認為,沒有透徹理解JNDI的意義和作用,就沒有真正掌握J2EE特別是EJB的知識。

            那么,JNDI到底起什么作用?

            要了解JNDI的作用,我們可以從“如果不用JNDI我們怎樣做?用了JNDI后我們又將怎樣做?”這個問題來探討。

            沒有JNDI的做法:

            程序員開發時,知道要開發訪問MySQL數據庫的應用,于是將一個對 MySQL JDBC 驅動程序類的引用進行了編碼,并通過使用適當的 JDBC URL 連接到數據庫。

            就像以下代碼這樣:

          1. Connection conn=null;  
          2. try {  
          3. Class.forName("com.mysql.jdbc.Driver",  
          4. true, Thread.currentThread().getContextClassLoader());  
          5. conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");  
          6. /* 使用conn并進行SQL操作 */ 
          7. ......  
          8. conn.close();  
          9. }   
          10. catch(Exception e) {  
          11. e.printStackTrace();  
          12. }   
          13. finally {  
          14. if(conn!=null) {  
          15. try {  
          16. conn.close();  
          17. catch(SQLException e) {}  
          18. }  
          19. }

            這是傳統的做法,也是以前非Java程序員(如Delphi、VB等)常見的做法。這種做法一般在小規模的開發過程中不會產生問題,只要程序員熟悉Java語言、了解JDBC技術和MySQL,可以很快開發出相應的應用程序。

            沒有JNDI的做法存在的問題:

            1、數據庫服務器名稱MyDBServer 、用戶名和口令都可能需要改變,由此引發JDBC URL需要修改;

            2、數據庫可能改用別的產品,如改用DB2或者Oracle,引發JDBC驅動程序包和類名需要修改;

            3、隨著實際使用終端的增加,原配置的連接池參數可能需要調整;

            4、......

            解決辦法:

            程序員應該不需要關心“具體的數據庫后臺是什么?JDBC驅動程序是什么?JDBC URL格式是什么?訪問數據庫的用戶名和口令是什么?”等等這些問題,程序員編寫的程序應該沒有對 JDBC 驅動程序的引用,沒有服務器名稱,沒有用戶名稱或口令 —— 甚至沒有數據庫池或連接管理。而是把這些問題交給J2EE容器來配置和管理,程序員只需要對這些配置和管理進行引用即可。

            由此,就有了JNDI。

            用了JNDI之后的做法:

            首先,在在J2EE容器中配置JNDI參數,定義一個數據源,也就是JDBC引用參數,給這個數據源設置一個名稱;然后,在程序中,通過數據源名稱引用數據源從而訪問后臺數據庫。

           具體操作如下(以JBoss為例):

            1、配置數據源

            在JBoss的 D:/jboss420GA/docs/examples/jca 文件夾下面,有很多不同數據庫引用的數據源定義模板。將其中的 mysql-ds.xml 文件Copy到你使用的服務器下,如 D:/jboss420GA/server/default/deploy。

            修改 mysql-ds.xml 文件的內容,使之能通過JDBC正確訪問你的MySQL數據庫,如下:

          1. <?xml version="1.0" encoding="UTF-8"?> 
          2. <datasources> 
          3. <local-tx-datasource> 
          4. <jndi-name>MySqlDS</jndi-name> 
          5. <connection-url>jdbc:mysql://localhost:3306/lw</connection-url> 
          6. <driver-class>com.mysql.jdbc.Driver</driver-class> 
          7. <user-name>root</user-name> 
          8. <password>rootpassword</password> 
          9. <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> 
          10. <metadata> 
          11. <type-mapping>mySQL</type-mapping> 
          12. </metadata> 
          13. </local-tx-datasource> 
          14. </datasources>

            這里,定義了一個名為MySqlDS的數據源,其參數包括JDBC的URL,驅動類名,用戶名及密碼等。

            2、在程序中引用數據源:

          1. Connection conn=null;  
          2. try {  
          3. Context ctx=new InitialContext();  
          4. Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用數據源  
          5. DataSource ds=(Datasource)datasourceRef;  
          6. conn=ds.getConnection();  
          7. /* 使用conn進行數據庫SQL操作 */ 
          8. ......  
          9. c.close();  
          10. }   
          11. catch(Exception e) {  
          12. e.printStackTrace();  
          13. }   
          14. finally {  
          15. if(conn!=null) {  
          16. try {  
          17. conn.close();  
          18. catch(SQLException e) { }  
          19. }  
          20. }

            直接使用JDBC或者通過JNDI引用數據源的編程代碼量相差無幾,但是現在的程序可以不用關心具體JDBC參數了。

            在系統部署后,如果數據庫的相關參數變更,只需要重新配置 mysql-ds.xml 修改其中的JDBC參數,只要保證數據源的名稱不變,那么程序源代碼就無需修改。

            由此可見,JNDI避免了程序與數據庫之間的緊耦合,使應用更加易于配置、易于部署。

            JNDI的擴展:JNDI在滿足了數據源配置的要求的基礎上,還進一步擴充了作用:所有與系統外部的資源的引用,都可以通過JNDI定義和引用。

            所以,在J2EE規范中,J2EE 中的資源并不局限于 JDBC 數據源。引用的類型有很多,其中包括資源引用(已經討論過)、環境實體和 EJB 引用。特別是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一項關鍵角色:查找其他應用程序組件。

            EJB 的 JNDI 引用非常類似于 JDBC 資源的引用。在服務趨于轉換的環境中,這是一種很有效的方法。可以對應用程序架構中所得到的所有組件進行這類配置管理,從 EJB 組件到 JMS 隊列和主題,再到簡單配置字符串或其他對象,這可以降低隨時間的推移服務變更所產生的維護成本,同時還可以簡化部署,減少集成工作。 外部資源”。

           具體操作如下(以JBoss為例):

            1、配置數據源

            在JBoss的 D:/jboss420GA/docs/examples/jca 文件夾下面,有很多不同數據庫引用的數據源定義模板。將其中的 mysql-ds.xml 文件Copy到你使用的服務器下,如 D:/jboss420GA/server/default/deploy。

            修改 mysql-ds.xml 文件的內容,使之能通過JDBC正確訪問你的MySQL數據庫,如下:

          1. <?xml version="1.0" encoding="UTF-8"?> 
          2. <datasources> 
          3. <local-tx-datasource> 
          4. <jndi-name>MySqlDS</jndi-name> 
          5. <connection-url>jdbc:mysql://localhost:3306/lw</connection-url> 
          6. <driver-class>com.mysql.jdbc.Driver</driver-class> 
          7. <user-name>root</user-name> 
          8. <password>rootpassword</password> 
          9. <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name> 
          10. <metadata> 
          11. <type-mapping>mySQL</type-mapping> 
          12. </metadata> 
          13. </local-tx-datasource> 
          14. </datasources>

            這里,定義了一個名為MySqlDS的數據源,其參數包括JDBC的URL,驅動類名,用戶名及密碼等。

            2、在程序中引用數據源:

          1. Connection conn=null;  
          2. try {  
          3. Context ctx=new InitialContext();  
          4. Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用數據源  
          5. DataSource ds=(Datasource)datasourceRef;  
          6. conn=ds.getConnection();  
          7. /* 使用conn進行數據庫SQL操作 */ 
          8. ......  
          9. c.close();  
          10. }   
          11. catch(Exception e) {  
          12. e.printStackTrace();  
          13. }   
          14. finally {  
          15. if(conn!=null) {  
          16. try {  
          17. conn.close();  
          18. catch(SQLException e) { }  
          19. }  
          20. }

            直接使用JDBC或者通過JNDI引用數據源的編程代碼量相差無幾,但是現在的程序可以不用關心具體JDBC參數了。

            在系統部署后,如果數據庫的相關參數變更,只需要重新配置 mysql-ds.xml 修改其中的JDBC參數,只要保證數據源的名稱不變,那么程序源代碼就無需修改。

            由此可見,JNDI避免了程序與數據庫之間的緊耦合,使應用更加易于配置、易于部署。

            JNDI的擴展:JNDI在滿足了數據源配置的要求的基礎上,還進一步擴充了作用:所有與系統外部的資源的引用,都可以通過JNDI定義和引用。

            所以,在J2EE規范中,J2EE 中的資源并不局限于 JDBC 數據源。引用的類型有很多,其中包括資源引用(已經討論過)、環境實體和 EJB 引用。特別是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一項關鍵角色:查找其他應用程序組件。

            EJB 的 JNDI 引用非常類似于 JDBC 資源的引用。在服務趨于轉換的環境中,這是一種很有效的方法。可以對應用程序架構中所得到的所有組件進行這類配置管理,從 EJB 組件到 JMS 隊列和主題,再到簡單配置字符串或其他對象,這可以降低隨時間的推移服務變更所產生的維護成本,同時還可以簡化部署,減少集成工作。 外部資源”。

           從我們日常生活中去理解目錄服務的概念可以從電話簿說起,電話簿本身就是一個比較典型的目錄服務,如果你要找到某個人的電話號碼,你需要從電話簿里找到這個人的名稱,然后再看其電話號碼。

            理解了命名服務和目錄服務再回過頭來看JDNI,它是一個為Java應用程序提供命名服務的應用程序接口,為我們提供了查找和訪問各種命名和目錄服務的通用統一的接口.通過JNDI統一接口我們可以來訪問各種不同類型的服務.如下圖所示,我們可以通過JNDI API來訪問剛才談到的DNS。

            至此已經對JNDI有了一個初步認識,如果想要進一步了解JNDI,并對使用JDNI給我們帶來哪些便利之處,我推薦兩篇關于JDNI的文章,寫的非常的好,兩篇文章從“如果不用JNDI我們怎樣做?用了JNDI后我們又將怎樣做?”這個角度來加深對JNDI的認識。

          posted @ 2012-01-05 17:48 順其自然EVO 閱讀(168) | 評論 (0)編輯 收藏

          企業數據庫合規的最佳實踐

           數據庫是存放數據、經常是那些高敏感度數據的寶庫,因此它也毫無疑問的是合規檢查程序的重點區域。幾乎所有的企業合規都會對哪些人、能在什么時間、訪問什么數據庫作出規定,并且需要一個專職人員來管理這些權限。本文,我們將討論針對數據庫合規的基本數據庫安全要求,如PCI DSS和HIPAA,以及為了遵守合規要求用于管理數據庫權限和維護的最佳實踐。

            最常見的五大企業核心數據庫環境是:1、微軟SQL Server數據庫;2、IBM的DB2數據庫;3、MySQL數據庫;4、Oracle數據庫;5、Postgres數據庫。這些數據庫在首次實施安裝時都能夠恰當地配置、加固、保護及鎖定。真正的挑戰是理解那些實際上需要到位的重要組件。這不只是對數據庫本身,還有容納操作系統和數據庫的服務器。

            PCI DSS當前對于數據庫要求有下述明確的控制措施:

            ◆ 對訪問任意數據庫的所有用戶進行認證。

            ◆ 所有用戶訪問任何數據庫時,用戶的查詢和操作(例如移動、拷貝和刪除)只能通過編程性事務(例如存儲過程)。

            ◆ 數據庫和應用的配置設置為只限于給DBA(數據庫管理員)的直接用戶訪問或是查詢。

            ◆ 對于數據庫應用和相關的應用ID,應用ID只能被應用使用,而不能被單獨的用戶或是其它進程使用。

            就HIPAA法案來說,上述的措施沒有作為HIPAA合規要求的內容特別寫出來,但是應當看作是用于合規遵從的最佳安全控制組合,并且最終有助于滿足HIPAA中安全條款的需要。具體來說,HIPAA的規定條款如下:

            ◆ 確保所有新建、接收、維護或是傳輸中的電子個人健康信息(e-PHI)的保密性、完整性和可用性。

            ◆ 辨識和防范那些對信息的安全性或完整性來說合理的、可預見的威脅。

            ◆ 防范那些合理的、可預見的、不允許的濫用或是泄漏;并且

            ◆ 確保他們所有員工的合規性。

            此外,除了滿足像PCI DSS這樣的合規要求外,下述是應該考慮的最佳實踐、可用來確保上面列出的所有數據庫環境的安全。

            就運行數據庫的主機的操作系統來說,以下的最佳實踐應該到位:

            1、系統管理員和其他相關的IT人員應該擁有充分的知識、技能并理解所有關鍵操作系統的安全要求。

            2、當部署操作系統到受管理的服務環境中時,應采用行業領先的配置標準和配套的內部文檔。

            3、在操作系統上應該只啟用那些必需的和安全的服務、協議、守護進程和其它必要的功能。

            4、操作系統上所有不需要的功能和不安全的服務及協議應該有效地禁用。

          posted @ 2012-01-05 17:48 順其自然EVO 閱讀(176) | 評論 (0)編輯 收藏

          僅列出標題
          共394頁: First 上一頁 344 345 346 347 348 349 350 351 352 下一頁 Last 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 乳源| 乾安县| 厦门市| 通海县| 辰溪县| 偏关县| 淮北市| 改则县| 乌什县| 临海市| 驻马店市| 南丹县| 石渠县| 石门县| 曲松县| 上思县| 泽库县| 临桂县| 九寨沟县| 登封市| 马鞍山市| 夏津县| 阿克| 华容县| 土默特右旗| 永济市| 习水县| 寿光市| 彰化市| 锦屏县| 丰县| 治县。| 石楼县| 宁远县| 内江市| 拜城县| 曲麻莱县| 长岭县| 闸北区| 牡丹江市| 响水县|