Подтвердить что ты не робот

Проблема "слэш перед каждой цитатой"

У меня есть php-страница, которая содержит форму.

Иногда эта страница представляется сама по себе (например, при загрузке фото).

Я бы не хотел, чтобы пользователи заполняли все поля снова и снова, поэтому я использую это как значение ввода текста внутри формы:

value="<?php echo htmlentities(@$_POST['annonsera_headline'],ENT_COMPAT,'UTF-8');?>">

Это работает, за исключением того, что перед каждой двойной кавычкой добавляется знак "\"...

Например, запись 19-дюймовых колес дает после того, как страница будет отправлена ​​самому себе:

  19\" wheels

И если я даже не использую htmlentities, тогда все после исчезновения кавычек.

В чем проблема?

UPDATE:

Хорошо, поэтому проблема magic_quotes... Это включено на моем сервере...

Должен ли я отключить его? У меня есть root-доступ, и это мой сервер:)

В чем вред для его отключения?

4b9b3361

Ответ 1

Похоже, вы включили магические кавычки. Используйте условие ниже, используя stripslashes с любым текстом, который вы хотите обработать:

if(get_magic_quotes_gpc())
{
   $your_text = stripslashes($your_text);
}

Теперь вы можете нормально обрабатывать переменную $your_text.

Update:

Магические кавычки exaplained здесь. Для хорошо написанного кода обычно нет вреда в его отключении.

Ответ 2

Вероятно, вы включили magic quotes. Вам нужно stripslashes().

Наилучшим способом было бы обернуть это в функцию:

function get_string($array, $index, $default = null) {
    if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) {
        return get_magic_quotes_gpc() ? stripslashes($value) : $value;
    } else {
        return $default;
    }
}

Что вы можете использовать как

$annonsera_headline = get_string($_POST, 'annonsera_headline');

Кстати:

И если я даже не использую htmlentities, тогда все после исчезновения кавычек.

На самом деле он все еще присутствует в источнике HTML, вы его не видите. Сделайте View View;)


Обновить согласно вашему обновлению: магические кавычки, чтобы предотвратить SQL injection атак в коде начинающих. Вы часто это видите на сторонних хостах. Если вы действительно знаете, что делаете в коде, вы можете спокойно отключить его. Но если вы хотите, чтобы ваш код распространялся, вы действительно учитываете это при сборе параметров запроса. Для этого приведенный выше пример функции отлично подходит (вам нужно только написать функции simliar get_boolean(), get_number(), get_array()).

Ответ 3

На самом деле это функция PHP пытается быть сознательной в безопасности, к счастью, есть легкое исправление, которое выглядит примерно так:

if (get_magic_quotes_gpc()) {$var = stripslashes($var);}

Нет большой проблемы в том, чтобы включить его, это сводится к личным предпочтениям. Если вы код будет много перемещать серверы, и вы не можете отключить его через свой файл php.ini, лучше использовать что-то, как описано выше.

Если у вас есть доступ к вашему файлу php.ini, и вы хотите его изменить, потому что вы не хотите проверять его каждый раз, когда вы можете добавить следующую строку в php.ini

magic_quotes_gpc = Off

Или следующее к вашему .htaccess:

php_flag magic_quotes_gpc Off

Надеюсь, что это поможет разобраться.

Ответ 4

Да, вы должны отключить магические кавычки, если сможете. Функция устарела и, скорее всего, полностью исчезнет в будущем. Если вы использовали магические кавычки для экранирования данных (например, при вставке их в базу данных), вы можете открыть себя до уязвимостей sql-инъекций, если вы отключите его. Вы должны проверить все свои запросы и убедиться, что используете mysql_real_escape_string().

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

<?php
set_magic_quotes_runtime(0);

function _remove_magic_quotes(&$input) {
    if(is_array($input)) {
        foreach(array_keys($input) as $key) _remove_magic_quotes($input[$key]);
    }
    else $input = stripslashes($input);
}
if(get_magic_quotes_gpc()) {
    _remove_magic_quotes($_REQUEST);
    _remove_magic_quotes($_GET);
    _remove_magic_quotes($_POST);
    _remove_magic_quotes($_COOKIE);
}

return true;
?>

Ответ 6

  • вы не должны использовать htmlentities() при записи чего-либо в значение поля ввода.
  • Включен ли magic_quotes на вашем сервере? попробуйте использовать stripslashes перед выходом.