Косые черты при выводе текста
Из формы я прошу пользователя ввести текст. Я получу этот текст, используя $_POST['text']
,
Пользователь вводит строку "Это мой текст!"
$newText = mysql_real_escape_string($_POST['text']);
Теперь на той же странице после того, как я вставил $newText
в базу данных я хочу, чтобы отобразить текст для пользователя, а также использовать его в качестве значения ввода текста с помощью PHP.
// I want to make sure the user hasn't added any unsafe html in their string
$newText = htmlentities($newText);
echo "You've entered: " . $newText . "<br />";
echo "<form action=someaction.php method=post>";
echo "<input type=text value=\"" . $newText . "\">";
echo "</form>";
Выход:
You've entered: It\'s my text!
[It\'s my text!]
Как мне избежать этих косых черт, и я должен делать что-то еще с моими данными?
4 ответа
Вы передаете текст через mysql_real_escape_string()
которая, как следует из названия, избегает строки, включая апострофы. mysql_real_escape_string()
предназначен только для подготовки данных для сохранения в базе данных. Вы не должны использовать его при отображении данных для пользователя.
Итак, решение простое: удалите строку и используйте htmlentities()
только. использование mysql_real_escape_string()
когда вы сохраняете строку в базе данных (и только потом).
Использовать только mysql_real_escape_string()
на переменную, которую вы хотите использовать в запросе, потому что она добавит косую черту для экранирования некоторых символов в строке. Это прекрасно работает для mysql, но когда вы захотите использовать его на странице, это будет выглядеть странно.
Вы можете сделать 2 переменные, 1 для MySQL и 1 для отображения необработанного текста.
$text = $_POST['text'];
$db_text = mysql_real_escape($text);
Также обратите внимание, что вы должны использовать strip_slashes()
на данные, которые вы получите из базы данных позже, чтобы удалить косые черты.
Надеюсь, это прояснит немного.
Теперь на той же странице после того, как я вставил $newText в базу данных, я хочу показать текст пользователю
Это то, что вы делаете неправильно.
Стандарт HTTP требует перенаправления метода GET после каждого успешного запроса POST.
Таким образом, вы должны перенаправить пользователя на ту же страницу, где вы можете прочитать вставленные данные из базы данных и показать их пользователю.
Что же касается допущенной вами ошибки - просто переместитесь с экранированием куда-то ближе к операциям с базой данных, чтобы убедиться, что она используется только по назначению (ДА, она используется обязательно, без риска ее забыть!).
В идеале вы должны использовать некоторые переменные для представления данных в запросе и некоторый обработчик для их обработки.
Таким образом, запрос запроса может выглядеть
DB::run("UPDATE table SET text=s:text",$_POST['text']);
где s:text
такая переменная (называемая заполнителем), которая будет заменена на $_POST['text']
значение, подготовленное в соответствии с типом, указанным в имени заполнителя (s
означает "строка", говорит вашей функции, чтобы экранировать и заключать в кавычки данные)
Итак, все необходимые приготовления будут выполнены внутри и не будут портить переменную источника.
Сохранить как обычно с помощью mysql_real_escape_string()
и когда вы хотите отобразить его в форме:
htmlspecialchars(stripslashes($row['text_data']))
это сделает свое дело.