PHP "addlashes" ведет себя не так, как ожидалось - PullRequest
1 голос
/ 14 декабря 2010

Это сводило с ума, но я не могу найти ответ. Мы располагаем технической базой знаний, которая иногда включает пути самбы Windows для сопоставления с сетевыми дисками.

Например: \\servername\sharename

Когда мы включаем пути, у которых есть две обратные косые черты, сопровождаемые друг другом, они не экранируются должным образом при запуске 'addlashes'. Мои ожидаемые результаты будут "\\\\servername\\sharename", однако он возвращает "\\servername\\sharename". Очевидно, что при последующем запуске 'stripslashes' префикс двойной обратной косой черты - это всего лишь одна косая черта. Я также пытался использовать str_replace("\\", "\", $variable);, однако он возвращает "\servername\sharename", когда я ожидал "\\servername\sharename".

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

Нам нужно запустить addlashes и stripslashes для вставки базы данных; использование pg_escape_string не будет работать в нашем конкретном случае.

Это работает на PHP 5.3.1 на Apache.

РЕДАКТИРОВАТЬ: Пример кода
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo addslashes($variable);
Возвращает: In the box labeled Folder type: \\servername\\sharename

РЕДАКТИРОВАТЬ: Пример кода # 2
$variable = 'In the box labeled Folder type: \\servername\sharename';
echo str_replace('\\', '\', $variable);
Возвращает: In the box labeled Folder type: \servername\sharename

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

У кого-нибудь есть предложения по поводу того, что я могу сделать?

Ответы [ 4 ]

1 голос
/ 15 декабря 2010

Запустил тест по проблеме, которую вы описали, и единственный способ получить желаемое поведение - соединить условное выражение с регулярным выражением и предвосхитить двойные слэши в начале.

$str = '\\servername\sharename';
    if(substr($str,0,1) == '\\'){
    //String starts with double backslashes, let's append an escape one.
    //Exclaimation used for demonstration purposes.
    $str = '\\'.$str;
    echo addslashes(preg_replace('#\\\\\\\\#', '!',$str ));

    }

Это выводит:

!servername\\sharename

Хотя это не может быть прямым ответом, он работает и иллюстрирует разницу в том, как эти две конструкции обрабатывают escape-символ. Если используется, то! можно легко заменить нужными символами, используя другое регулярное выражение.

1 голос
/ 15 декабря 2010

Это не проблема с addslashes, это проблема способа, которым вы назначаете строку для вашей переменной.

$variable = 'In the box labeled Folder type: \\servername\sharename';
echo $variable;

Возвращает: В поле с надписью Тип папки: \ имя_сервера \ имя_ресурса

Это потому, что двойной обратный слеш интерпретируется как экранированный обратный слеш. Используйте это назначение вместо.

$variable = 'In the box labeled Folder type: \\\\servername\\sharename';
1 голос
/ 14 декабря 2010

Я думаю, я знаю, где проблема. Просто попробуйте запустить это:

echo addslashes('\\servername\sharename');

А этот

echo addslashes('\\\\servername\sharename');

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

0 голосов
/ 15 декабря 2010

После более тщательного тестирования я определил, что в действительности PHP работает с жестко запрограммированными строками. Поскольку жестко запрограммированные строки меня не интересуют (я просто использовал их для тестирования / этот пример), я создал форму с одним текстовым полем и кнопкой отправки. addslashes будет правильно экранировать данные POST таким образом.

Проведя еще больше исследований, я решил, что проблема, с которой я столкнулся, заключалась в том, как PostgreSQL принимает экранированные данные. Вставив данные в базу данных PostgreSQL, он удалит все управляющие символы, которые он дает, когда фактически помещает данные в таблицу. Следовательно, stripslashes не требуется для удаления управляющих символов при извлечении данных обратно.

Эта проблема возникла из-за миграции кода из PHP 4.1 (с включенными Magic Quotes) в PHP 5.3 (с устаревшими Magic Quotes). В существующей системе (PHP4) я не думаю, что мы знали, что были включены Волшебные Кавычки. Поэтому все данные POST уже экранировались, и затем мы снова экранировали эти данные с помощью addslashes перед вставкой. Когда он вставлен в PostgreSQL, он удалит один набор слешей и оставит другой, поэтому нам потребуется stripslashes на выходе. Теперь, когда Магические Кавычки выключены, мы убегаем с addslashes, но не обязаны использовать stripslashes на выходе.

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

...