В PHP при отправке строк в базу данных следует позаботиться о незаконных символах с помощью htmlspecialchars () или использовать регулярное выражение?

Я работаю над формой, с возможностью для пользователя использовать нелегальные / специальные символы в строке, которая должна быть отправлена ​​в базу данных. Я хочу избежать / скрыть эти символы в строке и использовать htmlspecialchars () . Однако есть ли лучший способ?

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

То есть для MySQL существует mysql_real_escape_string .

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

Вы также можете использовать подготовленные инструкции для обработки данных:

$dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (?)'); $dbPreparedStatement->execute(array($yourHtmlData)); 

Или немного больше объясняю:

 $dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (:htmlcontent)'); $dbPreparedStatement->execute(array(':htmlcontent' => $yourHtmlData)); 

Если вы хотите сохранить разные типы данных, используйте bindParam для определения каждого типа, т. bindParam Целое число может быть определено: $db->bindParam(':userId', $userId, PDO::PARAM_INT); , Пример:

 $dbPreparedStatement = $db->prepare('INSERT INTO table (postId, htmlcontent) VALUES (:postid, :htmlcontent)'); $dbPreparedStatement->bindParam(':postid', $userId, PDO::PARAM_INT); $dbPreparedStatement->bindParam(':htmlcontent', $yourHtmlData, PDO::PARAM_STR); $dbPreparedStatement->execute(); 

Где $db – ваш объект данных PHP (PDO). Если вы не используете его, вы можете узнать больше об этом в PHP Data Objects .

Для базы данных нет «незаконных» символов. База данных, которая не может хранить некоторые символы, – это вздор. Существуют некоторые служебные символы, например, кавычки, используемые для разграничения строк. Эти символы должны быть просто экранированы, а не устранены.

Чтобы отправить запрос в базу данных, у вас есть 2 варианта:

  1. Создайте запрос обычным способом, чтобы он выглядел точно так же, как SQL-запрос, который вы можете запускать в консоли sql.
    Для этого нужно понимать целый набор правил , а не просто «использовать mysql_real_escape_string».
    Правила, такие как:

    • Строки должны быть заключены в кавычки и экранированы. Это единственный смысл побега: это просто разграничители! (и некоторые другие символы – символ завершения строки и сам escape-символ). Без окружающих цитат mysql_real_escape_string просто бесполезно.
    • Числа должны быть приведены к типу явно. Хотя, хотя номера данных могут угрожать точно так же, как и строки, существуют некоторые числа, такие как параметры предложения LIMIT, которые не могут быть экранированы и могут быть только выбраны.
  2. Отправить запрос и данные отдельно .
    Это наиболее предпочтительный способ, так как он может быть сокращен до «использования привязки». Все строки, числа и параметры LIMIT могут быть связаны – не беспокойтесь.
    Используя этот метод, ваш запрос с заполнителями будет отправлен в базу данных как есть, и связанные данные отправляются в отдельные пакеты, поэтому он не может вмешиваться. Это похоже на разделение кода и данных . Вы отправляете свою программу (сам запрос) отдельно от данных.

Но!

Все сказанное выше охватывает только часть данных запроса.
Но иногда нам приходится делать наш запрос еще более динамичным, добавляя операторы или идентификаторы.
В этом случае каждый динамический параметр должен быть жестко закодирован в нашем скрипте и выбран из этого набора.
Например, для динамического упорядочения:

 $orders = array("name","price","qty"); //field names $key = array_search($_GET['sort'],$orders)); // see if we have such a name $orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :) $query = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe 

или динамический поиск:

 $w = array(); $where = ''; if (!empty($_GET['rooms'])) $w[]="rooms='".mesc($_GET['rooms'])."'"; if (!empty($_GET['space'])) $w[]="space='".mesc($_GET['space'])."'"; if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'"; if (count($w)) $where="WHERE ".implode(' AND ',$w); $query="select * from table $where"; 

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

И так далее.

Прежде всего, вы должны дезинфицировать вещи при показе, а не перед вставкой в ​​базу данных. SQL-инъекции – это еще одна история, но, возможно, вне темы.

Во-вторых, если вы не нуждаетесь в том, чтобы ваши пользователи могли отправлять HTML-сообщения вообще, htmlspecialchars – это все, что вам нужно. Он заботится обо всех специальных символах в HTML.

Я работаю над формой, с возможностью для пользователя использовать нелегальные / специальные символы в строке, которая должна быть отправлена ​​в базу данных.

Пользователи могут пойти намного дальше, чем на самом деле.

Я хочу избежать / скрыть эти символы в строке и использовать htmlspecialchars (). Тем не менее, я хотел бы знать, есть ли более быстрый / более быстрый метод.

Использовать очиститель HTML :

HTML Purifier – это стандартная библиотека фильтров HTML, написанная на PHP. HTML-очиститель не только удалит весь вредоносный код (более известный как XSS) с тщательно проверенным, безопасным, но разрешенным белым списком.

и решите для себя 🙂

Это не проблема, которую вы хотите решать самостоятельно. Для этого есть библиотеки для этого, например, для очистки HTML .

Вы не указали, какими могут быть эти незаконные символы, но вы обязательно должны использовать предоставленный механизм API баз данных для выхода из данных. Например, если вы используете MySQL, используйте PDO-параметризованные операторы SQL.