《最新十八章使用SQL整合网页与资料库PPT课件》由会员分享,可在线阅读,更多相关《最新十八章使用SQL整合网页与资料库PPT课件(72页珍藏版)》请在金锄头文库上搜索。
1、十八章使用十八章使用SQLSQL整合网页整合网页与资料库与资料库JavaScript 程式設計與應用:用於伺服器端的ASP環境本章大綱n大綱n本章說明如何使用SQL來進行ASP網頁與Access資料庫的整合,並有大量的實用範例,讓讀者知道如何經由網頁進行對資料庫的檢視、新增、修改、刪除等基本操作。n主題n18-1:ODBC與DSN簡介n18-2:網頁與資料庫整合的基本範例n18-3:使用SQL來檢視資料n18-4:使用SQL來新增、修改、刪除資料n18-5:資料隱碼(SQLInjection)2JavaScript 程式設計與應用:用於伺服器端的ASP環境JavaScript 程式設計與應用:
2、用於伺服器端的ASP環境JavaScript 程式設計與應用:用於伺服器端的ASP環境JavaScript 程式設計與應用:用於伺服器端的ASP環境JavaScript 程式設計與應用:用於伺服器端的ASP環境JavaScript 程式設計與應用:用於伺服器端的ASP環境JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN(2)n點選資料來源(ODBC),開啟視窗後,再點選系統資料來源名稱。9JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN(3)n說明n由系統資料來源名稱所設定的DSN,是屬於系統級的DSN,因此其他使用者(含網頁瀏覽者)也可以使用此
3、DSN。若要使用個人級的DSN,那麼就可以使用使用者資料來源名稱,但此設定並不適用於網頁瀏覽。10JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN(4)n點選新增,再選擇MicrosoftAccessDriver(*.mdb),請注意:不要誤選另一個很類似的選項DriverdoMicrosoftAccess(*.mdb)!11JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN(5)n輸入資料來源名稱,假設我們輸入的字串是dsn4test。12JavaScript 程式設計與應用:用於伺服器端的ASP環境設定DSN(6)n再按下選取,就可以選取對應的
4、Access資料庫,之後再一路點選確定,即可完成DSN的設定。13JavaScript 程式設計與應用:用於伺服器端的ASP環境MS資料庫的選擇nMSAccess並不是企業專用的資料庫引擎,因此效率並不是很好,而且也不支援許多大型的資料庫應有的功能,但是對於小型的網路應用而言(例如同時上線人數少於10人左右),Access還算堪用。nMSSQLServer是微軟推出的資料庫引擎,專門對付大型網路應用,是一般中小企業較常採用的資料庫。14JavaScript 程式設計與應用:用於伺服器端的ASP環境18-2:網頁與資料庫整合的基本範例n本小節介紹各種ASP與資料庫整合的方法。15JavaScri
5、pt 程式設計與應用:用於伺服器端的ASP環境ADOn在ASP程式設計裡,用來存取資料庫或表格資料的物件統稱ADO(ActiveXDataObjects)nADO是一個ASP內建的資料庫存取元件,可以經由JavaScript/JScript、VBScript等語言來控制資料庫的存取,並可連接多種資料庫,包括SQLServer、Oracle、Access等支援ODBC的資料庫。nADO主要包含Connection、Recordset及Command三種物件。16JavaScript 程式設計與應用:用於伺服器端的ASP環境Connection物件n使用ADO的Connection物件來進行資料庫
6、的檢視查詢,主要有以下四個步驟n建立資料庫連結,然後開啟資料庫。n執行SQL指令,並將查詢結果儲存於Recordset中:若是檢視查詢,我們可將結果存至RecordSet物件變數rs中,以便後續取用。n取得欄位名稱及內容:若是檢視查詢,我們可以使用下列的的方式來取得欄位名稱及內容等資訊。n關閉RecordSet及資料庫連結。17JavaScript 程式設計與應用:用於伺服器端的ASP環境建立並開啟資料庫n使用Server.CreateObject定義一個ADO的Connection物件,然後使用其Open的方法來開啟資料庫來源。n設定conn物件的ConnectionString性質來指定資
7、料庫。n連結到你想要連結的本機或遠端資料庫。最後再用conn物件的Open方法,來開啟資料庫conn=Server.CreateObject(ADODB.Connection);conn.Open();18JavaScript 程式設計與應用:用於伺服器端的ASP環境指定資料庫方法n直接指定Access資料庫在本機硬碟的路徑n指定DSN(資料來源名稱)n直接連結至SQLServer資料庫n直接連結至UNIX的MySQL資料庫conn.ConnectionString=DBQ=資料庫檔案;Driver=MicrosoftAccessDriver(*.mdb);Driverld=25;FIL=MS
8、Access;UID=*;PWD=*;conn.ConnectionString=資料來源名稱;conn.ConnectionString=Driver=SQLServer;Datebase=資料庫名稱;Server=位址;UID=*;PWD=*;conn.ConnectionString=Driver=MySQL;Datebase=資料庫名稱;Server=位址;UID=*;PWD=*;19JavaScript 程式設計與應用:用於伺服器端的ASP環境執行SQL指令n若是檢視查詢,我們可將結果存至RecordSet物件變數rs中,以便後續取用。n說明n以上的程式碼將SQL指令所查詢到的結果儲
9、存到Recordset物件rs中。若不是檢視查詢,則不需要將結果存放於變數rs。sql=Select*fromtestTable;rs=conn.Execute(sql);20JavaScript 程式設計與應用:用於伺服器端的ASP環境取得欄位名稱及內容(1)n若是檢視查詢,我們可以使用下列的的方式來取得欄位名稱及內容等資訊。指令指令說明說明rs.EOF是否已指到最後一筆資料,是為True,反之為Falsers.Fields.CountRecordSets的欄位數rs(i).Name第i個欄位的欄位名稱rs(欄位名稱)讀取某個特定欄位名稱的資料rs(i)第i個欄位的資料rs.MoveNext
10、將指標移到下一筆rs.MovePrev將指標移到上一筆rs.MoveFirst將指標移到第一筆rs.MoveLast將指標移到最後一筆21JavaScript 程式設計與應用:用於伺服器端的ASP環境取得欄位名稱及內容(2)n說明n要印出每一筆資料的每一個欄位名稱,可用下列典型程式碼:n印出每一筆資料的每一個欄位值,可以使用下列典型程式碼:n以上的程式碼由rs(i)讀取資料庫欄位的資料,rs.MoveNext()將Recordset的資料指標移到下一筆,經由rs.EOF來判斷是否已到了最末筆資料,並配合while迴圈即可得到所有查詢結果的資料。for(i=0;irs.Fields.Count;
11、i+)Response.write(rs(i).Name+);while(!rs.EOF)for(i=0;irs.Fields.Count;i+)Response.write(rs(i)+);Response.write(n);rs.MoveNext();22JavaScript 程式設計與應用:用於伺服器端的ASP環境關閉RecordSet及資料庫連結n範例程式碼如下:n說明n許多有關I/O的指令如果有open(),通常相對就會有close()這個函式,保障對特定I/O的控制權及釋放權。rs.Close();conn.Close();23JavaScript 程式設計與應用:用於伺服器端的A
12、SP環境範例18-1(1)n主題:以JScript進行資料庫列表nWebpage:remotehost,localhost,databasen說明n範例中使用直接指定資料庫在本機硬碟的路徑的方式來連結資料庫,其中的SQL指令SELECT*FROMtestTable代表從資料表testTable取出所有資料。n最後一筆資料的RealName欄位和Email欄位都未填入資料,但是RealName欄位的並無預設值,因此由資料庫抓回來的資料顯示為null;另,Email欄位的預設值是空字串,所以沒有印出任何東西。這些欄位的屬性可由Access資料表的設計檢視選單來設定。24JavaScript 程式設
13、計與應用:用於伺服器端的ASP環境範例18-1(2)n如果上述範例發生錯誤,一個可能的原因是:nOS是64-bit,而Access資料庫是32-bit,解決方案請見http:/mirlab.org/users/pony.chen/內的Win764-bit上如何使用32-bit的ODBC連結。25JavaScript 程式設計與應用:用於伺服器端的ASP環境將範例18-1改成DSN連結n若要使用DSN連結資料庫,首先我們必須先在伺服器設定DSN(詳細流程請見上一小節),然後就可以在ASP內經由DSN來指定資料庫(可以是近端或是遠端)。n以範例18-1而言,若要由DSN來連結資料庫,而不直接指定資
14、料庫,只要把下一列敘述:n改成下一列即可,其中dsn4test必須已被設定為指向test.mdb的ODBC資料來源。nWebpage:remotehost,localhostConn.ConnectionString=DBQ=+Server.MapPath(test.mdb)+;Driver=MicrosoftAccessDriver(*.mdb);Driverld=25;FIL=MSAccess;Conn.ConnectionString=dsn4test;26JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-3n主題:使用listQueryResult()函數進行查詢
15、nWebpage:remotehost,localhostn說明n此inc檔分別寫了適用於JScript和VBScript的函數,因此無論是使用JScript或VBScript的ASP網頁,都可以使用此包含檔來列出資料庫查詢的結果。n一般而言,SQL指令已經具有對資料庫進行檢視、新增、修改、刪除等功能,因此只要使用適當的SQL指令,再加上前述的方法,即可對資料庫進行完全的處理。27JavaScript 程式設計與應用:用於伺服器端的ASP環境18-3:使用SQL來檢視資料n本小節介紹查詢資料庫相關的SQL語法。28JavaScript 程式設計與應用:用於伺服器端的ASP環境SQL簡介nSQL
16、是結構化查詢語言(StructuredQueryLanguage)的簡稱,是由IBM公司於1970年代所發展出來,用於關連式資料庫(RelationalDatabases)當中的一種資料庫查詢語言,利用SQL可以用來進行各種與資料庫相關的處理,例如:n產生資料庫內的資料表n定義資料表內的欄位與相關資料型態n建立表格之間的關連性n對資料進行處理:新增、修改、刪除、查詢對資料進行統計29JavaScript 程式設計與應用:用於伺服器端的ASP環境SELECTn檢視資料庫的資料,使用的SQL主要指令是SELECT。n基本結構n說明nSELECT的欄位名稱為待查資料庫的欄位名稱。nFROM的資料表名
17、稱為待查資料庫的資料表名稱。nWHERE的條件式為設定查詢的條件式。nORDERBY的欄位名稱為欲排序的欄位,可將查詢的資料根據這些欄位來排序。指定多個欄位時,則以欄位名稱1排序,若其資料相同則再依欄位名稱2排序,依此類推。n中括號表示選擇性條件,也就是說只有SELECT和FROM是必要條件。SELECT欄位名稱1,欄位名稱2,.FROM資料表名稱1,資料表名稱2,.WHERE條件式ORDERBY欄位名稱1,欄位名稱2,.30JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(1)n我們以資料庫basketball.mdb為例,這個資料庫包含兩個資料表:nPlayer包
18、含球員的資料,其中TeamID是球員所隸屬的籃球隊代號(載明在Team資料表),Percentage是投籃的命中率。nTeam包含籃球隊的資料,其中WinNo是本季的贏球次數。31JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(2)nSELECT*FROMTeamn意義:所有球隊資料n說明:*代表Team資料表中所有的欄位n查詢結果:IDNameWinNo1台北隊122新竹隊73台中隊104南投隊125台南隊176高雄隊167澎湖隊1132JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(3)nSELECTTOP3*FROMTeamn意義:
19、所有球隊資料,但只抓前三筆n說明:TOP3代表只抓取前三筆資料。也可以使用TOP25percent等,代表抓取所有資料的前百分之二十五。n查詢結果:IDNameWinNo1台北隊122新竹隊73台中隊1033JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(4)nSELECTName,PercentageFROMPlayerWHERENickName=gavinsn意義:綽號為gavins的球員姓名及命中率n查詢結果:NamePercentage林政源55.6534JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(5)nSELECT*FROM
20、TeamWHERENamelike台%n意義:隊名以台開頭的球隊資料n說明:%代表任意長度的字串。n查詢結果:IDNameWinNo1台北隊123台中隊105台南隊1735JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(6)nSELECTName,PercentageFROMPlayerWHERENamelike陳_n意義:姓陳且名字有三個字的球員姓名及命中率n說明:_代表任意單一字元。n查詢結果:NamePercentage陳孜彬50.26陳俊傑44.65陳江村48.7636JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(7)nSELE
21、CTName,WinNoFROMTeamWHEREWinNo10n意義:勝場數大於10的球隊名稱及其勝場數n查詢結果:NameWinNo台北隊12南投隊12台南隊17高雄隊16澎湖隊1137JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(8)nSELECTName,WinNoFROMTeamWHEREWinNo10ORDERBYWinNoDESCn意義:勝場數大於10的球隊名稱及其勝場數,並根據勝場數由大到小排列n說明:若不加入DESC,則會進行由小到大的排序。n查詢結果:NameWinNo台南隊17高雄隊16南投隊12台北隊12澎湖隊1138JavaScript
22、程式設計與應用:用於伺服器端的ASP環境檢示資料範例(9)nSELECTTeamID,Name,PercentageFROMPlayerWHERETeamID=5ORDERBYPercentageDESCn意義:球隊代碼為5的球員命中率排行榜n查詢結果:TeamIDNamePercentage5邱中人67.455陳晴57.285林政源55.655張秤嘉49.775陳俊傑44.655葉佳慧33.3339JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(10)nSELECT*FROMPlayerORDERBYTeamID,PercentageDESCn意義:每一隊的球員命
23、中率排行榜n說明:列出結果會先按TeamID由小到大排序,再按Percentage由大到小排序。n查詢結果:IDNickNameNameTeamIDPercentage18Gao高名揚167.8812roland吳瑞千155.8713sony林頌華154.773ben陳孜彬150.2640JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(11)nSELECTcount(*)FROMTeamWHEREWinNo10n意義:勝場數大於10的球隊總數n說明:count()函數會計算資料筆數,資料庫會自動產生暫時的欄位名稱Expr1000。n查詢結果:Expr1000541J
24、avaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(12)nSELECTmax(Percentage)as最高命中率FROMPlayern意義:所有球員的最高命中率n說明:max(Percentage)函數會計算命中率最大值。由於使用了as最高命中率,資料庫會自動產生暫時的欄位名稱最高命中率。n查詢結果:最高命中率最高命中率88.9742JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(13)nSELECTTOP1Name,PercentageFROMPlayerORDERBYPercentageDESCn意義:具有最高命中率的球員資料n查詢結果
25、:NamePercentage洪鵬翔88.9743JavaScript 程式設計與應用:用於伺服器端的ASP環境檢示資料範例(14)nSELECTName,PercentageFROMPlayerWHEREPercentagein(SELECTmax(Percentage)FROMPlayer)n意義:具有最高命中率的球員資料n說明:功能同前一個範例,但是改用兩個SQL指令組合來達成同樣的效果。n查詢結果:NamePercentage洪鵬翔88.9744JavaScript 程式設計與應用:用於伺服器端的ASP環境GROUPBY與HAVINGn基本結構n說明nGROUPBY其後所接的欄位名稱為
26、需要聚合的欄位名稱。(所謂聚合,就是將相同欄位值的數筆資料合成一筆新資料。)。nHAVING其後所接的條件式,則會用在聚合後的資料篩選。SELECT欄位名稱1,欄位名稱2,.FROM資料表名稱1,資料表名稱2,.WHERE條件式GROUPBY欄位名稱1,欄位名稱2,.HAVING條件式ORDERBY欄位名稱1,欄位名稱2,.45JavaScript 程式設計與應用:用於伺服器端的ASP環境GROUPBY與HAVING範例(1)n意義:每個球隊的球員人數及平均命中率n說明:avg(Percentage)可以計算命中率平均值,類似的SQL聚合函數有Avg(平均值)、Count(筆數)、Max(最大
27、值)、Min(最小值)、StDev(母群體樣本標準差)、StDevp(母群體標準差)、Sum(總和)、Var(母群體樣本變異數)、VarP(母群體變異數)等。由於這是對於每個球隊的統計數字,所以必須用到群組指令GROUPBY。SELECTTeamID,count(*)as球員人數,avg(Percentage)as平均命中率FROMPlayerGROUPBYTeamID46JavaScript 程式設計與應用:用於伺服器端的ASP環境GROUPBY與HAVING範例(2)n查詢結果:TeamID球員人數球員人數平均命中率平均命中率1650.616666666666672125.883344.5
28、43333333333334165.555651.3556279.9757165.8747JavaScript 程式設計與應用:用於伺服器端的ASP環境GROUPBY與HAVING範例(3)n意義:每個球隊的球員人數,但只顯示球員人數大於2位的資料n說明:由於這是對於每個球隊的統計數字,所以必須用到群組指令GROUPBY,相關的條件則必須使用HAVING來指定。n查詢結果:TeamID球員人數球員人數163356SELECTTeamID,count(*)as球員人數FROMPlayerGROUPBYTeamIDHAVINGcount(*)248JavaScript 程式設計與應用:用於伺服器端
29、的ASP環境根據資料表關聯性檢視查詢(1)n意義:台北隊的球員資料n說明:由於兩個資料表都有Name欄位,所以我們必須使用Team.Name及Player.Name來區分不同資料表的欄位。另外,這兩個資料表的關聯性是由(Player.TeamID=Team.ID)所建立,所以在後續的範例中,我們會不斷使用這個查詢條件。SELECTTeam.Name,Player.Name,PercentageFROMPlayer,TeamWHERE(Team.Name=台北隊)and(Player.TeamID=Team.ID)49JavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性
30、檢視查詢(1)n查詢結果:NameNamePercentage台北隊陳孜彬50.26台北隊高名揚67.88台北隊李宜揚36.67台北隊林頌華54.77台北隊吳瑞千55.87台北隊吳志銘38.2550JavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性檢視查詢(2)n意義:高雄隊和台中隊的射手排行榜n查詢結果:NameNamePercentage台中隊陳江村48.76台中隊許嘉晉47.65台中隊林惠娟37.22高雄隊洪鵬翔88.97高雄隊許文豪70.98SELECTTeam.Name,Player.Name,PercentageFROMPlayer,TeamWHERE(
31、Player.TeamID=Team.ID)and(Team.NameIN(高雄隊,台中隊)ORDERBYTeam.Name,PercentageDESC51JavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性檢視查詢(2)n意義:每個球隊的相關統計數字n說明:由於這是對於每個球隊的統計數字,所以必須用到群組指令GROUPBY。同時由於被選取的欄位中,Team.Name和Team.WinNo都沒有用到任何聚合函數,所以在GROUPBY之後也必須要加上這兩個欄位。SELECTTeam.Nameas球隊名稱,Team.WinNoas贏場次數,count(*)as球員人數,
32、max(Percentage)as最高命中率,min(Percentage)as最低命中率,avg(Percentage)as平均命中率FROMPlayer,TeamWHERE(Player.TeamID=Team.ID)GROUPBYTeam.Name,Team.WinNo52JavaScript 程式設計與應用:用於伺服器端的ASP環境根據資料表關聯性檢視查詢(3)n查詢結果:球隊名稱球隊名稱贏場次數贏場次數球員人數球員人數 最高命中率最高命中率 最低命中率最低命中率平均命中率平均命中率台中隊10348.7637.2244.54333333333333台北隊12667.8836.6750.
33、61666666666667台南隊17667.4533.3351.355南投隊12165.5565.5565.55高雄隊16288.9770.9879.975新竹隊7125.8825.8825.88澎湖隊11165.8765.8765.8753JavaScript 程式設計與應用:用於伺服器端的ASP環境18-4:使用SQL來新增、修改、刪除資料n本小節介紹如何用SQL語法管理資料表。54JavaScript 程式設計與應用:用於伺服器端的ASP環境CREATETABLEn新增資料表:使用的SQL指令是CREATETABLEn基本結構n說明n如果新增的資料非一列可以表示的,就需要新增資料表。n
34、論壇中新增討論區就會使用這個指令新增討論區資料表。CREATETABLE資料表名稱(欄位名稱1欄位1資料型態,欄位名稱2欄位2資料型態,.)55JavaScript 程式設計與應用:用於伺服器端的ASP環境INSERTn新增資料:使用的SQL指令是INSERTn基本結構n說明n如果欄位名稱沒有指定完全,則資料庫會自動取用此欄位之預設值。n我們可由Access資料庫的設計檢視來檢視每一個欄位的預設值。INSERTINTO資料表名稱(欄位名稱1,欄位名稱2,.)VALUES(欄位1的資料,欄位2的資料,.)56JavaScript 程式設計與應用:用於伺服器端的ASP環境UPDATEn修改資料:使
35、用的SQL指令是UPDATEn基本結構n說明n用來修改資料表欄位中的值。n網站上修改會員個人資料時會用到。UPDATE資料表名稱SET欄位名稱1=欄位1的資料,欄位名稱2=欄位2的資料,.WHERE條件式57JavaScript 程式設計與應用:用於伺服器端的ASP環境DELETEn刪除資料:使用的SQL指令是DELETEn基本結構n說明n如果沒有指定任何條件式,此SQL指令會刪除一個資料表內的所有紀錄,所以要特別小心。n管理Blog時刪除文章會用到。DELETEFROM資料表名稱WHERE條件式58JavaScript 程式設計與應用:用於伺服器端的ASP環境DROPTABLEn刪除資料表:
36、使用的SQL指令是DROPTABLEn基本結構n說明n在論壇管理系統中,要刪除某個討論區會用到。DROPTABLE資料表名稱59JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-5n主題:對資料表進行修改、刪除動作。nWebpage:remotehost,localhostn說明n範例中所做的事情n建立一個資料表friend。n插入兩筆資料。n刪除一筆資料。n更新一筆資料。n刪除資料表friend。n範例中,如果顯示的欄位值是null,代表我們當初在新增資料時,並沒有設定相關欄位值,資料庫也沒有預設值,所以才會回傳null。60JavaScript 程式設計與應用:用於伺
37、服器端的ASP環境範例18-6n主題:可隨時對資料表進行修改刪除的範例nWebpage:remotehost,localhostn說明n這個範例,可以讓你在網頁上嘗試各種查詢動作,例如新增、修改、刪除等。n使用Access資料庫的另一個好處是,它提供了一個圖形化的查詢介面,可以使用這個查詢介面產生的要的查詢結果,再將此查詢方法轉成SQL的語法,此時就可以將此SQL語法直接貼到的ASP程式碼,對於產生複雜的SQL語法非常好用。61JavaScript 程式設計與應用:用於伺服器端的ASP環境小秘訣n使用ASP整合資料庫時,可參考下列小秘訣n資料庫內的資料表名稱及欄位名稱,最好是英文,且中間不可留
38、白。n欄位名稱最好複雜一點,以免和資料庫的內建關鍵字相衝。n文字欄位的預設值最好是空字串,不要不設定預設值。n在Access內,除非你的欄位資料量超過255個字元,否則盡量不要用到memo欄位,因為memo欄位不支援排序,也不支援萬用字元(如*或?等)。62JavaScript 程式設計與應用:用於伺服器端的ASP環境萬用字元n在Access內執行SQL指令時,有兩個最重要的萬用字元n?:比對一個字元n*:比對多個字元n說明n若要在ASP的程式碼內使用SQL的萬用字元,必須將?改為_,*改為%,以符合一般SQL語言的標準規範。63JavaScript 程式設計與應用:用於伺服器端的ASP環境1
39、8-5:資料隱碼(SQLInjection)n本小節介紹各種因為ASP與資料庫整合時的疏失,使得他人可以使用非法途徑來取的資料庫內容,或者進行其它侵入。64JavaScript 程式設計與應用:用於伺服器端的ASP環境SQLInjection簡介n資料隱碼(SQLInjection)臭蟲,簡單地說,就是將帳號和密碼欄位填入具有單引號的特殊字串,造成伺服器端在接合這些欄位資料時,會意外地產生合格的SQL指令,造成密碼認證的成功。n要特別注意的是,SQLInjection的問題不限只發生在哪種特定平台或語言,只要是使用SQL指令存取資料庫內的資料,都有可能產生這個問題。65JavaScript 程
40、式設計與應用:用於伺服器端的ASP環境範例18-7(1)n主題:以資料庫內之資料進行密碼認證:基本篇nWebpage:remotehost,localhostn程式碼重點n說明n看起來一切沒問題,但是如果你想駭(Hack!)這個網站,事實上只要輸入下列資料就可以了:n帳號:*(亂打一通)n密碼:ora=aSQL=select*frompasswordwhereuserid=+Request(user)+andpasswd=+Request(passwd)+;66JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-7(2)n說明n當輸入帳號和密碼分別是林政源和gavins時,
41、可以從資料庫中查到一筆資料,代表帳號和密碼正確,所得到的SQL指令是n當帳號和密碼分別是xyz和ora=a時,所產生的SQL指令也會執行成功(因為a=a是一定成立的)n在SQL語法的條件式中,會先執行and,再執行or。SQL=select*frompasswordwhereuserid=林政源andpasswd=gavins;SQL=select*frompasswordwhereuserid=xyzandpasswd=ora=a;67JavaScript 程式設計與應用:用於伺服器端的ASP環境避免SQLInjectionn最簡單的作法,就是在取用客戶端送進來的資料前,先刪除所有可能造成問
42、題的特殊字元。n這些字元包括單引號()、雙引號(“)、問號(?)、星號(*)、底線(_)、百分比(%)、ampersand(&)等,這些特殊字元都不應該出現在使用者輸入的資料中。n刪除特殊字元的動作務必要在伺服器端進行,因為用戶端的JavaScript表單驗證的檢查是只能防君子,不能防小人,別人只要做一個有相同欄位的網頁,就一樣可以呼叫你的ASP程式碼來取用資料庫,進而避開原網頁的表單驗證功能。68JavaScript 程式設計與應用:用於伺服器端的ASP環境範例18-8n主題:使用replace()避免SQLInjectionnWebpage:remotehost,localhostn程式碼
43、重點n說明n在上述原始碼中,因為Request(userid)和Request(passwd)的資料是無法修改的,所以在取代前要先存到另一個個變數。由此範例可以知道,只要刪除使用者輸入字串中的所有單引號,就可以避免SQLInjection的問題。user=user.replace(/g,);passwd=passwd.replace(/g,);69JavaScript 程式設計與應用:用於伺服器端的ASP環境SQLInjection的搜索n在Google打入登入,再對需要登入的網站進行SQLInjection的測試,就應該可以找到一些不設防的網站。n請通知該網站管理員,並表示自己無惡意:我們研
44、習張智星老師的JavaScript程式設計與應用,對網路上的網頁進行 SQL Injection 的測試,發覺您的登入網頁(網址是 http:/xxx.xxx.xxx)並無法對抗 SQL Injection 的入侵,只要帳號任意設定、密碼設定為 or a=a,即可登入。這是一封善意的信,我們僅測試是否可以登入,並未對資料進行任何修改,請查照,謝謝。 (請寫出你的全名,以示負責,並將 email 副本給我,以便登記發問一次)70JavaScript 程式設計與應用:用於伺服器端的ASP環境參考資料n可以形成SQLInjection的惡意字串還不少,但大部分是針對微軟的SQLServer資料庫來進行破壞。n以下是參考資料:nSQLInjection的因應與防範之道.mhtn駭客的SQL填空遊戲(上).mhtn駭客的SQL填空遊戲(下).mht71结束语结束语谢谢大家聆听!谢谢大家聆听!72