駭客的填空遊戲 SQL Injection
我相信會看到這篇的應該是對程式有點基礎概念,而且會去設計有關資料庫互動的程式
所以關於那領域的東西我就不多介紹了
不知你寫的資料庫語法是否常常習慣字串串接,如下
我必需先說明,這篇文章並不是教你怎去入侵他人的系統,而是如何去預防
資料隱碼是存在已久的問題(至少十幾年了,雖然比我的年紀還大,但也快差不多了)
會想打這一篇是在一些論壇上看到還是有人使用像上述那樣的 SQL 字串在存取資料庫
那會造成什麼樣的危害呢?我想我用最簡單的例子舉例好了(上面那參數太多了)
上面那段是一段許多初學者進行判斷登入時常常使用的語法,那這段倒底存在著什麼問題呢?你把該 account 欄位丟一個單引號 ' 試試你就知了,系統馬上跳出錯誤,為何呢?因為拼出來的字串如下
Select * From account=''' and password=''
我把字串前後的單引號全用紅色標示,你看出來問題了嗎?三個單引號,這個沒有任何跳脫字元,所以這段 sql 語法執行起來一定會報錯誤訊息
而駭客們只要透過輸入一個單引號就能快速判斷你的程式是否有常見的資料隱碼的問題了
那解決方式呢? php 有提供 addslashes 指令可以處理,ASP 的話我以前是都把一個單引號取代成兩個單引號(在 M$ 的 access, sql server 系列,跳脫字元就是重覆一次特殊字元就能跳脫了)
不過現在已經是 .Net 的時代了,不敢說已經沒人在用 ASP 了,但大多數的人都跳過來用 .Net 了吧,都已經到 .Net 了,那何不趁機改掉自己的壞習慣,學習 .Net 提供的 Parameters 指令
那事實上這問題不只存在於 ASP 或 PHP ,而是所有使用到資料庫的網路系統都要考慮的問題,那許多的程式都有提供這問題的 solution ,而且以 Google 搜尋 SQL Injection 有相當多的參考資料,其實不能說初學就忽視這問題,該讓這歷史的遺跡就此被掩埋...
Reference:
SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上)
SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(下)
PHP - Manual - addslashes
所以關於那領域的東西我就不多介紹了
不知你寫的資料庫語法是否常常習慣字串串接,如下
Dim strSQL As String = "Insert Into 學生資料表(學生編號,學生姓名,出生日期,連絡電話,連絡地址,年級,科目名稱,繳款方式,總學費,註冊日期,備註) Values('" & TextBox1.Text.Trim() & "','" & TextBox2.Text.Trim() & "','" & TextBox3.Text.Trim() & "','" & TextBox4.Text.Trim() & "','" & TextBox5.Text.Trim() & "','" & ComboBox1.Text.Trim() & "','" & ComboBox2.Text.Trim() & "','" & ComboBox3.Text.Trim() & "','" & TextBox9.Text.Trim() & "','" & DateTimePicker1.Text.Trim() & "','" & TextBox8.Text.Trim() & "'"如果會,你該好好讀有關資料隱碼 SQL Injection 的資訊
我必需先說明,這篇文章並不是教你怎去入侵他人的系統,而是如何去預防
資料隱碼是存在已久的問題(至少十幾年了,雖然比我的年紀還大,但也快差不多了)
會想打這一篇是在一些論壇上看到還是有人使用像上述那樣的 SQL 字串在存取資料庫
那會造成什麼樣的危害呢?我想我用最簡單的例子舉例好了(上面那參數太多了)
string sql = "Select * From account='" + Request["account"] + "' and password='" + Request["password"] + "'";
上面那段是一段許多初學者進行判斷登入時常常使用的語法,那這段倒底存在著什麼問題呢?你把該 account 欄位丟一個單引號 ' 試試你就知了,系統馬上跳出錯誤,為何呢?因為拼出來的字串如下
Select * From account=''' and password=''
我把字串前後的單引號全用紅色標示,你看出來問題了嗎?三個單引號,這個沒有任何跳脫字元,所以這段 sql 語法執行起來一定會報錯誤訊息
而駭客們只要透過輸入一個單引號就能快速判斷你的程式是否有常見的資料隱碼的問題了
那解決方式呢? php 有提供 addslashes 指令可以處理,ASP 的話我以前是都把一個單引號取代成兩個單引號(在 M$ 的 access, sql server 系列,跳脫字元就是重覆一次特殊字元就能跳脫了)
不過現在已經是 .Net 的時代了,不敢說已經沒人在用 ASP 了,但大多數的人都跳過來用 .Net 了吧,都已經到 .Net 了,那何不趁機改掉自己的壞習慣,學習 .Net 提供的 Parameters 指令
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click '新增按鈕功能 '資料庫連結部份使用DataReader的方法撰寫程式 Dim objCon As SqlConnection Dim objCmd As SqlCommand Dim strDbCon, strSQL_I As String objCon = New SqlConnection("Data Source=(local);Initial Catalog=TMS;Integrated Security=SSPI;") objCon.Open() ' 開啟資料庫連接 objCmd = New SqlCommand("Insert Into 學生資料表 (學生編號,學生姓名,出生日期,連絡電話,連絡地址,年級,科目名稱,繳款方式,總學費,註冊日期,備註) Values (@學生編號,@學生姓名,@出生日期,@連絡電話,@連絡地址,@年級,@科目名稱,@繳款方式,@總學費,@註冊日期,@備註)", objCon) objCmd.Parameters.AddWithValue("@學生編號", TextBox1.Text.Trim()) objCmd.Parameters.AddWithValue("@學生姓名", TextBox2.Text.Trim()) objCmd.Parameters.AddWithValue("@出生日期", TextBox3.Text.Trim()) objCmd.Parameters.AddWithValue("@連絡電話", TextBox4.Text.Trim()) objCmd.Parameters.AddWithValue("@連絡地址", TextBox5.Text.Trim()) objCmd.Parameters.AddWithValue("@年級", ComboBox1.Text.Trim()) objCmd.Parameters.AddWithValue("@科目名稱", ComboBox2.Text.Trim()) objCmd.Parameters.AddWithValue("@繳款方式", ComboBox3.Text.Trim()) objCmd.Parameters.AddWithValue("@總學費", TextBox9.Text.Trim()) objCmd.Parameters.AddWithValue("@註冊日期", DateTimePicker1.Text.Trim()) objCmd.Parameters.AddWithValue("@備註", TextBox8.Text.Trim()) objCmd.ExecuteNonQuery() objCon.Close() MsgBox("註冊成功!!") Call Show_Record() End Sub
那事實上這問題不只存在於 ASP 或 PHP ,而是所有使用到資料庫的網路系統都要考慮的問題,那許多的程式都有提供這問題的 solution ,而且以 Google 搜尋 SQL Injection 有相當多的參考資料,其實不能說初學就忽視這問題,該讓這歷史的遺跡就此被掩埋...
Reference:
SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上)
SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(下)
PHP - Manual - addslashes
留言
張貼留言