Я работаю над формой, с возможностью для пользователя использовать нелегальные / специальные символы в строке, которая должна быть отправлена в базу данных. Я хочу избежать / скрыть эти символы в строке и использовать 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 варианта:
Создайте запрос обычным способом, чтобы он выглядел точно так же, как SQL-запрос, который вы можете запускать в консоли sql.
Для этого нужно понимать целый набор правил , а не просто «использовать mysql_real_escape_string».
Правила, такие как:
Отправить запрос и данные отдельно .
Это наиболее предпочтительный способ, так как он может быть сокращен до «использования привязки». Все строки, числа и параметры 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.