Как избежать одинарных кавычек в MySQL

98

Как мне вставить значение в MySQL, состоящее из одинарных или двойных кавычек. т.е.

This is Ashok's Pen.

Одиночная кавычка создаст проблемы. Могут быть и другие escape-символы.

Как правильно вставить данные?

Ашок Гупта
источник
Это может быть ошибкой. Как я могу предотвратить SQL-инъекцию в PHP? ...
Питер Мортенсен

Ответы:

127

Проще говоря:

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

Поэтому внутри строки замените каждую одиночную кавычку двумя из них.

Или:

SELECT 'This is Ashok\'s Pen.'

Избежать этого =)

Роб
источник
9
Возможно, вы захотите обновить свое сообщение, включив в него mysql_real_escape_string () или addlashes () в качестве возможных решений ... как в одном из комментариев ниже, OP заявляет, что они просто читают из файла и вставляют.
Джеймс Б.
3
Методы mysql_ * не рекомендуется использовать в будущем, поскольку они устарели .
hd1
Это правильный ответ, хотя в наши дни лучший вариант заключается в использовании одного из
Райана
это сработало для меня.
Большое
10

'- это escape-символ. Итак, ваша строка должна быть:

Это ручка Ашока

Если вы используете некоторый интерфейсный код, вам необходимо выполнить замену строки перед отправкой данных в хранимую процедуру.

Например, в C # вы можете сделать

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

а затем передать значение хранимой процедуре.

SO Пользователь
источник
Я не вставляю данные вручную, я извлекаю их из файла, и там будут ваклуэ: ручка Ашока. Как его вставить. создал процедуру для этого .. как сделать это правильно.
Ашок Гупта
Второстепенная нить FWIW: обратная косая черта - это «escape-символ»; ''(две одинарные кавычки) - это специальная альтернатива, разрешенная для «экранирования» символа одиночной кавычки.
ToolmakerSteve,
9

См. Мой ответ на «Как экранировать символы в MySQL»

В любой библиотеке, которую вы используете для общения с MySQL, будет встроена функция экранирования, например, в PHP вы можете использовать mysqli_real_escape_string или PDO :: quote

Пол Диксон
источник
1
Я не вставляю данные вручную, я извлекаю их из файла, и там будут значения: ручка Ашока. Как его вставить. создал процедуру для этого .. как сделать это правильно.
Ашок Гупта
Просто примечание 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

Если вы используете подготовленные операторы, драйвер обработает любое экранирование. Например (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
источник
7

Используйте этот код:

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

    mysql_real_escape_string($var);
?>

Это решит вашу проблему, поскольку база данных не может обнаружить специальные символы строки.

user3818708
источник
1
Просто примечание 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

Есть другой способ сделать это, который может быть или не быть более безопасным, в зависимости от вашей точки зрения. Это требует MySQL 5.6 или более поздней версии , из - за использования конкретной функции строки: FROM_BASE64.

Допустим, у вас есть это сообщение, которое вы хотите вставить:

«А, - почти Безголовый Ник изящно махнул рукой, - дело неважное ... Не то чтобы я действительно хотел присоединиться ... Думал, что подам заявку, но, видимо, я не выполняю требования» '- "

В этой цитате есть множество одинарных и двойных кавычек, и вставить ее в MySQL было бы очень сложно. Если вы вставляете это из программы, легко избежать кавычек и т. Д. Но, если вам нужно поместить это в сценарий SQL, вам придется отредактировать текст (чтобы избежать кавычек), что может быть подвержено ошибкам. или чувствительны к переносу слов и т. д.

Вместо этого вы можете кодировать текст Base64, чтобы получить "чистую" строку:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Некоторые примечания о кодировке Base64:

  1. Кодировка Base64 - это двоичная кодировка , поэтому вам лучше убедиться, что вы правильно указали свой набор символов при кодировании, потому что MySQL собирается декодировать строку в кодировке Base64 в байты, а затем интерпретировать их. Быть увереннымbase64 MySQL согласен с кодировкой символов (я рекомендую UTF-8).
  2. Я заключил строку в 50 столбцов для удобства чтения в Stack Overflow. Вы можете перенести его на любое количество столбцов (или не переносить его вообще), и он все равно будет работать.

Теперь, чтобы загрузить это в MySQL:

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

Это будет вставлено без каких-либо жалоб, и вам не нужно было вручную экранировать текст внутри строки.

Кристофер Шульц
источник
5

Вы должны экранировать специальные символы, используя \символ.

This is Ashok's Pen.

Становится:

This is Ashok\'s Pen.
simon622
источник
3

Если вы хотите сохранить апостроф (') в базе данных, используйте следующий код

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

$ new_value можно хранить в базе данных.

Дирадж Сингх
источник
3

Вы можете использовать этот код,

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

если mysqli_real_escape_string () не работает.

Дьявол
источник
3

В PHP используйте mysqli_real_escape_string .

Пример из руководства 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);
?>
Марсель Вервей
источник
1
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Майкл Темитайо Адеянджу
источник
0

Для программного доступа вы можете использовать заполнители чтобы автоматически экранировать небезопасные символы.

В Perl DBI, например, вы можете использовать:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
Эль Фи
источник
0

Используйте addlahes () или mysql_real_escape_string ().

Энтони
источник
Просто примечание 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
Ага, нужно добавить i now mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Энтони
Было бы лучше обновить свой ответ (например, комментарии могут исчезнуть в любой момент).
Питер Мортенсен
0

Как я это делаю, используя Delphi:

Строка для «побега»:

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

Решение:

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

Результат:

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

Эта функция заменит все Char (39) на "\", что позволит вам без проблем вставлять или обновлять текстовые поля в MySQL.

Подобные функции есть во всех языках программирования!

user7276516
источник
0

Может быть, вы могли бы взглянуть на функцию QUOTEв руководстве MySQL.

Юлиан
источник