2011年4月29日星期五

ASP.NET中如何防範SQL注入式攻擊

ASP.NET中如何防範SQL注入式攻擊
1將sql中使用的一些特殊符號,如' -- /* ; %等用Replace()過濾;
2限制文字方塊輸入字元的長度;
3檢查用戶輸入的合法性;用戶端與伺服器端都要執行,可以使用正則。
4使用帶參數的SQL語句形式。



ASP.NET中如何防範SQL注入式攻擊


一、什麼是SQL注入式攻擊?

  所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字串,欺騙伺服器執行惡意的SQL命令。在某些表單中,使用者輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。常見的SQL注入式攻擊過程類如:

  ⑴ 某個ASP.NET Web應用有一個登錄頁面,這個登錄頁面控制著使用者是否有權訪問應用,它要求使用者輸入一個名稱和密碼。

  ⑵ 登錄頁面中輸入的內容將直接用來構造動態的SQL命令,或者直接用作存儲過程的參數。下麵是ASP.NET應用構造查詢的一個例子:

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"之類的內容。

  ⑷ 使用者輸入的內容提交給伺服器之後,伺服器運行上面的ASP.NET代碼構造出查詢用戶的SQL命令,但由於攻擊者輸入的內容非常特殊,所以最後得到的SQL命令變成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。

  ⑸ 伺服器執行查詢或存儲過程,將使用者輸入的身份資訊和伺服器中保存的身份資訊進行對比。

  ⑹ 由於SQL命令實際上已被注入式攻擊修改,已經不能真正驗證使用者身份,所以系統會錯誤地授權給攻擊者。

  如果攻擊者知道應用會將表單中輸入的內容直接用於驗證身份的查詢,他就會嘗試輸入某些特殊的SQL字串篡改查詢改變其原來的功能,欺騙系統授予存取權限。

  系統環境不同,攻擊者可能造成的損害也不同,這主要由應用訪問資料庫的安全許可權決定。如果用戶的帳戶具有管理員或其他比較高級的許可權,攻擊者就可能對資料庫的表執行各種他想要做的操作,包括添加、刪除或更新資料,甚至可能直接刪除表。

二、如何防範?

  好在要防止ASP.NET應用被SQL注入式攻擊闖入並不是一件特別困難的事情,只要在利用表單輸入的內容構造SQL命令之前,把所有輸入內容過濾一番就可以了。過濾輸入內容可以按多種方式進行。

  ⑴ 對於動態構造SQL查詢的場合,可以使用下面的技術:

  第一:替換單引號,即把所有單獨出現的單引號改成兩個單引號,防止攻擊者修改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'”不同的結果。

  第二:刪除使用者輸入內容中的所有連字號,防止攻擊者構造出類如“SELECT * from Users WHERE login = 'mas' -- AND password =''”之類的查詢,因為這類查詢的後半部分已經被注釋掉,不再有效,攻擊者只要知道一個合法的用戶登錄名稱,根本不需要知道使用者的密碼就可以順利獲得存取權限。

  第三:對於用來執行查詢的資料庫帳戶,限制其許可權。用不同的使用者帳戶執行查詢、插入、更新、刪除操作。由於隔離了不同帳戶可執行的操作,因而也就防止了原本用於執行SELECT命令的地方卻被用於執行INSERT、UPDATE或DELETE命令。

  ⑵ 用存儲過程來執行所有的查詢。SQL參數的傳遞方式將防止攻擊者利用單引號和連字號實施攻擊。此外,它還使得資料庫許可權可以限制到只允許特定的存儲過程執行,所有的用戶輸入必須遵從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。

  ⑶ 限制表單或查詢字串輸入的長度。如果使用者的登錄名字最多只有10個字元,那麼不要認可表單中輸入的10個以上的字元,這將大大增加攻擊者在SQL命令中插入有害代碼的難度。

  ⑷ 檢查用戶輸入的合法性,確信輸入的內容只包含合法的資料。資料檢查應當在用戶端和伺服器端都執行——之所以要執行伺服器端驗證,是為了彌補用戶端驗證機制脆弱的安全性。

  在用戶端,攻擊者完全有可能獲得網頁的原始程式碼,修改驗證合法性的腳本(或者直接刪除腳本),然後將非法內容通過修改後的表單提交給伺服器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在伺服器端也執行驗證。你可以使用許多內建的驗證物件,例如RegularExpressionValidator,它們能夠自動生成驗證用的用戶端指令碼,當然你也可以插入伺服器端的方法調用。如果找不到現成的驗證物件,你可以通過CustomValidator自己創建一個。

  ⑸ 將使用者登錄名稱、密碼等資料加密保存。加密使用者輸入的資料,然後再將它與資料庫中保存的資料比較,這相當於對使用者輸入的資料進行了“消毒”處理,使用者輸入的資料不再對資料庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。System.Web.Security.FormsAuthentication類有一個HashPasswordForStoringInConfigFile,非常適合於對輸入資料進行消毒處理。

  ⑹ 檢查提取資料的查詢所返回的記錄數量。如果程式只要求返回一個記錄,但實際返回的記錄卻超過一行,那就當作出錯處理。

2011年4月26日星期二

企業網站建設方法論

 1.企業網站需要靈魂
  伴隨互聯網的飛速普及,及相關建站軟體的日新月異,現如今建設一個企業網站已相當容易,即使是對技術一竅不通的小白也能依靠智慧軟體信手拈來,所以說,科技很給力。通過觀察不難發現,依靠上述這種簡單粗暴方式建設網站的企業不再少數,尤其是中小企業,分析原因有三個:一是與其“短平快”的經營思路有關;二是成本低廉;三是不重視。
  上周與國內某知名網站建設專家討論企業網站建設話題,其中談到的一點至今仍記憶猶新:企業網站需要靈魂。可以判斷:依靠上述那種依靠智慧軟體或簡單抄襲完成的網站一定是缺少靈魂的。
  那如何才能建立一個有靈魂的企業網站呢?在這之前,我們需要先知曉何為企業網站的靈魂?簡單說來就是:邏輯,想使用者之所想的邏輯,有效傳遞品牌價值的邏輯。
  如何才能做到想用戶之所想,並有效傳遞品牌價值呢?
  乍一想,可能會感覺無從下手,其實就是缺少方法論。剛剛在最新一期《銷售與市場》雜誌上看到一句很貼切的形容“模式”的話,即:有地圖者不迷路,有模式者不盲目。沒錯,模式,或者說方法論其實就是做事情的指南針。
  最近怠慢了博客更新,主要原因也是忙於公司網站改版,週末了,梳理梳理思路,也對近一段時間網站建設籌備工作做一個小總結、小分享。
  2.企業網站建設方法論
  近期與Google、百度兩位同學打交道比較多,以下是在兩位童鞋幫助下,集思廣益後總結整理出的一套有效的企業網站建設方法論,希望對各位熱愛網站運營的朋友有所參考價值,也歡迎各位拍磚、發言。
  第一步:目標明確
  建站之前首先要明確企業網站的目的是什麼,期待企業官網做什麼?如:是線上銷售?品牌資訊傳遞?資訊查詢?
  第二步:策略分析
  明確網站目標後,要開始目標受眾分析(來企業網站做什麼,興趣點是什麼)、自身現狀分析(品牌影響力如何,產品線如何、服務水準如何)及行業競品調研(行業對手都在怎麼做);
  第三步:方案制定
  通過綜合策略分析後,需要明確我們要做什麼(定義需求),以及如何實現。
  第四步:專案執行
  明確實現方案後,需要制定網站架構,開始創意設計、內容組織、程式開發等工作。
  第五步:維護和提高
  最後,網站上線後,還有更重要的工作:運營維護、資料監測、結果追蹤。這樣才能形成閉環,推動網站持續、穩定、向前發展。
  純文字的介紹可能不太直觀,繪製了一張示意圖(如下),可以對上述一攬子方法論一目了然。按此思路執行,有血有肉有靈魂的企業網站將水到渠成。

2011年4月21日星期四

有理想的程式師必須知道的15件事

作為程式師,要取得非凡成就需要記住的15件事。
1、走一條不一樣的路
在有利於自己的市場中競爭,如果你滿足於“泯然眾人矣”,那恐怕就得跟那些低工資國家的程式師們同場競技了。
2、瞭解自己的公司
以我在醫院、諮詢公司、物流企業以及大技術公司工作的經驗來看,這一點所言不虛。

不同公司的運營模式差異極大。如果你理解企業的運營模式,那你就不一樣了!在這家公司中(或者對客戶而言),你是參與業務運營的資產,你的工作能直接產生效益!

3、與最優秀的人為伍
很早以前,我喜歡打籃球,被分配到一個水準比較高的隊裡。一開始適應的確很困難,但環境的壓力越大(重大比賽),我的長進也就越明顯。

每個領域其實都一樣:你周圍人的水準(以及對你的期望)越高,你就會變得越優秀。

4、製造差異
每年學習一門新程式設計語言。為什麼不呢?不斷嘗試新事物,你關注的技術種類越多,腳下的路就越寬廣,你的職業生涯就會日新月異。不知道幾年後Java的趨勢如何?那就學習Clojure。學Ruby還是Python?這兩種語言都可以試試啊。然後你才能知道哪種語言更適合某個特定的項目。看,掌握的語言多了,才能在需要的時候信手拈來吧。

5、畏懼,是最大的敵人
還是直接從書中摘一句吧:“在畏懼中做出的職業規劃,很可能會讓自己後半輩子就一直被‘圈禁’在小隔斷裡,永遠不會有創造明天輝煌的時刻。沒錯,那樣是安全,但有意思嗎?”

6、要成為多面手
如果你掌握了所在領域的知識,那你只能是一名專業人士。用PHP程式設計?花點時間設置一台Apache伺服器,讓PHP和MySQL都跑起來。一直在用jQuery?試試Prototype。你懂了吧。

7、一個字:做
別指望別人過來教你該怎麼做,出去,自己學著去做!

8、找一位好老師
找一位好老師可以讓你在學習技術的時候有的放矢。作者給我們講述了別人是怎麼指導他學習的(順便說一句,作者在這本書裡講了很多個人經歷的小故事,他居然從一位演奏家轉行來做軟體發展!):“好好研究一下目錄服務,熟悉一種UNIX變體,然後再掌握一門指令碼語言。”

請記住這句禪宗諺語:“循路覓宗師,形影不相離,師知吾亦知,吾乃成宗師。”

9、主動教會別人
教會別人是一種最好的學習方式。寫一篇博客能幫你搞清楚一個問題。為此,你必須先掌握很多材料,同時還要有條有理地講給別人聽(寫作技能)。如書中所言:“要想知道自己是不是真的明白,你就講給別人聽聽。”

10、實踐,實踐,再實踐(訓練)
只有進行大量實踐(花大量的時間)才能掌握某種技術。看的很多,寫的很少,遇到問題,改一改,又去讀代碼,……(這樣下去是不行的)。

要特別警惕拖延症。其實,往往只要有了開頭就好辦了。

自我加壓,效果會更好。我曾在一篇博客中提到帕金森定律:緊張的時限可以讓你提高工作效率。為什麼不把這個定律用到學習上呢,比如說在y時間內學會x?

11、從小處入手
每天都取得一項小成果,每天都要堅持做(寫在博客上?)。這樣一來,你只能讓自己比昨天更進步,而不能說自己比上星期進步了一點。

12、享受過程
關注當下,而不是目標,享受那些在追逐未來目標的途中可能無暇顧及的小勝利。人總要生活在當下。我享受程式設計的過程,就像享受程式設計的結果一樣。

13、不要喪失危機感
越是成功,就越容易犯重大錯誤。永遠不要忘了危機感,特別是要認識到你今天所知道的,到了明天可能就會一文不值。過去的榮耀不能保你永遠無虞。

據書中所說,你最好是要讓自己能夠“通用”,而不要對哪種技術或哪個公司產生依賴。你所掌握的某些技能,甚至你的工作,到了明天都可能會變得毫無價值。因此要不斷提高/豐富/擴展自己的技能。

14、推銷自己
為某個項目貢獻自己的一份力量,寫一篇博客,共用自己的原始程式碼,成為對某個社區有用的人。
當然,做這些事可能需要激情,要看你的愛好,但這些事也會間接地推廣你的工作成果,證明你的實力,提高你的知名度。

15、關注市場
書中還提到了“預警極客”,也就是那些始終引領技術發展的人。這些人說過的話往往帶有預見性,他們提到事物也許過幾天就會成為頭條新聞。關注這些人,常看他們的Twitter和博客。

2011年4月11日星期一

想給有創業激情的程式師朋友們提供一點兒創業參考:

1:若想靠寫程式、做專案成功那基本上是選了艱難的創業道路,註定了失敗的概率是90%以上,一個軟體公司必須要有屬於自己的軟體產品,哪怕是再小的成熟產品也可以,賣出去的量大了也是一筆可觀的收入來源客戶人脈也會有了,最起碼公司沒單子沒項目也不會餓死,這方面我選擇了“通用許可權管理系統元件”每天可以有銷售業績,總不會淪落到餓死的程度,但是也不能指望靠這個吃個飽。
2:你必須要有一筆啟動資金,也不用很多例如有個20萬也可以,這錢最好是你自己賺來的而不是靠借來的,因為有賺錢的本事才適合經營公司,知道賺錢有多難後才有希望能經營好一家公司來幫大家一起賺錢,若是借來的錢就90%以上的概率等著賠個精光就可以了,然後再想辦法還錢就可以了。
3:創業你需要幾個死黨,他們願意跟你一起打拼,就是3個月公司沒收入也會繼續跟著你幹,3個月不發工資也不會跑路,不會因為別人能多給2000元的月薪就背叛了你和自己的公司,也不會因為其他雞毛竄皮的原因離你而去,創業最忌諱的是人員不穩定,心不齊,創業都需要一個艱難的摸索過程。
4:跟你創業的人也需要吃飯也需要養家糊口,並不是創業就是受苦受累不拿薪水,甚至是需要給創業的人更高的工資待遇,只有穩定的收入人家才會安心跟你一起創業,否則大家也不是SB,早晚都會跑光光的,人家憑什麼要跟你幹。
5:本來就賣不來錢的東西,不用非要等開了公司在嘗試賣錢,例如中國有14億人,1000人裡若有1個程式師,那就是1400000000人程式師是1400000,若10個人裡有一個購買通用許可權管理系統元件學習版本998元的,那就是14000套*998元==13972000元,其實賬算算都很可觀,但是未必會有10個人裡就有1個人購買,做生意沒那麼容易,讓別人購買你的東西非常難,把別人口袋裡的錢掏出來比登天還難一些。
6:想想是很好的事情,往往真實生活裡未必能行得通,就向通用許可權管理系統的推廣,也需要前後推廣10年才會真正佔領市場,需要一個長期的奮鬥,長期的宣傳,創業也是一樣,如不是技術高端或者市場新穎,否則都需要長久的奮鬥。
7:若現在打工時在公司裡混得一般,身邊的人對你的口碑一般,水準也一般,很難自己創業後就會有飛躍的變化,全國從南到北的人都差不多牛人都很多,甚至大家的水準都不差不多,更甚至大家的思想理念價值觀都差不多,現在的公司大家封建,到另外一家公司也同樣封建。
8:創業不能節約成本,該花錢要花,該買的東西要買,該用高薪的人就需要用高薪的人,否則不出活兒、折騰,用低成本的低能的開發人員其實就是浪費生命、浪費機會、浪費錢財,創業開公司不是為了省錢,是為了把事情做好,挖掘開拓更多的有價值的潛在客戶;帶著貓可以抓老鼠,想抓鹿就需要帶著老虎。
有一個很就簡單的例子,500元你那東西太貴了,我們公司有的是人,我讓開發人員開發6個月好了,何必購買你的東西,雖然開發出來的東西不太好用,但是也可以用,寧可讓一個開發人員開發6個月也不會捨得購買500元的軟體,甚至是誰服誰啊,我也能開發一個,我開發出來的會比你的還強,然後折騰2年後放棄了,就算開發出來了,也未必有長期推廣的能力。
若是產品,一個思想很好,想去推廣,想去創業,必須要考慮殘酷的事實,要經得起牛人的推敲,身邊的推廣實驗,效果的確良好,那就可以放手一搏是沒關係的,若連論證都經不起論證的,完全可以放棄創業,沒必要浪費寶貴的社會資源,該給誰打工就可以給誰打工了。