<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2011年11月29日

    Java是一個面向?qū)ο蟮恼Z言,java面向?qū)ο笠话阌腥筇卣鳎悍庋b、繼承、多態(tài)。

    封裝:就是把一些屬性和方法封裝到一個類里。

    繼承:就如子類繼承父類的一些屬性和方法。

    多態(tài):就如一個父類有多個不同特色的子類。

    這里我就不多講解,下面我主要說明一個繼承。繼承是OOP(面向?qū)ο螅┑囊粋€特色,java只支持單繼承(如果繼承兩個有同樣方法的父類,那么就不知道繼承到那個父類的,所以java只支持單繼承)。繼承是java的一個特色,我們用的所以類都繼承Objict類,所以就要Object類的方法,如toString()、getClass()、wait()……所以我們建立的類都有父類。

    Java中一般有三種類:

    基本類:也就是一般的類(一般所說的類就是基本類),是對象的模板,是屬性和方法的集合。可以繼承其他基本類、抽象類、實(shí)現(xiàn)接口。

    抽象類:有抽象方法的類(抽象方法就是該方法必須由繼承來實(shí)現(xiàn),本身只定義,不實(shí)現(xiàn))。抽象類可以有一個或多個抽象方法,他是基本類和接口類的過度。

    接口類:一般叫做接口,該類中的所有方法都是抽象方法,該類的方法本身只定義不實(shí)現(xiàn)。

    抽象類和接口一個由【abstract class + 抽象類名】一個由【interface +接口名】定義,接口中的所以方法都是抽象方法,而抽象類有部分方法是自身實(shí)現(xiàn)了的,一些只定義不實(shí)現(xiàn)。

    基本類的定義:

    public class Fruit {

        public void price() {

           System.out.println("水果價格");

        }

        public void weight() {

           System.out.println("水果重量");

        }

    }

    抽象類的定義:

    public abstract class Fruit {

        public void price() {

           System.out.println("水果價格");

        }

        public abstract void weight();

    }

    接口類的定義:

    public interface Fruit {

        public void price();

        public void weight() ;

    }

    從上面我們可以看出接口就是抽象類的升級版,由于該類的方法全是抽象方法,所以把a(bǔ)bstract換成interface。而接口的方法必須由子類才能實(shí)現(xiàn)。

     

    繼承

    繼承基本類,可以繼承父類的方法,也可以從些,也可以擴(kuò)充。下面是實(shí)現(xiàn)接口基本類的類:

    public class Apple extends Fruit {

    }

    該類中就有Fruit基本類中的兩個方法:price()和weight();

    繼承抽象類,必須實(shí)現(xiàn)抽象類的抽象方法,可以修改父類的方法,和添加方法。下面是繼承抽象類的類:

    public class Apple extends Fruit {

        @Override

        public void weight() {

           System.out.println("水果重量");

        }

    }

    該類繼承類Fruit的price()方法,同時實(shí)現(xiàn)了Fruit抽象類的weight()方法。

    繼承接口類(也就實(shí)現(xiàn)接口),必須實(shí)現(xiàn)接口類的所有的抽象類和添加了。下面是繼承接口的類:

    public class Aple implements Fruit {

        @Override

        public void price() {

           System.out.println("水果價格");

        }

        @Override

        public void weight() {

           System.out.println("水果重量");

        }

    }

    該類是實(shí)現(xiàn)Fruit接口的所以抽象方法。

     

    Java只支持單繼承(繼承基本類和抽象類),但是我們可以用接口來實(shí)現(xiàn)(多繼承接口來實(shí)現(xiàn))

    如:public class Apple extends Fruit implements Fruit1, Fruit2{}

    一般我們繼承基本類和抽象類用extends關(guān)鍵字,實(shí)現(xiàn)接口類的繼承用implements關(guān)鍵字。其實(shí)繼承是很簡單的,可以就是沒有弄清這兩個關(guān)鍵字,當(dāng)我們弄清楚也就是比較簡單的。

    接口也可以繼承接口如:public interface Fruit1 extends Fruit {}這是接口中的多重繼承,同理抽象類和基本類也同理。如果我們把基本類添加final修飾,也就定義該類不被繼承,該類不能作為父類。同時基本類的方法可以用public 、private、proptected來修飾方法,用final來阻止繼承該方法。

    這里只是自己的理解,有些地方時用詞不當(dāng)?shù)模皇怯X得這樣用詞更好的理解,請大家諒解。有些地方由于不是這里的重點(diǎn),沒有講清楚,希望大家通過其他方式了解。

    posted @ 2011-12-04 23:08 陳小東 閱讀(1074) | 評論 (0)編輯 收藏

    public class BubbleSort implements SortUtil.Sort{

         public void sort(int[] data) {

            int temp;

            for(int i=0;i<data.length;i++){

                for(int j=data.length-1;j>i;j--){

                    if(data[j]<data[j-1]){

                        SortUtil.swap(data,j,j-1);

                    }

                }

            }

        }

    posted @ 2011-12-04 22:58 陳小東 閱讀(1122) | 評論 (0)編輯 收藏

    public class InsertSort implements SortUtil.Sort{

         public void sort(int[] data) {

            int temp;

            for(int i=1;i<data.length;i++){

                for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){

                    SortUtil.swap(data,j,j-1);

                }

            }       

        }

    }

    posted @ 2011-12-04 22:57 陳小東 閱讀(730) | 評論 (0)編輯 收藏

    什么是SQL注入式攻擊?
    所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令。在某些表單中,用戶輸入的內(nèi)容直接用來構(gòu)造(或者影響)動態(tài)SQL命令,或作為存儲過程的輸入?yún)?shù),這類表單特別容易受到SQL注入式攻擊。常見的SQL注入式攻擊過程類如:
    ⑴ 某個ASP.NET Web應(yīng)用有一個登錄頁面,這個登錄頁面控制著用戶是否有權(quán)訪問應(yīng)用,它要求用戶輸入一個名稱和密碼。
    ⑵ 登錄頁面中輸入的內(nèi)容將直接用來構(gòu)造動態(tài)的SQL命令,或者直接用作存儲過程的參數(shù)。下面是ASP.NET應(yīng)用構(gòu)造查詢的一個例子:
    System.Text.StringBuilder query = new System.Text.StringBuilder(
       "SELECT * from Users WHERE login = '")
       .Append(txtLogin.Text).Append("' AND password='")
       .Append(txtPassword.Text).Append("'");

    ⑶ 攻擊者在用戶名字和密碼輸入框中輸入"'或'1'='1"之類的內(nèi)容。
    ⑷ 用戶輸入的內(nèi)容提交給服務(wù)器之后,服務(wù)器運(yùn)行上面的ASP.NET代碼構(gòu)造出查詢用戶的SQL命令,但由于攻擊者輸入的內(nèi)容非常特殊,所以最后得到的SQL命令變成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。
    ⑸ 服務(wù)器執(zhí)行查詢或存儲過程,將用戶輸入的身份信息和服務(wù)器中保存的身份信息進(jìn)行對比。
    ⑹ 由于SQL命令實(shí)際上已被注入式攻擊修改,已經(jīng)不能真正驗(yàn)證用戶身份,所以系統(tǒng)會錯誤地授權(quán)給攻擊者。
    如果攻擊者知道應(yīng)用會將表單中輸入的內(nèi)容直接用于驗(yàn)證身份的查詢,他就會嘗試輸入某些特殊的SQL字符串篡改查詢改變其原來的功能,欺騙系統(tǒng)授予訪問權(quán)限。
    系統(tǒng)環(huán)境不同,攻擊者可能造成的損害也不同,這主要由應(yīng)用訪問數(shù)據(jù)庫的安全權(quán)限決定。如果用戶的帳戶具有管理員或其他比較高級的權(quán)限,攻擊者就可能對數(shù)據(jù)庫的表執(zhí)行各種他想要做的操作,包括添加、刪除或更新數(shù)據(jù),甚至可能直接刪除表
    如何防范SQL注入式攻擊?
    好在要防止ASP.NET應(yīng)用被SQL注入式攻擊闖入并不是一件特別困難的事情,只要在利用表單輸入的內(nèi)容構(gòu)造SQL命令之前,把所有輸入內(nèi)容過濾一番就可以了。過濾輸入內(nèi)容可以按多種方式進(jìn)行。
    ⑴ 對于動態(tài)構(gòu)造SQL查詢的場合,可以使用下面的技術(shù):
    第一:替換單引號,即把所有單獨(dú)出現(xiàn)的單引號改成兩個單引號,防止攻擊者修改SQL命令的含義。再來看前面的例子,"SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'"顯然會得到與"SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'"不同的結(jié)果。
    第二:刪除用戶輸入內(nèi)容中的所有連字符,防止攻擊者構(gòu)造出類如"SELECT * from Users WHERE login = 'mas' -- AND password =''"之類的查詢,因?yàn)檫@類查詢的后半部分已經(jīng)被注釋掉,不再有效,攻擊者只要知道一個合法的用戶登錄名稱,根本不需要知道用戶的密碼就可以順利獲得訪問權(quán)限。
    第三:對于用來執(zhí)行查詢的數(shù)據(jù)庫帳戶,限制其權(quán)限。用不同的用戶帳戶執(zhí)行查詢、插入、更新、刪除操作。由于隔離了不同帳戶可執(zhí)行的操作,因而也就防止了原本用于執(zhí)行SELECT命令的地方卻被用于執(zhí)行INSERT、UPDATE或DELETE命令。
    ⑵ 用存儲過程來執(zhí)行所有的查詢。SQL參數(shù)的傳遞方式將防止攻擊者利用單引號和連字符實(shí)施攻擊。此外,它還使得數(shù)據(jù)庫權(quán)限可以限制到只允許特定的存儲過程執(zhí)行,所有的用戶輸入必須遵從被調(diào)用的存儲過程的安全上下文,這樣就很難再發(fā)生注入式攻擊了。
    ⑶ 限制表單或查詢字符串輸入的長度。如果用戶的登錄名字最多只有10個字符,那么不要認(rèn)可表單中輸入的10個以上的字符,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。
    ⑷ 檢查用戶輸入的合法性,確信輸入的內(nèi)容只包含合法的數(shù)據(jù)。數(shù)據(jù)檢查應(yīng)當(dāng)在客戶端和服務(wù)器端都執(zhí)行——之所以要執(zhí)行服務(wù)器端驗(yàn)證,是為了彌補(bǔ)客戶端驗(yàn)證機(jī)制脆弱的安全性。
    在客戶端,攻擊者完全有可能獲得網(wǎng)頁的源代碼,修改驗(yàn)證合法性的腳本(或者直接刪除腳本),然后將非法內(nèi)容通過修改后的表單提交給服務(wù)器。因此,要保證驗(yàn)證操作確實(shí)已經(jīng)執(zhí)行,唯一的辦法就是在服務(wù)器端也執(zhí)行驗(yàn)證。你可以使用許多內(nèi)建的驗(yàn)證對象,例如 RegularExpressionValidator,它們能夠自動生成驗(yàn)證用的客戶端腳本,當(dāng)然你也可以插入服務(wù)器端的方法調(diào)用。如果找不到現(xiàn)成的驗(yàn)證對象,你可以通過CustomValidator自己創(chuàng)建一個。
    ⑸ 將用戶登錄名稱、密碼等數(shù)據(jù)加密保存。加密用戶輸入的數(shù)據(jù),然后再將它與數(shù)據(jù)庫中保存的數(shù)據(jù)比較,這相當(dāng)于對用戶輸入的數(shù)據(jù)進(jìn)行了"消毒"處理,用戶輸入的數(shù)據(jù)不再對數(shù)據(jù)庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。 System.Web.Security.FormsAuthentication類有一個 HashPasswordForStoringInConfigFile,非常適合于對輸入數(shù)據(jù)進(jìn)行消毒處理。
    ⑹ 檢查提取數(shù)據(jù)的查詢所返回的記錄數(shù)量。如果程序只要求返回一個記錄,但實(shí)際返回的記錄卻超過一行,那就當(dāng)作出錯處理


    posted @ 2011-12-03 00:06 陳小東 閱讀(1104) | 評論 (0)編輯 收藏

    實(shí)體查詢
    例子1:
    Hql代碼 復(fù)制代碼
    1. String hql=”from User user ”;      
    2. List list=session.CreateQuery(hql).list();   


    因?yàn)镠QL語句與標(biāo)準(zhǔn)SQL語句相似,所以我們也可以在HQL語句中使用where字句,并且可以在where字句中使用各種表達(dá)式,比較操作符以及使用“and”,”or”連接不同的查詢條件的組合。看下面的一些簡單的例子:
    Hql代碼 復(fù)制代碼
    1. from User user where user.age=20;  


    例子2(返回一個屬性):
    Hql代碼 復(fù)制代碼
    1. String hql= "select c.customerNamefrom Customer c“;   
    2. Query query= session.createQuery(hql);   
    3. Iteratorit = query.list().iterator();   
    4. System.out.println(query.list().size());   
    5. while(it.hasNext()) {   
    6. String c = (String)it.next();   
    7. System.out.println(c);   
    8. }  


    例子3(返回多個屬性):
    如果返回多個屬性,那么它們將被裝入數(shù)組或者集合中
    Hql代碼 復(fù)制代碼
    1. String hql= "select c.customerId, c.customerName“+   
    2. “from Customer c“;   
    3. Query query= session.createQuery(hql);   
    4. Iteratorit = query.list().iterator();   
    5. while(it.hasNext()) {   
    6. Object[] obj= (Object[])it.next();   // List list= (List)it.next();   
    7. Long id = (Long)obj[0];          //Long id = (Long)list.get(0);   
    8. String name = (String)obj[1];     //String name = (String)list.get(1);   
    9. System.out.println(id.longValue() + " " + name);   
    10. }  

    posted @ 2011-12-03 00:05 陳小東 閱讀(689) | 評論 (0)編輯 收藏

    摘要:

    1 加Salt散列
    2 ASP.NET 2.0 Membership中與密碼散列有關(guān)的代碼

    聲明:本文所羅列之源代碼均通過Reflector取自.NET Framework類庫,引用這些代碼僅出于學(xué)習(xí)和研究的目的。

    其實(shí),對密碼進(jìn)行散列存儲不是一個新鮮話題了,解決起來也不是很難,但很多人還是不大了解。這個小文只是強(qiáng)調(diào)一下“加Salt散列”這個簡單的技術(shù),并給出ASP.NET Membership所使用的代碼。

    本來打算寫一篇介紹如何實(shí)現(xiàn)用戶登錄功能的文章的,但因?yàn)闀r間有限,所以先介紹一下密碼的散列,下一篇再介紹用戶登錄。

    ----

    1 密碼必須散列存儲

    (內(nèi)容略)

    2 加Salt散列

    我們知道,如果直接對密碼進(jìn)行散列,那么黑客(統(tǒng)稱那些有能力竊取用戶數(shù)據(jù)并企圖得到用戶密碼的人)可以對一個已知密碼進(jìn)行散列,然后通過對比散列值得到某用戶的密碼。換句話說,雖然黑客不能取得某特定用戶的密碼,但他可以知道使用特定密碼的用戶有哪些。

    加Salt可以一定程度上解決這一問題。所謂加Salt,就是加點(diǎn)“佐料”。其基本想法是這樣的——當(dāng)用戶首次提供密碼時(通常是注冊時),由系統(tǒng)自動往這個密碼里撒一些“佐料”,然后再散列。而當(dāng)用戶登錄時,系統(tǒng)為用戶提供的代碼撒上同樣的“佐料”,然后散列,再比較散列值,已確定密碼是否正確。

    這里的“佐料”被稱作“Salt值”,這個值是由系統(tǒng)隨機(jī)生成的,并且只有系統(tǒng)知道。這樣,即便兩個用戶使用了同一個密碼,由于系統(tǒng)為它們生成的salt值不同,他們的散列值也是不同的。即便黑客可以通過自己的密碼和自己生成的散列值來找具有特定密碼的用戶,但這個幾率太小了(密碼和salt值都得和黑客使用的一樣才行)。

    下面詳細(xì)介紹一下加Salt散列的過程。介紹之前先強(qiáng)調(diào)一點(diǎn),前面說過,驗(yàn)證密碼時要使用和最初散列密碼時使用“相同的”佐料。所以Salt值是要存放在數(shù)據(jù)庫里的。


    用戶注冊時:

    1)用戶提供密碼(以及其他用戶信息);
    2)系統(tǒng)為用戶生成Salt值;
    3)系統(tǒng)將Salt值和用戶密碼連接到一起;
    4)對連接后的值進(jìn)行散列,得到Hash值;
    5)將Hash值和Salt值分別放到數(shù)據(jù)庫中。


    登錄時:
    1)用戶提供用戶名和密碼;
    2)系統(tǒng)通過用戶名找到與之對應(yīng)的Hash值和Salt值;
    3)系統(tǒng)將Salt值和用戶提供的密碼連接到一起;
    4)對連接后的值進(jìn)行散列,得到Hash'(注意有個“撇”);
    5)比較Hash和Hash'是否相等,相等則表示密碼正確,否則表示密碼錯誤。

    3 ASP.NET 2.0 Membership中的相關(guān)代碼
    (省略關(guān)于Membership的介紹若干字)
    本文Anders Liu僅研究了SqlMembershipProvider,該類位于System.Web.dll,System.Web.Security命名空間中。
    首先,要使用Membership,必須先用aspnet_regsql.exe命令來配置數(shù)據(jù)庫,該工具會向現(xiàn)有數(shù)據(jù)庫中添加一系列表和存儲過程等,配置好的數(shù)據(jù)庫中有一個表aspnet_Membership,就是用于存放用戶帳戶信息的。其中我們所關(guān)注的列有三個——Password、PasswordFormat和PasswordSalt。

    Password存放的是密碼的散列值,PasswordFormat存放用于散列密碼所使用的算法,PasswordSalt就是系統(tǒng)生成的Salt值了。

    網(wǎng)站安全了,程序自然也就復(fù)雜了...
         discuz的加密方式:md5(md5($password).$salt),$salt是一個6位隨機(jī)數(shù)。
         注冊的時候,把用戶的密碼用md5(md5($password).$salt)加密,$salt是一個6位隨機(jī)數(shù)字,下面是我的一個獲取6位隨機(jī)數(shù)的一個方法:
         function randstr($len=6) {
         $chars='abcdefghijklmnopqrstuvwxyz0123456789';
    // characters to build the password from
         mt_srand((double)microtime()*1000000*getmypid());
    // seed the random number generater (must be done)
         $password='';
         while(strlen($password)<$len)
             $password.=substr($chars,(mt_rand()%strlen($chars)),1);
         return $password;
    }
         $salt=randstr();把randstr()賦值給$salt,然后用md5(md5(會員提交的密碼).$salt)加密就可以了,但是千萬不要忘了把$salt入庫哦(uc_members表)。
         登陸的時候根據(jù)用戶名把$salt取出來,用md5(md5(會員提交的密碼).$salt)匹配密碼,如果一樣就登陸成功了

    posted @ 2011-11-29 09:40 陳小東 閱讀(1009) | 評論 (2)編輯 收藏

    繼承的優(yōu)缺點(diǎn)
    優(yōu)點(diǎn)
    新的實(shí)現(xiàn)很容易,因?yàn)榇蟛糠质抢^承而來的
    很容易修改和擴(kuò)展已有的實(shí)現(xiàn)

    缺點(diǎn)
    打破了封裝,因?yàn)榛愊蜃宇惐┞读藢?shí)現(xiàn)細(xì)節(jié)
    白盒重用,因?yàn)榛惖膬?nèi)部細(xì)節(jié)通常對子類是可見的
    當(dāng)父類的實(shí)現(xiàn)改變時可能要相應(yīng)的對子類做出改變
    不能在運(yùn)行時改變由父類繼承來的實(shí)現(xiàn)
    由此可見,組合比繼承具有更大的靈活性和更穩(wěn)定的結(jié)構(gòu),一般情況下應(yīng)該優(yōu)先考慮組合。只


    有當(dāng)下列條件滿足時才考慮使用繼承:
    子類是一種特殊的類型,而不只是父類的一個角色
    子類的實(shí)例不需要變成另一個類的對象
    子類擴(kuò)展,而不是覆蓋或者使父類的功能失效

    posted @ 2011-11-29 09:37 陳小東 閱讀(2601) | 評論 (2)編輯 收藏


    posts - 34, comments - 38, trackbacks - 0, articles - 0

    Copyright © 陳小東

    主站蜘蛛池模板: 免费看国产一级片| 亚洲高清在线播放| 日本免费一区二区久久人人澡| 亚洲av激情无码专区在线播放| 黄页网站免费观看| 美女被爆羞羞网站在免费观看| 久久精品国产亚洲一区二区| 一二三四免费观看在线电影| 人禽伦免费交视频播放| 亚洲第一网站免费视频| 亚洲高清无码综合性爱视频| 一区二区三区四区免费视频 | 亚洲一区二区免费视频| 国产男女猛烈无遮挡免费网站| 国产免费无码一区二区| 亚洲色丰满少妇高潮18p| 欧洲亚洲国产清在高| 国产精品国产午夜免费福利看| 久久久久久一品道精品免费看| 亚洲日韩在线中文字幕综合 | 可以免费观看一级毛片黄a| 久久免费视频99| 一级毛片免费不卡直观看| 亚洲资源在线视频| 久久久久亚洲?V成人无码| 免费A级毛片无码免费视| 免费91麻豆精品国产自产在线观看| 亚洲AV成人一区二区三区观看| 老色鬼久久亚洲AV综合| 亚洲最大AV网站在线观看| 国产精品免费看久久久久| 99在线精品免费视频九九视| 伊人久久大香线蕉免费视频| 精品在线免费视频| 亚洲中文字幕无码av在线| 亚洲一区二区在线免费观看| 亚洲乱码中文字幕综合| 亚洲成av人在片观看| 日本高清免费不卡在线| 成人奭片免费观看| 亚洲黄色免费在线观看|