regex — PHP preg_replace () возвращает ноль, если строка содержит одинарную кавычку, но работает иначе

Код ниже очень прост. PHP использует POST для сбора строки из формы, которую я затем собираюсь обрезать и запустить функцию preg_replace, которая удалит любые специальные символы, кроме одинарных кавычек или дефиса. Имейте в виду, что весь код работает нормально без использования кавычек или дефиса в выражении регулярного выражения.

preg_replace("/[^\w\s'-]/", '', $raw_lemurName);

Эти чистые переменные затем вставляются в базу данных. Apache / 2.4.37. MariaDB.

Когда я делаю lemurName строку вроде «Диадемед Сифака»<>! «, он работает и возвращает ‘Diademed Sifaka’.

Однако, когда я делаю это в виде строки, содержащей одну кавычку, например, «Сифака Кокреля», операция не завершается, и информация не вставляется.

Я протестировал выражение regex само по себе, и оно отлично работает, кажется, что когда вы начинаете использовать SQL и базы данных, он перестает работать.

Стоит отметить:

  • используя phpMyAdmin. Если я вставлю туда строку, она будет работать нормально, поэтому моя база данных сможет хранить эти значения.
  • Пробовал использовать mysqli_real_escape_string () в разных местах, но безуспешно, возможно, делал это неправильно.
  • Читая вокруг, я думаю, что это как-то связано с тем, что SQL не позволяет вставлять строки с одинарными кавычками и что сервер автоматически экранирует одинарные кавычки в методе post.

Есть идеи?

Очень признателен.

$raw_lemurName          =    isset($_POST['lemurName']) ? $_POST['lemurName'] : null;

$raw_lemurLat           =    isset($_POST['lemurLat']) ? $_POST['lemurLat'] : null;

$raw_family             =    isset($_POST['family']) ? $_POST['family'] : null;

// приведенное ниже выражение регулярного выражения, похоже, что-то напутало

$c_lemurName            =    trim(preg_replace("/[^\w\s'-]/", '', $raw_lemurName));

$c_lemurLat             =    strtolower(trim(preg_replace('/[^\w\s]/', '', $raw_lemurLat)));

$c_family               =    trim(preg_replace('/[^\w\s]/', '', $raw_family));

if (isset($_POST['submit'])) {

$query1 = "INSERT INTO `lemurs` (`id`, `lemur`, `latin`, `family`) VALUES (NULL, '$c_lemurName','$c_lemurLat','$c_family')";

$run_query = mysqli_query($connection, $query1);

if($run_query){
echo "Data has been inserted";

} else {
echo "Operation Unsuccessful";
}

header("location:  index.php");

return;

}

0

Решение

Это стандартная проблема внедрения SQL. Проблема связана с тем, как вы получаете эти переменные в свой запрос:

$query1 = "INSERT INTO `lemurs` (`id`, `lemur`, `latin`, `family`) VALUES (NULL, '$c_lemurName','$c_lemurLat','$c_family')";

Подумайте, что именно здесь происходит, все, что вы делаете, это соединяете строки вместе, так что если $c_lemurName является ' — тогда ваш SQL станет:

[...] VALUES (NULL, ''', '[...]

Это на самом деле действительно открывает перед вами то, что называется «инъекционная атака». По сути, злоумышленник может установить $c_family что-то вроде … ');drop table lemurs;-- — теперь вы выполняете оператор вставки, а затем оператор удаления таблицы, а оставшаяся часть SQL является комментарием.

Есть несколько способов борьбы с этим, наиболее часто рекомендуемый способ состоит в том, чтобы посмотреть на параматизированные запросы — что для библиотеки mysqli должно быть выполнено с помощью подготовленных операторов. Есть пример этого на Страница документации по PHP.

1

Другие решения

заменить одинарные кавычки из области 2-х параметров. использовать этот.

preg_replace("/[^\w\s'-]/", "", $raw_lemurName);

надеюсь это сработает

0

Вы используете для $ c_lemurLat и $ c_family регулярное выражение:
«/ [^ \ Ш \ s] /»

Это позволит правильно фильтровать одинарные кавычки.

Для $ c_lemurName вы используете:
«/ [^ \ Ш \ s’-] /»

Это не удаляет единственную цитату.

Удалить «- и работает нормально.

0
По вопросам рекламы [email protected]