2012-04-28 3 views
1

양식에서 사용자에게 텍스트를 입력하라는 메시지가 표시됩니다. $_POST['text']을 사용하여이 텍스트를 검색합니다.텍스트 출력에 슬래시가 있음

사용자가 "It 's my text!"라는 문자열을 입력합니다. 지금 바로 같은 페이지에 내가 를 사용자에게 텍스트를 표시하고 또한 PHP를 사용하여 입력 텍스트 상자의 값으로 사용하려는 데이터베이스에 $newText를 삽입 한 후

$newText = mysql_real_escape_string($_POST['text']); 

.

You've entered: It\'s my text! 
[It\'s my text!] 

가 어떻게 이러한 슬래시를 방지 않으며, 내 데이터를 다른 작업을 수행해야합니다

// I want to make sure the user hasn't added any unsafe html in their string 
$newText = htmlentities($newText); 
echo "You've entered: " . $newText . "<br />"; 
echo "<form action=someaction.php method=post>"; 
echo "<input type=text value=\"" . $newText . "\">"; 
echo "</form>"; 

출력은?

답변

3

mysql_real_escape_string()을 통해 텍스트를 전달하면 이름에서 알 수 있듯이 아포스트로피가 포함 된 문자열이 이스케이프됩니다. mysql_real_escape_string()은 데이터베이스에 저장하기위한 데이터 준비를 위해 만을 의미합니다. 사용자에게 데이터를 표시 할 때이를 사용해서는 안됩니다.

해결책은 간단합니다. 라인을 제거하고 htmlentities() 만 사용하십시오. 문자열을 데이터베이스에 저장하는 경우에만 mysql_real_escape_string()을 사용하십시오.

+2

왜 이것이 다운 voted되었는지, 100 % 정확하다는 것을 모릅니다. –

+0

때로는 가장 쉬운 해결책은 자동으로 간과하는 것입니다. 고맙습니다. – Nate

+0

@ 네이트까지 내가 질문을 가지고, "라인을 제거"정확하게 정확한 진술하지 않습니다. "데이터베이스와 HTML을위한 하나의 변수 두 개를 생성하는 것이 더 좋을 것입니다. 그러나, 내 대답을 참조하십시오. –

-2

이는 mysql_real_escape_string()

를 사용하여 일반적으로 저장하고 폼에 표시 할 때

htmlspecialchars(stripslashes($row['text_data'])) 

이 트릭을 할 것입니다.

+2

그래서 ... 옷을 입고 다시 벗은 채로? 그냥 알몸으로 머물러야하는 이유는 무엇입니까? –

+0

당신이 그 지점을 놓쳤습니다. HTML을 사용할 수있는 텍스트 영역이 있다고 가정 해 보겠습니다. 가능한 원시 데이터베이스에 저장하려고합니다. 내가 설명한 방법은 당신이 그것을 데이터베이스에 저장하고 그것을 다시 폼에 저장하는 것을 보여줍니다. 그대로 인쇄하고 싶다면 htmlspecialchars()없이 stripslashes() 만 수행하면됩니다. 이것은 HTML 편집자를 위해 간다 ... – galchen

+1

당신은 요점을 놓치고있다. m_r_e_s()는 데이터베이스 작업을위한 것입니다. 출력을 HTML 양식으로 다시 채우지는 않습니다. 그리고 원래의 이스케이프 처리되지 않은 버전이 여전히 사용 가능하기 때문에 stripslashes를 통한 작업 취소는 의미가 없습니다. –

-1

쿼리에 사용할 변수에 대해서만 mysql_real_escape_string()을 사용하십시오. 슬래시를 추가하여 문자열의 일부 문자를 이스케이프 처리하기 때문에. 이것은 mysql에 매우 효과적이지만, 페이지에서 사용할 때 이상하게 보일 것이다.

MySQL의 경우 1 개, 원시 텍스트를 표시 할 경우 1 개의 변수를 만들 수 있습니다.

$text = $_POST['text']; 
$db_text = mysql_real_escape($text); 

또한 당신이 슬래시를 제거하기 위해, 데이터베이스 나중에에서 얻을 데이터에 strip_slashes()를 사용해야 있습니다.

조금 더 명확한 희망.

+1

데이터를 검색 할 때'strip_slashes()'가 필요하지 않습니다. (올바르게 사용되었을 때) mysql_real_escape_string()은 쿼리에 대해서만 데이터를 이스케이프 처리하기 때문입니다. 슬래시는 실제로 데이터베이스에 저장되지 않습니다. – JJJ

+0

맞습니다. 잊어 버렸습니다. 요일 : \ – fhugas

+0

에서 magic_quotes의 잘못된 습관 mysql_real_escape_string()은 쿼리에 사용할 모든 변수에서 사용하지 말고 따옴표로 묶은 문자열에서만 사용하십시오. –

-1

지금 바로 같은 페이지에 내가 데이터베이스에 $를 newText를 삽입 한 후 난 당신이 잘못하고있는 일의 사용자

에 텍스트를 표시합니다.
HTTP 표준은 모든 성공적인 POST 요청 후GET 메서드를 리디렉션해야합니다.
따라서 데이터베이스에서 삽입 된 데이터를 읽고 사용자에게 보여줄 수있는 동일한 페이지에 사용자를 리디렉션해야합니다.

실수로 당신이 만든 - 그냥 데이터베이스 작업에 가까운 곳으로 이스케이프 이동, 목적을 위해 사용됩니다 (그래도 그것을 잊지의 위험없이 의무적으로 사용됩니다!).
이상적으로 쿼리의 데이터를 나타 내기 위해 일부 변수를 사용하고 쿼리를 처리 할 일부 처리기를 사용해야합니다.
따라서, 질의 호출

DB::run("UPDATE table SET text=s:text",$_POST['text']); 

같을 수 s:text이다 적절히 제조 상기 $_POST['text'] 값으로 치환 플레이스 홀더 이름 설정 유형에 따라 이도록 변수 (라는 자리) (s "문자열"을 의미하고, 당신의 함수가 이스케이프하고 데이터를 인용하도록 알려줍니다.)
그래서 필요한 모든 준비가 내부에서 수행되고 소스 변수를 망칠 것입니다.

관련 문제