\'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 „ ''”.
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.
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.
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'
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.
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.
''
czy\'
jest poprawna?\'
jest specyficzny dla MySQL, podczas gdy''
jest zgodny z ANSI SQL, jeśli się nie mylęOdpowiedzi:
Cytowana przez ciebie dokumentacja MySQL mówi nieco więcej, niż wspominasz. Mówi również:
(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: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.
źródło
Standardowy SQL używa podwójnych cudzysłowów; MySQL musi to zaakceptować, aby był w miarę zgodny.
źródło
'
” 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 („„ ”).Uważam, że user2087510 miał na myśli:
Użyłem tego również z powodzeniem.
źródło
po prostu napisz
''
zamiast'
mam na myśli dwa razy'
źródło
Oto przykład:
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):
źródło
Są trzy sposoby, których jestem świadomy. Pierwsza nie jest najładniejsza, a druga jest powszechna w większości języków programowania:
'I mustn''t sin!'
\
przed pojedynczym cudzysłowem'
:'I mustn\'t sin!'
"I mustn't sin!"
źródło
\'
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.Wymień sznurek
gdzie wartość to ciąg znaków, który będzie przechowywany w bazie danych.
https://www.npmjs.com/package/mysql-apostrophe
źródło
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.
źródło
W PHP lubię używać mysqli_real_escape_string (), która ucieka ze znaków specjalnych w ciągu znaków do użycia w instrukcji SQL.
zobacz https://www.php.net/manual/en/mysqli.real-escape-string.php
źródło
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.źródło