Код ниже очень прост. PHP использует POST для сбора строки из формы, которую я затем собираюсь обрезать и запустить функцию preg_replace, которая удалит любые специальные символы, кроме одинарных кавычек или дефиса. Имейте в виду, что весь код работает нормально без использования кавычек или дефиса в выражении регулярного выражения.
preg_replace("/[^\w\s'-]/", '', $raw_lemurName);
Эти чистые переменные затем вставляются в базу данных. Apache / 2.4.37. MariaDB.
Когда я делаю lemurName строку вроде «Диадемед Сифака»<>! «, он работает и возвращает ‘Diademed Sifaka’.
Однако, когда я делаю это в виде строки, содержащей одну кавычку, например, «Сифака Кокреля», операция не завершается, и информация не вставляется.
Я протестировал выражение regex само по себе, и оно отлично работает, кажется, что когда вы начинаете использовать SQL и базы данных, он перестает работать.
Стоит отметить:
Есть идеи?
Очень признателен.
$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;
}
Это стандартная проблема внедрения 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.
заменить одинарные кавычки из области 2-х параметров. использовать этот.
preg_replace("/[^\w\s'-]/", "", $raw_lemurName);
надеюсь это сработает
Вы используете для $ c_lemurLat и $ c_family регулярное выражение:
«/ [^ \ Ш \ s] /»
Это позволит правильно фильтровать одинарные кавычки.
Для $ c_lemurName вы используете:
«/ [^ \ Ш \ s’-] /»
Это не удаляет единственную цитату.
Удалить «- и работает нормально.