2008-10-30 13 views
69

Piszę funkcję wyszukiwania i wymyśliłem tę kwerendę za pomocą parametrów, aby zapobiec lub przynajmniej ograniczyć ataki SQL injection.Howto? Parametry i instrukcja LIKE SQL

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

Może być używany parametry tak: Jednak, kiedy go uruchomić poprzez mój program to niczego nie wrócić? lub czy są one ważne tylko w instancji takiej jak:

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%' (gdzie obiektem jest obiekt <string>).

EDYCJA: Konstruuję tę funkcję za pomocą VB.NET, czy ma to wpływ na składnię, którą wnieśliście?

Też, uruchomiłem to oświadczenie w SQL Server: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE% max% ') `i który zwraca wyniki.

Odpowiedz

71

Visual podstawowy kod będzie wyglądał mniej więcej tak:

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')") 

cmd.Parameters.Add("@query", searchString) 
+1

Jak zaznaczył Adam w swojej odpowiedzi, nie chroni to przed iniekcją SQL. Zapytanie należy sparametryzować. – DOK

+5

Czy możesz podać przykład, w którym nie zapobiega to iniekcji SQL? Z moich testów działa dobrze – John

+25

Nie jest otwarty na iniekcje "SQL", tylko iniekcji "LIKE". Oznacza to, że użytkownik może wprowadzić znaki specjalne, takie jak '%' '^' i '_', które' LIKE' będzie interpretować specjalnie. Oznacza to, że użytkownik może nie uzyskać tego, czego oczekuje od niektórych wyszukiwań. Na przykład poszukiwanie "mniej niż 1% tłuszczu" może zwrócić wynik "mniej niż 1% lekarzy zaleca to - jest pełne tłuszczu!". –

1

może trzeba złączyć% objawy ze swoim parametru, np .:

LIKE '%' || @query || "%"

Edytuj: Właściwie to może nie mieć żadnego sensu. Myślę, że mogłem źle zrozumieć twój problem.

23

trzeba zrobić:

LIKE '%' + @param + '%'

+0

+ 1 krótki i prosty –

+0

doskonałe rozwiązanie - dałoby to więcej niż +1 Jeśli to możliwe! Dzięki –

100

dobrze, pójdę z:

Dim cmd as New SqlCommand(
"SELECT * FROM compliance_corner"_ 
    + " WHERE (body LIKE @query)"_ 
    + " OR (title LIKE @query)") 

cmd.Parameters.Add("@query", "%" +searchString +"%") 
+0

To prawda, zaakceptowana odpowiedź dostarczona przez Johna ma niewłaściwą składnię! – Adam

+3

Nie jestem pewien, jak jego składnia jest niepoprawna, jego rozwiązanie działało dobrze. Mam funkcję, która konstruuje i zwraca instrukcję SQL do użycia w datatable lub cokolwiek innego. – Anders

+1

Dodatkowa uwaga: Składnia dla C# przy użyciu MySQLDataAdapter = da = new MySQLDataAdapter ("SELECT * FROM tableA WHERE fieldA = @fieldA"); da.SelectCommand.Parameters.AddWithValue ("@ fieldA", "%" + someValue + "%"); –

1

Czasami symbol używany jako symbol zastępczy % nie jest taki sam, jeśli wykonasz zapytanie z VB, jak przy uruchamianiu z MS SQL/Access. Spróbuj zmienić symbol zastępczy z % na *. To może zadziałać.
Jednakże, jeśli debugujesz i chcesz skopiować ciąg SQL bezpośrednio w MS SQL lub Access, aby go przetestować, może zajść potrzeba zmiany symbolu z powrotem na % w MS SQL lub Access w celu rzeczywistego zwrócenia wartości.

Nadzieja to pomaga

0

Spróbuj również w ten sposób

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%') OR title LIKE CONCAT('%',@query,'%'))") 
cmd.Parameters.Add("@query", searchString) 
cmd.ExecuteNonQuery() 

Używane Concat zamiast +