Tôi là một nhà phát triển máy tính để bàn viết cho người dùng nội bộ, vì vậy tôi không lo lắng về tin tặc độc hại, nhưng tôi muốn biết nếu có bất cứ điều gì họ có thể nhập khi cập nhật một giá trị sẽ thực thi sql trên máy chủ.Người dùng của tôi có thể tiêm sql động của tôi không?
Doanh nghiệp xác định lược đồ nội dung của họ và tôi có một ứng dụng CRUD cho họ không cần phải thay đổi khi thay đổi lược đồ của họ vì chi tiết xác thực được định hướng theo bảng và cập nhật bằng SQL động. Tôi phải hỗ trợ dấu nháy đơn trong mục nhập dữ liệu của họ, vì vậy khi họ nhập chúng, tôi tăng gấp đôi chúng trước khi SQL được thực thi trên máy chủ. Từ những gì tôi đã đọc, tuy nhiên, điều này không đủ để ngăn chặn tiêm.
Vì vậy, câu hỏi của tôi là, văn bản nào họ có thể nhập vào trường văn bản dạng tự do có thể thay đổi thứ gì đó trên máy chủ thay vì được lưu trữ dưới dạng giá trị bằng chữ?
Về cơ bản, tôi đang xây dựng một câu lệnh SQL trong thời gian chạy mà theo mẫu:
cập nhật bảng thiết lập trường = giá trị nơi pkField = pkVal
với mã này VB.NET:
Friend Function updateVal(ByVal newVal As String) As Integer
Dim params As Collection
Dim SQL As String
Dim ret As Integer
SQL = _updateSQL(newVal)
params = New Collection
params.Add(SQLClientAccess.instance.sqlParam("@SQL", DbType.String, 0, SQL))
Try
ret = SQLClientAccess.instance.execSP("usp_execSQL", params)
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
Return ret
End Function
Private Function _updateSQL(ByVal newVal As String) As String
Dim SQL As String
Dim useDelimiter As Boolean = (_formatType = DisplaySet.formatTypes.text)
Dim position As Integer = InStr(newVal, "'")
Do Until position = 0
newVal = Left(newVal, position) + Mid(newVal, position) ' double embedded single quotes '
position = InStr(position + 2, newVal, "'")
Loop
If _formatType = DisplaySet.formatTypes.memo Then
SQL = "declare @ptrval binary(16)"
SQL = SQL & " select @ptrval = textptr(" & _fieldName & ")"
SQL = SQL & " from " & _updateTableName & _PKWhereClauses
SQL = SQL & " updatetext " & _updateTableName & "." & _fieldName & " @ptrval 0 null '" & newVal & "'"
Else
SQL = "Update " & _updateTableName & " set " & _fieldName & " = "
If useDelimiter Then
SQL = SQL & "'"
End If
SQL = SQL & newVal
If useDelimiter Then
SQL = SQL & "'"
End If
SQL = SQL & _PKWhereClauses
End If
Return SQL
End Function
khi tôi cập nhật trường văn bản thành giá trị
Redmond '; thả bảng OrdersTable--
nó tạo ra:
Update caseFile set notes = 'Redmond''; drop table OrdersTable--' where guardianshipID = '001168-3'
và cập nhật các giá trị cho các giá trị văn chương họ đã nhập.
Họ có thể nhập mã SQL nào khác?
Một lần nữa, tôi không lo lắng ai đó muốn hack máy chủ trong công việc của họ, nhưng muốn biết làm thế nào nếu họ có thể vô tình dán văn bản từ một nơi khác và phá vỡ một cái gì đó.
Cảm ơn.
"Tôi không lo lắng ai đó muốn tấn công máy chủ tại nơi làm việc của họ" - bạn tốt hơn, nhân viên bất bình làm những kẻ tấn công khá khó chịu. –
Nếu bạn là một, bạn sẽ sử dụng sql nào? – Beth
+1 Để có câu hỏi hay. Đây là điều tôi đã tự hỏi về bản thân mình. Tôi đã nhìn thấy rất nhiều xác nhận mơ hồ trong sách giáo khoa về điều này là không đủ nhưng không bao giờ giải thích tại sao. Tôi sẽ rất vui nếu có ai đó có thể trả lời đúng với một ví dụ dứt khoát về đầu vào của người dùng có thể gây ra vấn đề. Tôi sẵn sàng đặt cược bây giờ rằng điều này sẽ không xảy ra mặc dù và hoàn thành câu trả lời không ** mà không giải quyết các câu hỏi rất cụ thể ** giới thiệu SQL parameterised sẽ được bình chọn lên hàng đầu. –