2014-11-10 2 views
0

PHP의 nl2br() 함수를 사용하여 \ r \ n 문자를 전자 메일의 <br> 태그로 변환하려고합니다. mysqli_real_escape_string()을 사용하려고 할 때 어떤 종류의 충돌이있는 것으로 보입니다. mysqli_real_escape_string 함수()가 적절한 출력을 제공하고 nl2br() 함수가 적절한 문자를 <br> 태그로 올바르게 변환하고 있음을 별도로 확인할 수는 있지만 함께 작동하지는 않습니다. 왜?! 작동 nl2br 내가 확인할 수함께 작동하는 nl2br() 및 mysqli_real_escape_string() 문제

:

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

출력 :

"This is a string"

I 작동) (mysqli_real_escape_string을 확인할 수 있습니다

:

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

출력 :

,536
This\r\nis\n\ra\nstring\r 

내가 그들을 함께 사용:

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

출력 :

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

왜'mysqli_real_escape_string'에 의해 반환 된 문자열에'nl2br'를 사용해야합니까? – PeeHaa

+1

이스케이프는 문자열에 대해 수행하는 ** 마지막 ** 작업이어야합니다. 이스케이프 된 문자열을 추가로 조작하면 실제로 이스케이프 처리를 취소하고 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 (0x5c0x6e)로 대체되었습니다.

그래서, 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에서는 큰 따옴표 붙은 문자열 (''')만이 변수와 이스케이프 문자로 구문 분석되지만 작은 따옴표로 묶인 문자열 (''')은 그렇지 않습니다 : http://stackoverflow.com/questions/3446216/ 단일 인용 부호와 이중 인용 문자열 사이의 차이점 – Carpetsmoker

관련 문제