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ć?


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.


42

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

'He said, "Don''t!"'

+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.


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'


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%'

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!"

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


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.



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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.