2014-11-10 3 views
0

Я пытаюсь использовать функцию php nl2br() для преобразования символов \ r \ n в теги <br> по электронной почте. Кажется, что есть какой-то конфликт, когда я пытаюсь использовать его с mysqli_real_escape_string(). Я могу проверить отдельно, что функция mysqli_real_escape_string() дает правильный вывод и что функция nl2br() правильно преобразует соответствующие символы в теги <br>, но они не будут работать вместе. Зачем?!Проблемы с nl2br() и mysqli_real_escape_string(), работающие вместе

Я могу подтвердить, nl2br работы:

$message= "This\r\nis\n\ra\nstring\r"; 
    $message= nl2br($message); 
    echo($message); 

выход:

"This is a string"

Я могу подтвердить mysqli_real_escape_string() работает:

//assume $_POST['message'] = "this is a string" 
$message = mysqli_real_escape_string($connection, $_POST['message']); 
echo($message); 

выход:

This\r\nis\n\ra\nstring\r 

Когда я использую их вместе:

$message = nl2br(mysqli_real_escape_string($connection, $_POST['message'])); 

Выход:

This\r\nis\r\na\r\nstring 
+0

Почему вы используете 'nl2br' на строки, возвращаемой' mysqli_real_escape_string'? – PeeHaa

+1

Ускорение должно быть операцией ** LAST **, которую вы выполняете на строке. Выполнение дальнейших манипуляций с экранированной строкой может фактически UNDO ускользнуть и снова открыть атаки на SQL-инъекции. –

ответ

1

mysqli_real_escape_string избегает новой строки, так nl2br не может найти их (очевидно).

Простой скрипт для демонстрации этого:

$ cat test.php 
$c = mysqli_connect('192.168.33.10', 'root', ''); 
print("Hello\nWorld\n"); 
print(mysqli_real_escape_string($c, "Hello\nWorld")); 

$ php test.php | hexdump -C 
00000000 48 65 6c 6c 6f 0a 57 6f 72 6c 64 0a 48 65 6c 6c |Hello.World.Hell| 
00000010 6f 5c 6e 57 6f 72 6c 64       |o\nWorld| 

Как вы можете видеть, символ новой строки (0x0a) была заменена строкой \n (0x5c и 0x6e).

Так называют nl2br первым:

$message = mysqli_real_escape_string(nl2br($_POST['message']), $connection); 
+0

Это работает наполовину. Итак, теперь он создает возврат каретки, но он все еще сохраняет/r/n в начале каждой строки. – user2755541

+0

Собственно, я это понял. Я выполнил эту функцию после экранирования строки: $ message = str_replace ('\ r \ n', '', $ message); Я столкнулся с проблемой с этим ... видимо, существует разница между использованием одиночных и двойных кавычек вокруг «\ r \ n». «\ r \ n» не работает. – user2755541

+1

@ user2755541 Да, в PHP анализируются только двойные кавычки ('' ') для переменных & escape-символов, одиночные кавычки (' ''): см. Http://stackoverflow.com/questions/3446216/ то, что-это-разностного-между-одинарные кавычки, и, в двойных кавычках-стринг-в-PHP – Carpetsmoker

Смежные вопросы