So entkommen Sie einfachen Anführungszeichen in MySQL

98

Wie füge ich einen Wert in MySQL ein, der aus einfachen oder doppelten Anführungszeichen besteht? dh

This is Ashok's Pen.

Das einfache Anführungszeichen führt zu Problemen. Möglicherweise gibt es andere Escape-Zeichen.

Wie füge ich die Daten richtig ein?

Ashok Gupta
quelle
Dies kann betrogen werden. Wie kann ich die SQL-Injection in PHP verhindern? ...
Peter Mortensen

Antworten:

126

Ganz einfach gesagt:

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

Ersetzen Sie also innerhalb der Zeichenfolge jedes einzelne Anführungszeichen durch zwei davon.

Oder:

SELECT 'This is Ashok\'s Pen.'

Escape it =)

rauben
quelle
9
Möglicherweise möchten Sie Ihren Beitrag so aktualisieren, dass er mysql_real_escape_string () oder addslashes () als mögliche Lösungen enthält. Wie in einem der folgenden Kommentare heißt es im OP, dass sie nur aus einer Datei lesen und einfügen.
James B
3
Die mysql_ * -Methoden werden für die zukünftige Verwendung nicht empfohlen, da sie veraltet sind .
HD1
Das ist die richtige Antwort, obwohl heutzutage die beste Option darin besteht, einen der
Ryan
10

'ist der Fluchtcharakter. Ihre Zeichenfolge sollte also sein:

Dies ist Ashoks Stift

Wenn Sie einen Front-End-Code verwenden, müssen Sie eine Zeichenfolge ersetzen, bevor Sie die Daten an die gespeicherte Prozedur senden.

In C # können Sie dies beispielsweise tun

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

und übergeben Sie dann den Wert an die gespeicherte Prozedur.

SO Benutzer
quelle
Ich füge keine Daten manuell ein, ich extrahiere sie aus der Datei und es wird vaklues geben: Ashoks Stift. Wie man es einfügt. ein Verfahren dafür erstellt .. wie man es richtig macht.
Ashok Gupta
FWIW minor nit: Backslash ist "das Escape-Zeichen"; ''(zwei einfache Anführungszeichen) ist eine spezielle Alternative, mit der Sie einem einfachen Anführungszeichen "entkommen" können.
ToolmakerSteve
9

Siehe meine Antwort auf "So entkommen Sie Zeichen in MySQL"

Unabhängig davon, in welcher Bibliothek Sie mit MySQL kommunizieren, ist eine Escape- Funktion integriert. In PHP können Sie beispielsweise mysqli_real_escape_string oder verwenden PDO :: quote verwenden

Paul Dixon
quelle
1
Ich füge Daten nicht manuell ein, sondern extrahiere sie aus der Datei, und es gibt Werte: Ashoks Stift. Wie man es einfügt. hat ein Verfahren dafür erstellt .. wie man es richtig macht.
Ashok Gupta
Nur eine Notiz 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

Wenn Sie vorbereitete Anweisungen verwenden, behandelt der Treiber alle Escapezeichen. Zum Beispiel (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
quelle
7

Verwenden Sie diesen Code:

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

    mysql_real_escape_string($var);
?>

Dies löst Ihr Problem, da die Datenbank die Sonderzeichen einer Zeichenfolge nicht erkennen kann.

user3818708
quelle
1
Nur eine Notiz 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

Es gibt einen anderen Weg, dies zu tun, der je nach Ihrer Perspektive sicherer sein kann oder nicht. Es erfordert MySQL 5.6 oder höher, da eine bestimmte Zeichenfolgenfunktion verwendet wird : FROM_BASE64.

Angenommen, Sie haben diese Nachricht, die Sie einfügen möchten:

"Ah", fast kopflos Nick winkte mit einer eleganten Hand, "eine Angelegenheit ohne Bedeutung ... Es ist nicht so, als wollte ich wirklich mitmachen ... Ich dachte, ich würde mich bewerben, aber anscheinend erfülle ich die Anforderungen nicht '- "

Dieses Zitat enthält eine Reihe von einfachen und doppelten Anführungszeichen und wäre ein echtes Problem beim Einfügen in MySQL. Wenn Sie das aus einem Programm einfügen, ist es einfach, die Anführungszeichen usw. zu umgehen. Wenn Sie dies jedoch in ein SQL-Skript einfügen müssen, müssen Sie den Text bearbeiten (um die Anführungszeichen zu umgehen), was fehleranfällig sein kann oder empfindlich gegenüber Zeilenumbrüchen usw.

Stattdessen können Sie den Text Base64-codieren, sodass Sie eine "saubere" Zeichenfolge haben:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Einige Hinweise zur Base64-Codierung:

  1. Die Base64-Codierung ist eine binäre Codierung . Stellen Sie daher sicher, dass Ihr Zeichensatz bei der Codierung korrekt ist, da MySQL die Base64-codierte Zeichenfolge in Bytes decodiert und diese dann interpretiert. Stellen Sie sicher, dass base64MySQL sich über die Zeichenkodierung einig ist (ich empfehle UTF-8).
  2. Ich habe die Zeichenfolge zur besseren Lesbarkeit bei Stapelüberlauf in 50 Spalten eingeschlossen. Sie können es in eine beliebige Anzahl von Spalten einschließen (oder gar nicht umbrechen), und es funktioniert weiterhin.

Um dies in MySQL zu laden:

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

Dies wird ohne Beschwerden eingefügt, und Sie mussten keinen Text innerhalb der Zeichenfolge manuell maskieren.

Christopher Schultz
quelle
5

Sie sollten den Sonderzeichen mit dem \Zeichen entkommen .

This is Ashok's Pen.

Wird:

This is Ashok\'s Pen.
simon622
quelle
3

Wenn Sie (') Apostroph in der Datenbank behalten möchten, verwenden Sie diesen Code

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

$ new_value kann in der Datenbank gespeichert werden.

Dheeraj singh
quelle
3

Sie können diesen Code verwenden,

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

wenn mysqli_real_escape_string () nicht funktioniert.

Teufel
quelle
3

Verwenden Sie in PHP mysqli_real_escape_string .

Beispiel aus dem PHP-Handbuch:

<?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
quelle
1
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Michael Temitayo Adeyanju
quelle
0

Für den programmgesteuerten Zugriff können Sie Platzhalter verwenden , um unsichere Zeichen automatisch für Sie zu maskieren.

In Perl DBI können Sie beispielsweise Folgendes verwenden:

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

Verwenden Sie entweder addslahes () oder mysql_real_escape_string ().

Anthony
quelle
Nur eine Notiz 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
Ja, ich muss jetzt ein i hinzufügen mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony
Es ist besser, Ihre Antwort zu aktualisieren (z. B. können Kommentare jederzeit verschwinden).
Peter Mortensen
0

So wie ich es mache, indem ich Delphi benutze:

TheString zur "Flucht":

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

Lösung:

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

Ergebnis:

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

Diese Funktion ersetzt alle Zeichen (39) durch "\ '", sodass Sie problemlos Textfelder in MySQL einfügen oder aktualisieren können.

Ähnliche Funktionen gibt es in allen Programmiersprachen!

user7276516
quelle
0

Vielleicht können Sie sich die Funktion QUOTEim MySQL-Handbuch ansehen .

julianisch
quelle