Piszę funkcję wyszukiwania i wymyśliłem to zapytanie przy użyciu parametrów, aby zapobiec lub przynajmniej ograniczyć ataki typu SQL injection. Jednak gdy uruchamiam go przez mój program, nic nie zwraca:
SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')
Czy można używać parametrów w ten sposób? czy też są ważne tylko w takim przypadku, jak:
SELECT * FROM compliance_corner WHERE body LIKE '%<string>%'
(gdzie <string>
jest obiekt wyszukiwania).
EDYCJA: Konstruuję tę funkcję w VB.NET, czy ma to wpływ na składnię, którą wnieśliście?
Uruchomiłem również tę instrukcję w SQL Server: SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE
% max% ') `i zwraca wyniki.
SQL
wstrzyknięcia, tylkoLIKE
zastrzyk. Oznacza to, że użytkownik może wprowadzić znaki specjalne, takie jak%
^
i,_
któreLIKE
będą specjalnie interpretowane. Oznacza to, że użytkownik może nie uzyskać tego, czego oczekuje w przypadku niektórych wyszukiwań. Na przykład wyszukiwanie'less than 1% fat'
może zwrócić wynik'less than 1% of doctors recommend this - it's full of fat!'
.searchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]")
Poleciłbym również zrobić , co pozwoli uniknąć iniekcji LIKE (o ile nie używasz klauzuli ucieczki).Cóż, poszedłbym z:
Dim cmd as New SqlCommand( "SELECT * FROM compliance_corner"_ + " WHERE (body LIKE @query )"_ + " OR (title LIKE @query)") cmd.Parameters.Add("@query", "%" +searchString +"%")
źródło
cmd.Parameters.Add
sięcmdLoad.Parameters.AddWithValue
czy jest jakiś problem? Rozumiem, że odpowiedź Jamesa pochodzi z 2008 roku :)musisz zrobić:
LIKE '%' + @param + '%'
źródło
Być może trzeba będzie połączyć znaki% z parametrem, np .:
LIKE '%' || @query || „%”
Edycja: Właściwie to może nie mieć żadnego sensu. Myślę, że mogłem źle zrozumieć twój problem.
źródło
Czasami symbol używany jako symbol zastępczy
%
nie jest taki sam, jeśli wykonujesz zapytanie z VB, jak podczas wykonywania go z MS SQL / Access. Spróbuj zmienić symbol zastępczy z%
na*
. To może zadziałać.Jeśli jednak debugujesz i chcesz skopiować ciąg SQL bezpośrednio w MS SQL lub Access, aby go przetestować, może być konieczna zmiana symbolu z powrotem na
%
w MS SQL lub Access, aby faktycznie zwracać wartości.Mam nadzieję że to pomoże
źródło
spróbuj też 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żyto Concat zamiast +
źródło