Экранирование символов в электронной почте с помощью PHP / MYSQL - PullRequest
1 голос
/ 19 апреля 2011

У меня проблема с выяснением логики экранирования символов при использовании функции mail() для PHP.Я использую PHP 5.2, с magic_quotes_qpc ON и runtime / sybase OFF.Вот проблема.

  1. A имеет форму, которая принимает текстовый ввод, и я использую mysqli_real_escape для экранирования специальных символов для использования в выражении SQL, например:

    $text = mysqli_real_escape_string($dbc, $_GET['text']);
    
  2. Если я наберу следующий комментарий "Я бы этого не ел!"в форме я вижу в базе данных следующее: «Я бы этого не ел!», чего я и ожидал.Если я добавлю возврат каретки / новые строки, все, что я вижу в поле базы данных в phpMyAdmin, это возврат каретки и новая строка без специальных символов (то есть без "\ r \ n" или чего-либо подобного).

  3. Когда я использую функцию mail для отправки сообщения (например, mail($to, $subject, $text, $headers)), в теле письма я получаю нечто странное:

    I wouldn\\\'t eat that\r\nI couldn\\\'t eat that
    

В конце дня я просто хочу, чтобы вывод электронной почты был отформатирован точно так же, как ввод формы, другими словами:

I wouldn't eat that
I couldn't eat that

Я не уверен, почему перед апострофом происходит тройной побег и почему\ r \ n появляется в моем письме.

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Магические кавычки плохие.Не используйте их.

http://www.php.net/manual/en/security.magicquotes.whynot.php

Если вы используете магические кавычки и mysqli_real_escape_string, то это объясняет, почему строки удваиваются.

$text = mysqli_real_escape_string($dbc, $_GET['text']); // $_GET['text'] is already escaped

...

mail($to, $subject, $text, $headers); // Now $text contains a doubly escaped string

Отключение магических кавычек (убедитесь, что приложение может справиться с этим) и экранирование только при вставке в базу данных (если используются параметризованные запросы, например, PDO или mysqli, нет необходимости ever escape!).

В крайнем случае, вы можете попробовать использовать stripslashes в строке.

0 голосов
/ 19 апреля 2011

При получении результатов из базы данных MySQL необходимо использовать stripslashes() в выходных данных, или они по какой-то причине будут по-прежнему содержать экранирующие косые черты.

Редактировать:

Затем,Вы можете сделать $theOutput = str_replace("\\r\\n", "\r\n", $theOutput);, чтобы исправить новые строки.

...