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

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

Ответы

Ответ 1

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

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

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

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

$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 для определения каждого типа, то есть целое число может быть определено: $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.

Ответ 2

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

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

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

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

Но!

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

$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";

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

И так далее.

Ответ 3

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

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

Ответ 4

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

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

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

Используйте Очиститель HTML:

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

и решите для себя:)

Ответ 5

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

Ответ 6

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