2011-01-10 16 views
15

Mam aplikację, w której wartości w polu tekstowym są wysyłane do bazy danych.Obsługa pojedynczego cudzysłowu w ciągu znaków SQL

Na przykład mam formularz z jednym polem (pole tekstowe). Kiedy naciśniesz przycisk OK, zawartość pola tekstowego zostanie wstawiona jako rekord do tabeli. Po prostu przycinam i wyodrębniam tekst pola tekstowego do zmiennej i przekazuję go do mojego ciągu SQL.

Problem polega na tym, że za każdym razem, gdy coś takiego jak "It's" lub "Friend's", pojedynczy cudzysłów jest identyfikowany jako koniec ciągu znaków. W Delphi widziałem coś takiego, aby uniknąć tego. Jakieś pomysły od ciebie?

+1

używasz parametryzacji zapytań? –

+0

Podczas gdy możesz bezpiecznie cytować tylko ciągi, powinieneś używać sparametryzowanych zapytań, jak sugeruje Mitch. – Gabe

+1

@Gabe: Zgaduję, że zadba o odpowiedź na swoje pytanie, zamiast rozwiązać prawdziwy problem. Injection SQL przychodzimy !!!! –

Odpowiedz

34

Nie kiedykolwiek zbudować SQL tak, to bardzo niebezpieczne (read this). parametry użytkowania, tj:

var command = new SqlCommand("select * from person where firstname = @firstname"); 
SqlParameter param = new SqlParameter(); 
param.ParameterName = "@firstname"; 
param.Value   = "testing12'3"; 
command.Parameters.Add(param); 
+1

Co robię to bardzo prosta aplikacja. Dlatego nie skorzystałem z tego. Dzięki Alot. – JCTLK

+9

@JCTLK: zrób to we właściwy sposób. małe aplikacje, które stają się coraz większe, jeśli okaże się, że są przydatne. Należy również zachować pełną podstawę kodu z wzorami, które powinny być kopiowane, a NIE wzorcami, które są niepożądane. –

+8

@JCTLK: To nie jest skomplikowane i ma * ogromne * korzyści w dłuższej perspektywie. –

-2

Nadzieja to pomoże ...

public static string DoQuotes(string sql) 
    { 
     if (sql == null) 
      return ""; 
     else 
      return sql.Replace("'", "''"); 
    } 
+3

Usunięcie komentarzy tutaj - wymknęły się spod kontroli i przyciągnęły ** wiele ** flag - wystarczająco dużo flag, aby automatycznie wykonać usuwanie. Podsumowanie: * wiele * osób uważa, że ​​podejście oparte na kwotowaniach jest wyjątkowo złym pomysłem, gdy parametry są tak proste i dużo bardziej niezawodne. Inne (OK, PO) nie zgadzają się. –

+0

Pomocne byłoby zobaczenie bardziej niezawodnego sposobu obsługi cytatów w tych okolicznościach, w których parametryzacja jest - z jakiejkolwiek niejasnej przyczyny - naprawdę niemożliwa. –

+3

Ta metoda sprawdza się w przypadku małych aplikacji osobistych, w których SQL Injection nie jest problemem. – Wayne

0

Zastosowanie .Replace("'","''''")

Na przykład

string name = txtName.Text.Replace("'","''''"); 

Teraz name mogą być przekazywane jako parametr w procedurze przechowywanej itp

Powiązane problemy