Я ищу способ обработки содержимого HTML в подготовленных операциях.
Мое приложение предоставляет базовый редактор WYSIWYG, и после того, как пользователь сохраняет содержимое, мой скрипт хранит HTML-данные в базе данных sqlite.
Но если я использую подготовленный оператор, мой HTML получает-естественно-экранированный.
Это то, что я до сих пор:
try { /* Create databases and open connections */ $dbh = new PDO( 'sqlite:db/coaching.sqlite' ); /* Set Error Mode for Exception Handling */ $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); /* Prepare SQL Statement */ $query = $dbh->prepare( "UPDATE Content SET Value=:value WHERE Token=:token" ); /* Bind Param to Statement */ $query->bindParam( ':token', $_POST['id'], PDO::PARAM_STR); $query->bindParam( ':value', $_POST['value'], PDO::PARAM_STR); /* Execute Query */ $query->execute(); /* Echo Data */ echo $_POST['value']; /* Close connections to Database */ $dbh = NULL; } catch( PDOException $e ) { /* Print Error-Messages */ echo $e->getMessage(); }
Подготовленные утверждения не исключают переменные. Команда и переменные передаются в базу данных одновременно, но независимо. Если вы видите, что ваши данные скрыты в базе данных, есть еще одна причина. Например, magic_quotes
включены. Можете ли вы get_magic_quotes_gpc
echo get_magic_quotes_gpc
в своем скрипте, чтобы узнать, get_magic_quotes_gpc
ли они или нет? Если они включены, вы можете отключить их, используя разные методы . Это решит проблему.
Кроме того, после вашего комментария, подготовленные заявления предотвращают атаки SQL-инъекций, поэтому вам не нужно беспокоиться об экранировании переменных. Что может быть трудно понять, так это то, как работают подготовленные заявления. Скажем, у вас есть запрос:
$query = "SELECT `id` FROM `users` WHERE `login` = '" . $login . "' AND `password` = '" . $password ."'";
$login
и $password
передаются в запрос напрямую, как есть. Если кто-то пытается передать mylogin' --
to $login
, запрос будет mylogin' --
:
$query = "SELECT `id` FROM `users` WHERE `login` = 'mylogin' -- ' AND `password` = 'anypassword'";
и отправляется в базу данных. Таким образом, злоумышленник может получить доступ к любой учетной записи.
В каких подготовленных операциях они передают аргументы запроса независимо от запроса. Запрос не будет строить переменные, прежде чем он будет передан в базу данных. Вместо этого переменные передаются как-то рядом с запросом. Они указаны в запросе. Таким образом, запрос нельзя подделать ни намеренно, ни непреднамеренно.
С подготовленным оператором экзамен $login
будет передан как есть и не повлияет на структуру запроса.
Если бы можно было перевозить пассажиров на самолете, а пассажиры фактически не садились в самолет, это можно было бы назвать «подготовленным полетом» ðŸ™‚ Пассажиры не смогли бы повлиять на маршрут и захватить самолет. Они появятся в целевом аэропорту с посадочной площадкой.
вы пытались сохранить данные в кодировке?
должен работать, если используется до / после использования db