2011-10-12 24 views
7

Mam ciągJak zamienić apostrof na podwójny apostrof w łańcuchu?

good overview of ESP's in more detail than you probably need.

Podczas wstawiania do tabeli SQL powoduje błąd. Więc chcę zastąpić apostrof w ciąg z podwójnym apostrofem jak

good overview of ESP''s in more detail than you probably need

Jak manipulować to w C#?

+1

Powinieneś użyć funkcji Escape bazy danych. Jeśli tego nie zrobisz, możesz zostawić się podatnym na zastrzyki SQL. http://stackoverflow.com/questions/249567/algorithm-to-avoid-sql-injection-on-mssql-server-from-c-code – CheeseSucker

+0

Albo jeszcze lepiej: sparametryzowane zapytania. – MatBailie

Odpowiedz

10

Bardzo proste:

string s = "good overview of ESP's in more detail than you probably need."; 
string escaped = s.Replace("'","''"); 

Uwaga: To jest zwykle bezpieczniejsze w użyciu parametrów poleceń. Zwłaszcza jeśli wartości ciągów wejściowych nie są kontrolowane przez twój kod (to jest wpisy użytkownika).

+3

Chociaż jest to technicznie poprawne, to kieruje oryginalnego pytającego w złym kierunku. Znacznie lepiej używać właściwych parametrów i unikać luk SQL injection. –

+0

Czy wstrzyknięcie może nadal występować, jeśli ciąg znaków jest chroniony? Injection, jak rozumiem, kończy przedwcześnie sql, używając jednej apostrofii. –

8

Użyj obiektu Parametr.

myCommand.InsertCommand.Parameters.Add("@myString", SqlDbType.VarChar, 200); 
    myCommand.InsertCommand.Parameters["@myString"].Value = @"good overview of ESP's in more detail than you probably need."; 
0

String.Replace(String,String) powinien działać poprawnie. W tym przykładzie, że chcesz:

String.Replace("'", "''") 

Jednak nie sądzę, że będzie rozwiązać problem. I wyobraź sobie, że bardziej odpowiedni szukasz:

String.Replace("'", "\'") 

Powodem tego jest, że MySQL, a ja sobie wyobrazić inne wersje SQL spodziewać struny być ujęty w apostrofy.

+0

Zgadzam się, że to bezpośrednio odpowiada na pytanie, ale pomaga OP w złym postępowaniu. Jeśli używane są sparametryzowane zapytania, problem ten ustępuje i przyjmuje praktykę, która chroni przed atakami wtrysku, pomaga w buforowaniu planów wykonania itp., Itp. – MatBailie

+0

@dambrisco: Niektóre dialekty SQL używają podwójnego apostrofu ('') zamiast ucieczki sekwencja (\ '), którą zasugerowałeś dla MySQL. –

+0

@Dems - W pełni się zgadzam, ale biorąc pod uwagę to pytanie, założyłem, że lepiej będzie, jeśli zrobię dziecinne kroki. Wyjaśnienie parametryzacji komuś, kto wydaje się nie wiedzieć o sekwencjach ucieczki, może być złym miejscem do rozpoczęcia. Niezależnie od tego byłoby znacznie lepiej wykorzystać rozwiązanie Daok niż moje. –

2

Pracowałem nad tym problemem od wieków. Zrób to na kliencie, zastępując pojedynczy cytat dwoma pojedynczymi cytatami. Działa to, jeśli wykonywany jest sp z kilkoma wejściowymi parametrami varchar. Jedynym problemem jest wstrzyknięcie SQL, czyli ludzie mogą zobaczyć, co robisz na kliencie, co nigdy nie jest dobre. Jedynym sposobem jest użycie SQLparameters na serwerze, tak jak powiedzieli wcześniej.

0

myCommand.InsertCommand.Parameters.Add ("@ myString", SqlDbType.VarChar, 200); myCommand.InsertCommand.Parameters ["@ myString"]. Wartość

Powiązane problemy