PHP preg_replace () возвращает ноль, если строка содержит одинарную кавычку, но работает иначе - PullRequest
0 голосов
/ 07 февраля 2019

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

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

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

Когда я задаю lemurName строку типа «Diademed Sifaka <>!», Она работает и возвращает «Diademed Sifaka».

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

Я протестировал выражение 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;

}

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

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

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

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

0 голосов
/ 07 февраля 2019

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

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

Для $ c_lemurName вы используете: "/ [^ \ w \ s '-] /"

Это не удаляет одинарную кавычку.

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

0 голосов
/ 07 февраля 2019

Это стандартная проблема внедрения 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 .

...