Декодирование mysql_real_escape_string() для вывода HTML
Я пытаюсь защитить себя от SQL-инъекции и использую:
mysql_real_escape_string($string);
При публикации HTML это выглядит примерно так:
<span class="\"className\"">
<p class="\"pClass\"" id="\"pId\""></p>
</span>
Я не уверен, сколько еще добавлений, добавленных real_escape_string, поэтому не хотят просто заменять несколько и пропустить других... Как мне "декодировать" это обратно в правильно отформатированный HTML-код с чем-то вроде:
html_entity_decode(stripslashes($string));
Ответы
Ответ 1
Страница mysql_real_escape_string() сообщает, какие символы экранированы:
mysql_real_escape_string() Функция библиотеки MySQL mysql_real_escape_string, который добавляет обратную косую черту к следующему символов:\x00,\n,\r, \, ', "и \ X1a.
Вы можете успешно отменить экранирование, заменив эти экранированные символы на их незакрепленные формы.
mysql_real_escape_string()
не следует использовать для дезинфекции HTML, хотя... нет причин использовать его перед выводом данных веб-страницы. Его следует использовать только для данных, которые вы собираетесь внести в базу данных. Ваш процесс очистки должен выглядеть примерно так:
Ввод
- Принять вход пользователя из формы или запроса HTTP
- Создайте запрос базы данных с помощью
mysql_real_escape_string()
Выход
- Извлечение данных из базы данных
- Запустите любые пользовательские данные через
htmlspecialchars()
перед печатью
Использование другого драйвера базы данных, такого как MySQLi или PDO позволит вам использовать подготовленные операторы, которые позаботятся о том, чтобы избежать большинства входных данных для вас. Однако, если вы не можете переключиться или воспользоваться преимуществами тех, то определенно используйте mysql_real_escape_string()
... просто используйте его только перед вставкой данных.
Ответ 2
У тебя все испортилось.
mysql_real_escape_string не требуется никакого декодирования.
если вы вернете свои данные с помощью косой черты, это означает, что он был экранирован дважды. И вместо того, чтобы удалять лишние косые черты, вы должны просто не добавлять их.
Не говоря уже о том, что любое исчезновение устарело, и вы должны
использовать подготовленные операторы
вместо любой escape-строки.
Итак, никогда не убегай, никогда не расшифровывайся.
Проблема решена.
Ответ 3
mysql_real_escape_string
используется для предотвращения внедрения SQL при хранении предоставленных пользователем данных в базе данных, но лучшим способом было бы использовать привязку данных с помощью PDO (например). Я всегда рекомендую использовать это вместо того, чтобы возиться с экранированием.
Что касается вашего вопроса о том, как отображать его после - после того, как данные будут сохранены, когда вы его получите, данные будут полными и действительными, без необходимости "без сохранения". Если вы не добавили свои собственные последовательности экранирования, пожалуйста, не делайте этого.
Ответ 4
Не уверен, что происходит с форматированием, поскольку я вижу это, но ваша форма html
<span class="\"className\"">
<p class="\"pClass\"" id="\"pId\""></p>
</span>
должен быть просто:
<span class="className">
<p class="pClass" id="pId"></p>
</span>
Когда вы вернетесь обратно, прежде чем вы поместите его в базу данных, вы избежите его с помощью mysql_real_escape_string(), чтобы убедиться, что вы не страдаете атакой на SQL-инъекцию.
Следовательно, вы избегаете значений, готовых разместить следующий текст.
Когда вы выберете его из базы данных (или отобразите ЛЮБОЙ из них для пользователей как html), вы снова убеждаете его в готовности к тому, что место, которое оно будет дальше (html) с htmlentities() и т.д., чтобы защитить ваших пользователей от XSS атаки.
Это формирует часть EO мантры FIEO, Filter Input, Escape Output, которую вы должны татуировать внутри ваших век.
Ответ 5
Хорошо, я принял удар по этому старому способу, и до сих пор я не вижу ничего плохого в моем подходе. Очевидно, это немного грубо, но он выполняет свою работу:
function mysql_unreal_escape_string($string) {
$characters = array('x00', 'n', 'r', '\\', '\'', '"','x1a');
$o_chars = array("\x00", "\n", "\r", "\\", "'", "\"", "\x1a");
for ($i = 0; $i < strlen($string); $i++) {
if (substr($string, $i, 1) == '\\') {
foreach ($characters as $index => $char) {
if ($i <= strlen($string) - strlen($char) && substr($string, $i + 1, strlen($char)) == $char) {
$string = substr_replace($string, $o_chars[$index], $i, strlen($char) + 1);
break;
}
}
}
}
return $string;
}
Это должно охватывать большинство случаев.
Ответ 6
Мне было интересно, почему в этой программе нет сопутствующей процедуры декодера. Вероятно, он интерпретируется MySQL точно так же, как если бы он не был экранирован. Вы получаете неэкранированные результаты, когда вы выполняете $row=mysql_fetch_array($res, MYSQL_ASSOC)';
Ответ 7
Даже если это старый вопрос...
У меня была такая же проблема, как у Питера Крейга.
На самом деле мне приходится иметь дело со старой CMS. Чтобы предотвратить SQL Injection, все значения $_POST и $_GET являются "sql-escaped". К сожалению, это делается в центральной точке, поэтому все ваши модули получают все данные sql-escaped! В некоторых случаях вы хотите напрямую отображать эти данные, чтобы вы столкнулись с проблемой: как отображать строку sql-escaped без получения данных из БД?
Ответ:
использовать полосовые шхуны (НЕ stripslashes!!)
http://php.net/manual/en/function.stripcslashes.php
Ответ 8
используйте следующую функцию для удаления косой черты при показе на странице HTML:
stripslashes();
например.
$ HTML = stripslashes ($ HTML);
ИЛИ
$ HTML = stripslashes ($ строка [ "имя_поля" ]);
Ответ 9
Я думаю, что ряд других ответов пропустил очевидную проблему...
Вы используете mysql_real_escape_string на введенном контенте (как и должны, если не используете подготовленные операторы).
Ваша проблема связана с выходом.
Текущая проблема заключается в том, что вы вызываете html_entity_decode. Просто stripslashes - это все, что вам нужно, чтобы восстановить исходный текст. html_entity_decode - это то, что испортило ваши цитаты и т.д., поскольку оно меняет их. Вы действительно хотите вывести html, а не просто текст (который используется, когда вы будете использовать html_entities и т.д.). Вы декодируете то, что хотите закодировать.
Если вы хотите, чтобы текстовая версия отображалась, вы можете использовать объекты. Если вас беспокоят плохие теги, используйте striptags и разрешайте только те теги, которые вы хотите (например, b, я и т.д.).
Наконец, не забудьте закодировать и декодировать в правильном порядке. если вы запустили mysql_real_escape_String (htmlentities ($ str)), вам нужно запустить html_entity_decode (stripslashes ($ str)). Порядок действий имеет значение.
UPDATE: я не понимал, что html_entity_decode также удаляет косые черты. На этой странице это не было четко задокументировано, и я так и не понял. Я все равно буду автоматически запускать его, так как большинство html, которые я представляю, я хочу оставить как объекты, и даже когда я этого не делаю, я предпочитаю принимать это решение за пределами моего класса db, в каждом случае. Таким образом, я знаю, что косые черты исчезли.
Похоже, что оригинальный плакат запускает htmlentities (или его входную программу, как tinymce делает это для него), и он хочет вернуть ее обратно в контент. Итак, html_entity_decode ($ Str) должен быть всем, что требуется.