Декодирование mysql_real_escape_string() для вывода HTML

Я пытаюсь защитить себя от SQL-инъекции и использую:

mysql_real_escape_string($string);

При публикации HTML это выглядит примерно так:

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></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="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></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) должен быть всем, что требуется.