![]() |
||
Advance Member
![]() ![]() 加入日期: Apr 2004
文章: 336
|
引用:
大大的說明小弟有看懂,小弟順便複習該運算的定義 很詳細的解說,感恩
__________________
![]() |
||||||||
![]() |
![]() |
*停權中*
加入日期: Dec 2006
文章: 89
|
引用:
如果是考試最保險就是全寫 寫 inner join 不寫 join 寫 left outer join 不寫 left join 寫 right outer join 不寫 right join |
|||
![]() |
![]() |
Power Member
![]() ![]() 加入日期: Jan 2001 您的住址: Taipei
文章: 503
|
引用:
保險的作法就是不要用各DB獨特的語法,例如SQL Server的T-SQL,ACCESS的VB函數 而採用符合ANSI-SQL的語法,可參考SQL-89,SQL-92
__________________
![]() 此文章於 2008-05-14 08:04 PM 被 Devil 編輯. |
|
![]() |
![]() |
Advance Member
![]() ![]() 加入日期: Apr 2004
文章: 336
|
引用:
小弟想想這應該是比較保守的方法,多謝大大的提示
__________________
![]() |
|
![]() |
![]() |
Advance Member
![]() ![]() 加入日期: Apr 2004
文章: 336
|
引用:
小在這邊多謝大大的說明,我想不要用各獨特的語法應該是最保險的 至於大大說的ANSI-SQL的語法,小弟會利用GOOGLE大神找一些資料 畢竟資料處理這科不是只有DB而已,還有UML、JAVA程式等很多小弟第一次接觸的東西 這邊也多謝Devil大大的熱心幫小弟解惑
__________________
![]() |
|
![]() |
![]() |
Advance Member
![]() ![]() 加入日期: Apr 2004
文章: 336
|
小弟另外又有問題了,要再次麻煩版上熱心大大
----以下是題目----- 請舉例說明下列程式有何安全上之漏洞?並說明如何修補該安全漏洞。 Dim sql Sql=”SELECT * FROM WebUsers WHERE Username = = ’’’& username &’’’ AND Password = = ’’’ & password &’’’’’ Set rs=Conn.OpenRecordset(sql) If not rs.eof() then ‘user connected successfully’ end if ----以下是解答------ (1)攻擊者在密碼檔部分輸入Aa’ OR TRUE OR’,而程序如不過輸入做任何檢查和過濾,將會導致密碼失去效用。所以當攻擊者只要知道用戶帳號,就可以任何用戶登錄,進行違法行為。 SELECT * FROM WebUsers WHERE Username = = ’Bob’ AND Password = = ’ Aa’ OR TRUE OR’ (2)攻擊者把帳戶名設為’;DROP TABLE WebUsers--,將會刪除WebUser表均被刪除。 SELECT * FROM WebUsers WHERE Username = ’ ;DROP TABLE WebUsers-- AND Password = ’’ ----以下是小弟的問題------ 做到這種題目,小弟的第一個反應是錯愕,怎樣下手都不知道 我想這應該是我對程式語言不熟的原因(總覺得我像肉片一樣在SQL裝熟) 離題了∼∼ 第一個問題:解答第一點,為什麼輸入了Aa’ OR TRUE OR’的指令,就不產生任何驗證,那這整句話指令要怎樣解釋?Aa有代表什麼意思嗎? 第二個問題:針對解答第二點,針對;DROP TABLE WebUsers--AND Password = ’’ 的指令,小弟只知道在SQL中,「--」帶表示註解,所以用戶密碼因為被下注解而不會驗證,那用戶帳號的驗證是因為指令下了DROP,所以不會驗證嗎?另外在這指令中,Drop前面的分號在這邊有特殊意義嗎?因為小弟沒辦法理解為什麼要加分號 第三個問題:在SQL指令中,代表文字是不是都要用這符號 ' ' 代表? 抱歉一下又問了很多蠢問題,還煩請諸位大大幫小弟解惑,感恩
__________________
![]() |
![]() |
![]() |
*停權中*
加入日期: Nov 2002 您的住址: 東湖
文章: 1,688
|
引用:
1.這個安全漏洞如果以在下寫程式的經驗 要根治建議是直接掛Stored Procedure或是掛Transaction上去 不在程式下定義sql條件式-不過這個方式100%不會是考試的解答就是xp 2.'"&~&"'是sql下表示變數的方式 但是sql很蠢 解讀變數的方式是把變數代表的東西填進去之後再解讀整個字串.所以當填Aa’ OR TRUE OR’進去之後 sql在解讀時會把後面的Password = = ’ Aa’ OR TRUE OR’解讀為不管對錯都會回傳eof;另外一個;DROP TABLE WebUsers--也是因為同一個問題 sql會以";"為分界將sql切成兩個條件式,並在"If not rs.eof() then ‘user connected successfully’ end if"進行驗證前就將Table WebUsers整個刪除 |
|
![]() |
![]() |
*停權中*
加入日期: Nov 2002 您的住址: 東湖
文章: 1,688
|
引用:
這個是考試用的解法 在SQL底下稱為Cross Join 對DB Server而言 這是一個很傷效能的做法可以不用就不用 可以的話 在下會建議閣下考完試最好就忘了他(另外 Cross Join跟在下上面回覆的SQL Injection是SQL初心者常常會沒處理好的問題 要當心) 如果真的因為正規化沒做好 得要用這麼複雜的敘述句 建議是仿student先進的回覆 用Inner Query來達成 引用:
|
||
![]() |
![]() |
*停權中*
加入日期: Nov 2002 您的住址: 東湖
文章: 1,688
|
引用:
這裡打錯了 應該是"不管對錯都不會回傳eof" |
|
![]() |
![]() |
Power Member
![]() ![]() 加入日期: Jan 2001 您的住址: Taipei
文章: 503
|
引用:
1.就是很單純的[隱碼攻擊],你可以試著將Aa’ OR TRUE OR’帶入整個SQL Command看看會組合成什麼樣子的句子,結果可以解讀為,它將會使WHERE的條件式為true 可以上網找找看[隱碼攻擊],[SQL Injection]的資料 他的原理是,許多網頁程式設計師,喜歡使用連接字串的方式來撰寫SQL Command 這樣就給了攻擊者一個機會,讓他們可以在網頁上的文字方塊內輸入SQL Command並且執行 所以,千萬不要使用連接字串的方式撰寫SQL Command,而採用Parameter帶入參數的方法 2.Drop是屬於SQL DDL,作用在於刪除,分號是在於它要分段SQL Command,所以,分號之前是一段SQL Command,分號之後又是另一段SQL Command了
__________________
![]() |
|
![]() |
![]() |