V. Speacial Things:
N gn chn ki u tn công SQL Injection:
B n mu n gi m thi u c h i cho nh ng k t n công khi h đ a mã SQL nguy hi m vào các giá tr thông s l nh.
Nhi u ng d ng xây d ng các câu l nh SQL đ ng b ng cách phân tích các m u r i thành m t chu i l n. Cách ti p c n này phát sinh v n đ khi làm vi c v i d li u nh phân, và c ng d ng lên kh n ng m t k t n công có th th c thi mã SQL nguy hi m b ng cách “tiêm” nó vào m t giá tr thông s . Mã nguy hi m này có th đ c s d ng đ can thi p v̀o thông tin trong c s d li u ho c ngay c ch y m t ng d ng khác trên server. B n có th xem m t s ví d đ́ng s trên ćc server c s d li u t i http://www.owasp.org/asac/input_validation/sql.shtml.
ng n ch n v n đ này, b n nên xác nh n tính h p l c a đ u v̀o do ng i dùng cung c p, ki m tra r ng nó có ki u d li u đ́ng nh mong mu n, không d̀i kh́c th ng, v.v... Cách d nh t đ th c hi n đi u này là s d ng m t truy v n đ c-thông-s -hóa.
Các truy v n đ c-thông-s -h́a đ c s d ng cho t t c các l i g i th t c t n tr , nh ng b n c ng ć th s d ng chúng v i các l nh SQL đ ng. Trong tr ng h p th hai, b n ch c n l y m t l nh SQL bình th ng và thay th các giá tr đ ng v i các thông s (k t qu s trông gi ng nh ph n thân c a m t th t c t n tr đ n gi n). D i đây l̀ m t l nh SQL đ c-thông-s -hóa:
s d ng l nh này, b n c n thêm ćc đ i t ng Parameter t ng ng v̀o đ i t ng Command (v i các giá tr phù h p). Tr ng h p này yêu c u hai thông s (@CompanyName và @Phone).
ng d ng Console d i đây s d ng truy v n đ c-thông-s -h́a ǹy đ thêm m t b n ghi m i vào b ng Shippers c a c s d li u Northwind.
Public Module ParameterizedQuery
Private ConnectionString As String = "Data Source=localhost;" & _ "Integrated Security=SSPI;Initial Catalog=Northwind"
Public Sub Main()
' T o k t n i và câu l nh.
Dim Con As New SqlConnection(ConnectionString)
Dim UpdateSQL As String = "INSERT INTO Shippers " & _ "(CompanyName, Phone) VALUES (@CompanyName, @Phone)" Dim Cmd As New SqlCommand(UpdateSQL, Con)
' Thêm các thông s nh p.
Dim Param As SqlParameter = Cmd.Parameters.Add("@CompanyName", _ SqlDbType.NVarChar, 40)
Param.Value = "Test Company"
Param = Cmd.Parameters.Add("@Phone", SqlDbType.NVarChar, 24) Param.Value = "(503) 555-9931"
Try
' Th c thi câu l nh. Con.Open()
Dim Rows As Integer = Cmd.ExecuteNonQuery()
Console.WriteLine(Rows.ToString() & " row(s) affected.") Catch Err As Exception
Console.WriteLine(Err.ToString()) Finally
Con.Close() End Try
Console.ReadLine()
End Module