Jak uciec od apostrofu (') w MySql?

146

Dokumentacja MySQL mówi, że tak powinno być \'. Jednak zarówno scite, jak i mysql pokazują, że ''działa. Widziałem to i działa. Co powinienem zrobić?

user4951
źródło
Mówisz, czy ''czy \'jest poprawna?
Raptor,
\'jest specyficzny dla MySQL, podczas gdy ''jest zgodny z ANSI SQL, jeśli się nie mylę
apokryfos
W zależności od implementacji SQL; - '' \ '', '\' ', a czasem' [']' 'pozwolą na wyrwanie się z kodu. Poza tym dowolna liczba zamienników Unicode ominie tę kontrolę. Cała gra tutaj nadużywa jakości ucieczki opartej na tym, że wymaga ona, aby ostateczne obliczenie było raczej parzyste niż nieparzyste. Jeśli okaże się to dziwne, łącząc ze sobą wiele metod ucieczki, możesz pokonać ucieczkę i wstrzyknąć surowy SQL. Morał z tej historii: NIGDY nie używaj interpolacji ciągów, ZAWSZE używaj przygotowanych instrukcji.
Shayne

Odpowiedzi:

185

Cytowana przez ciebie dokumentacja MySQL mówi nieco więcej, niż wspominasz. Mówi również:

'” Wewnątrz ciągu cytowanego za pomocą „ '” można zapisać jako „ ''”.

(Ponadto utworzono link do tabeli 8.1 w wersji MySQL 5.0. Sekwencje specjalne znaków specjalnych , a aktualna wersja to 5.6 - ale aktualna tabela 8.1. Sekwencje specjalne znaków specjalnych wyglądają całkiem podobnie).

Myślę, że notatka Postgres dotycząca backslash_quote (string)parametru ma charakter informacyjny:

Określa, czy cudzysłów może być reprezentowany przez \'literał ciągu. Preferowanym sposobem przedstawiania cudzysłowu w standardzie SQL jest jego podwojenie ( ''), ale PostgreSQL również w przeszłości akceptował \'. Jednak użycie \'stwarza zagrożenia bezpieczeństwa ...

To mówi mi, że użycie podwójnego znaku pojedynczego cudzysłowu jest lepszym ogólnym i długoterminowym wyborem niż użycie odwrotnego ukośnika w celu uniknięcia pojedynczego cudzysłowu.

Teraz, jeśli chcesz dodać do równania również wybór języka, wybór bazy danych SQL i jej niestandardowych dziwactw oraz wybór struktury zapytania, możesz skończyć z innym wyborem. Nie podajesz zbyt wielu informacji o swoich ograniczeniach.

Jim DeLaHunt
źródło
42

Standardowy SQL używa podwójnych cudzysłowów; MySQL musi to zaakceptować, aby był w miarę zgodny.

'He said, "Don''t!"'
Jonathan Leffler
źródło
+1. Gdzie jest napisane
user4951
Mówi „może” zamiast „powinno”, ale informacja jest tam (pod tabelą): Istnieje kilka sposobów umieszczania znaków cudzysłowu w ciągu: „ '” wewnątrz ciągu cytowanego z „ '” może być zapisane jako „ ''” . „ "” Wewnątrz ciągu cytowanego za pomocą „ "” można zapisać jako „ ""”. Poprzedź cudzysłów znakiem zmiany znaczenia („„ ”).
Jonathan Leffler
1
To najlepszy sposób na uniknięcie apostrofu poprzez jego podwojenie.
Alex _TNT
10

Uważam, że user2087510 miał na myśli:

name = 'something'
name = name.replace("'", "\\'")

Użyłem tego również z powodzeniem.

user3169788
źródło
1
U mnie zadziałało, podczas gdy te najlepsze odpowiedzi nie
Jared
1
dlaczego \\ 'zamiast \'?
biniam
@biniam_Ethiopia drugi \ ucieka przed pierwszym
Juha Untinen
2
możliwy problem z bezpieczeństwem. może uzyskać wstrzyknięcie sql, jeśli ciąg już zawiera \ ', więc wstawiasz \, który teraz znajduje się w ciągu jako \\', co zakończy ciąg. Zamiast tego użyj name.replace ("'", "' '")
Garr Godfrey
6

po prostu napisz ''zamiast 'mam na myśli dwa razy'

MRRaja
źródło
1
użyj apostrofu dwa razy zamiast jednego
MRRaja
5

Oto przykład:

SELECT * FROM pubs WHERE name LIKE "%John's%"

Po prostu użyj podwójnych cudzysłowów, aby ująć pojedynczy cudzysłów.

Jeśli nalegasz na używanie pojedynczych cudzysłowów (i potrzebujesz zmiany znaczenia znaku):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'
Overkillica
źródło
4

Są trzy sposoby, których jestem świadomy. Pierwsza nie jest najładniejsza, a druga jest powszechna w większości języków programowania:

  1. Użyj innego pojedynczego cytatu: 'I mustn''t sin!'
  2. Użyj znaku ucieczki \przed pojedynczym cudzysłowem' :'I mustn\'t sin!'
  3. Użyj podwójnych cudzysłowów, aby ująć ciąg znaków zamiast apostrofów: "I mustn't sin!"
Robert Rocha
źródło
Moje osobiste preferencje byłyby takie, \'jak jest używane w wielu językach programowania, ale ''jest obsługiwane przez więcej dialektów SQL, więc użycie opcji 1 jest lepsze ze względu na kompatybilność. Na przykład Sqlite nie działa ze znakami ucieczki odwrotnym ukośnikiem.
okdewit
0

Wymień sznurek

value = value.replace(/'/g, "\\'");

gdzie wartość to ciąg znaków, który będzie przechowywany w bazie danych.

Dalej,

Pakiet NPM do tego możesz zajrzeć

https://www.npmjs.com/package/mysql-apostrophe

Ashutosh Jha
źródło
Proszę, nie publikuj w odpowiedzi tylko jakiegoś narzędzia lub biblioteki. Przynajmniej pokaż, jak rozwiązuje problem w samej odpowiedzi.
Baum mit Augen
To nie zadziała. Zapomniałeś uciec od rzeczy. replace (/ \ '/ g, "\\\'")
Michael
0

Myślę, że jeśli masz jakiś punkt danych z apostrofem, możesz dodać jeden apostrof przed apostrofem

na przykład. „To jest miejsce Johna”

Tutaj MYSQL zakłada dwa zdania „To jest miejsce Johna”

Możesz wpisać „To miejsce Jana”. Myślę, że to powinno działać w ten sposób.

Priyanka Pandhi
źródło
0

Prawdopodobnie nie na temat, ale może przyszedłeś tutaj, szukając sposobu na wyczyszczenie tekstu wprowadzanego z formularza HTML, aby gdy użytkownik wprowadził znak apostrofu, nie wyświetlał błędu podczas próby zapisania tekstu do SQL tabela oparta na bazie danych w bazie danych. Jest na to kilka sposobów i możesz również przeczytać o iniekcji SQL, ale prostą opcją w PHP jest użycie funkcji htmlspecialchars (), która zamieni wszystkie twoje apostrofy na 'to, co prawdopodobnie chcesz przechowywać tak czy siak.

Grindlay
źródło
Kodowanie nie służy do przechowywania, służy do wyświetlania. Korzystaj z przygotowanych wyciągów.
mickmackusa
Zgadzam się, że przygotowane oświadczenia to złoty standard bezpieczeństwa i niezawodności. Podkreślałem konkretny przypadek, w którym możesz chcieć przechowywać dane tekstowe jako HTML, w którym to przypadku moja metoda jest dodatkiem do używania powiązanych parametrów, a nie zamiast. Wejście HTML, wyjście HTML.
Grindlay