Jak uniknąć pojedynczych cudzysłowów w MySQL

98

Jak wstawić do MySQL wartość składającą się z pojedynczych lub podwójnych cudzysłowów. to znaczy

This is Ashok's Pen.

Pojedynczy cytat spowoduje problemy. Mogą istnieć inne znaki ucieczki.

Jak poprawnie wstawiasz dane?

Ashok Gupta
źródło
Może to być fałszywe. Jak mogę zapobiec iniekcji SQL w PHP? ...
Peter Mortensen

Odpowiedzi:

126

Mówiąc prościej:

SELECT 'This is Ashok''s Pen.';

Więc wewnątrz ciągu zamień każdy pojedynczy cytat na dwa z nich.

Lub:

SELECT 'This is Ashok\'s Pen.'

Escape it =)

Obrabować
źródło
9
Możesz chcieć zaktualizować swój post, aby zawierał mysql_real_escape_string () lub addlashes () jako możliwe rozwiązania ... tak jak w jednym z poniższych komentarzy, OP stwierdza, że ​​po prostu czytają z pliku i wstawiają.
James B
3
Metody mysql_ * nie są zalecane do użytku w przyszłości, ponieważ są przestarzałe .
hd1
To jest właściwa odpowiedź, chociaż obecnie najlepszą opcją jest użycie jednego z
Ryan,
10

'to znak ucieczki. Więc twój ciąg powinien być:

To jest Pióro Ashoka

Jeśli używasz jakiegoś kodu frontonu, przed wysłaniem danych do procedury składowanej musisz wykonać zamianę ciągu.

Na przykład w C # możesz to zrobić

value = value.Replace("'", "''");

a następnie przekazać wartość do procedury składowanej.

Użytkownik SO
źródło
Nie wstawiam danych ręcznie, wyodrębniam je z pliku i pojawią się vaklues: pióro Ashoka. Jak to włożyć. stworzyliśmy procedurę, jak to zrobić ... jak to naprawić.
Ashok Gupta
Dodatkowa nitka FWIW: ukośnik odwrotny to „znak ucieczki”; ''(dwa pojedyncze cudzysłowy) to specjalna alternatywa dozwolona dla „zmiany znaczenia” znaku pojedynczego cudzysłowu.
ToolmakerSteve
9

Zobacz moją odpowiedź na temat „Jak zmienić znaczenie znaków w MySQL”

Każda biblioteka, której używasz do rozmowy z MySQL, będzie miała wbudowaną funkcję ucieczki, np. W PHP możesz użyć mysqli_real_escape_string lub PDO :: quote

Paul Dixon
źródło
1
Nie wstawiam danych ręcznie, wyodrębniam je z pliku i będą tam wartości: pióro Ashoka. Jak to włożyć. stworzyłem procedurę, jak to zrobić… jak to naprawić.
Ashok Gupta
Tylko uwaga, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee
7

Jeśli korzystasz z przygotowanych instrukcji, sterownik obsłuży każdą ucieczkę. Na przykład (Java):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();
hd1
źródło
7

Użyj tego kodu:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

To rozwiąże problem, ponieważ baza danych nie może wykryć znaków specjalnych ciągu.

user3818708
źródło
1
Tylko uwaga, This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee
6

Jest na to inny sposób, który może być bezpieczniejszy lub nie, w zależności od twojej perspektywy. To wymaga MySQL 5.6 lub później z powodu korzystania z określonej funkcji strun: FROM_BASE64.

Powiedzmy, że masz tę wiadomość, którą chcesz wstawić:

„Ach,” Prawie Bezgłowy Nick machnął elegancką ręką, „sprawa bez znaczenia… To nie jest tak, że naprawdę chciałem się przyłączyć… Myślałem, że aplikuję, ale najwyraźniej nie spełniam wymagań "-"

Ten cytat zawiera kilka pojedynczych i podwójnych cudzysłowów i byłoby naprawdę trudne do wstawienia do MySQL. Jeśli wstawiasz to z programu, łatwo jest uniknąć cudzysłowów itp. Ale jeśli musisz umieścić to w skrypcie SQL, będziesz musiał edytować tekst (aby uniknąć cudzysłowów), który może być podatny na błędy lub wrażliwe na zawijanie słów itp.

Zamiast tego możesz zakodować tekst Base64, aby uzyskać „czysty” ciąg:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Kilka uwag na temat kodowania Base64:

  1. Kodowanie Base64 jest kodowaniem binarnym , więc lepiej upewnij się, że zestaw znaków jest poprawny podczas kodowania, ponieważ MySQL zdekoduje ciąg zakodowany w Base64 na bajty, a następnie zinterpretuje je. Upewnij się, że base64MySQL zgadzają się co do kodowania znaków (polecam UTF-8).
  2. Zawijałem ciąg do 50 kolumn, aby zapewnić czytelność na przepełnieniu stosu. Możesz zawinąć go do dowolnej liczby kolumn (lub w ogóle nie zawijać) i nadal będzie działać.

Teraz, aby załadować to do MySQL:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

Spowoduje to wstawienie bez żadnych skarg i nie musisz ręcznie zmieniać znaczenia żadnego tekstu w ciągu.

Christopher Schultz
źródło
5

Powinieneś uciec przed znakami specjalnymi za pomocą \znaku.

This is Ashok's Pen.

Staje się:

This is Ashok\'s Pen.
simon622
źródło
3

Jeśli chcesz zachować apostrof (') w bazie danych, użyj poniższego kodu

$new_value = str_replace("'","\'", $value); 

$ new_value może przechowywać w bazie danych.

Dheeraj singh
źródło
3

Możesz użyć tego kodu,

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

jeśli mysqli_real_escape_string () nie działa.

Diabeł
źródło
3

W PHP użyj mysqli_real_escape_string .

Przykład z podręcznika PHP:

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>
Marcel Verwey
źródło
1
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Michael Temitayo Adeyanju
źródło
0

Aby uzyskać dostęp programowy, możesz użyć symboli zastępczych, aby automatycznie uciec przed niebezpiecznymi znakami.

Na przykład w Perl DBI możesz użyć:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
Elle Fie
źródło
0

Użyj addlahes () lub mysql_real_escape_string ().

Anthony
źródło
Tylko uwaga, This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used..
NewBee
Tak, trzeba dodać i now mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony
Lepiej byłoby zaktualizować swoją odpowiedź (np. Komentarze mogą zniknąć w dowolnym momencie).
Peter Mortensen
0

Tak jak ja, używając Delphi:

TheString to „escape”:

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

Rozwiązanie:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

Wynik:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

Ta funkcja zamieni wszystkie znaki Char (39) na "\ '", umożliwiając wstawianie lub aktualizowanie pól tekstowych w MySQL bez żadnego problemu.

Podobne funkcje można znaleźć we wszystkich językach programowania!

user7276516
źródło
0

Może mógłbyś rzucić okiem na funkcję QUOTEw podręczniku MySQL.

juliański
źródło