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

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

19
задан Peter Mortensen 15 May 2011 в 10:10
поделиться

6 ответов

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

То есть для 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 .

14
ответ дан 30 November 2019 в 02:44
поделиться

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

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

2
ответ дан 30 November 2019 в 02:44
поделиться

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

0
ответ дан 30 November 2019 в 02:44
поделиться

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

0
ответ дан 30 November 2019 в 02:44
поделиться

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

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

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

Используйте HTML Purifier :

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

и решайте сами :)

1
ответ дан 30 November 2019 в 02:44
поделиться

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

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

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

    • Строки должны быть как заключены в кавычки, так и экранированы. Это единственное значение экранирования: Это просто экранирование разделителей! (и некоторые другие символы - символ завершения строки и сам символ экранирования). Без окружающих кавычек 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";

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

И так далее.

31
ответ дан 30 November 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: