2010-05-16 7 views
-2

mysql_real_escape 데이터를 두 번 이상 사용하면 차이가 있는지 궁금한가요?mysql_real_escape 두 번 이상

따라서 웹 사이트의 한 부분에서 데이터를 이스케이프 한 다음 코드의 다른 부분에서 다시 이스케이프 처리하면됩니다. 이것이 문제가 될까요? 또는 차이를 만들 수 있습니까?

+9

왜 그냥 시도해보고 결과를 인쇄하지 않으시겠습니까? –

+0

mysql_real_escape_string은 멱등 함수가 아닙니다. – Gumbo

답변

3

예. 여분의 불필요한 백 슬래시가 생깁니다.

1

물론 데이터는 이중 이스케이프 처리됩니다.

mysql_real_escape()을 사용하면 안되며 mysqli을 통한 매개 변수화 된 쿼리가 충분히 오래 사용되었습니다.

+0

@ whoever downvoted this : 설명이 좋았을 것이다. – Tomalak

1

이스케이프 처리 된 문자열과 같아 보이는 것이 이스케이프 처리되지 않은 문자열이기 때문에 이스케이프 처리 된 문자열과 이스케이프 처리되지 않은 문자열을 구분할 수 없습니다. 따라서 다시 벗어나려고하면 탈출을 피할 수 있습니다. 이스케이프 처리 된 텍스트는 MySQL이 읽는 텍스트가됩니다.

따라서 두 번 이상 벗어나서는 안됩니다.

그러나 더 나은 해결책은 paramterized 쿼리를 사용하는 것입니다. 이후로는 탈출 할 필요가 없기 때문입니다.

2

예, 문제가 될 수 있습니다. 예를 들어

:
만약는 "조의 집"입니다 백 슬래시 저장 ' "조 \\\"의 하우스와 두 번째 생산됩니다의 집 "조 \"을'생산합니다 첫 번째 호출, 데이터베이스에.

이것은 웹 서버가 마술 따옴표를 사용할 수 있고 클라이언트의 입력에 mysql_real_escape_string을 사용할 때 발생하는 문제와 유사합니다. 이것은에 의해 해결된다 :

if (! get_magic_quotes_gpc()) { 
    $value = mysql_real_escape_string($_GET["value"]); 
} else { 
    $value = mysql_real_escape_string(stripslashes($_GET["value"])); 
} 

+0

매직 따옴표는 mysql (i) _ (real) _escape 문자열과 동일한 이스케이프를 수행하지 않습니다. 마술 따옴표를 처리 할 수없는 경우 마술 따옴표를 처리하는 올바른 방법은 스트라이프 슬래시로 제거하고 필요한 경우 이스케이프 처리 (즉, 매개 변수화 된 쿼리를 사용할 수없는 경우)를 적용하는 것입니다. 이상적으로는 비 DB 환경에서 출력해야 할 때마다 제거해야하는 것을 피하기 위해 처음부터 마법 인용 부호를 없애는 것이 좋습니다. –

+0

나는 점수 때문에 다운 다운하지 않을 것이지만,이 접근법은 잘못되었습니다. 탈출은'$ value = mysql_real_escape_string ($ _ GET [ "value"]);'** 무조건적인 ** '이어야합니다. 그리고 마법 따옴표를 제거하는 것은 스크립트 작성의 맨 위에있는 쿼리 작성 전까지해야 할 또 다른 문제입니다. –

+0

마지막 조건에서'$ value = mysql_real_escape_string (stripslashes ($ _ GET [ "value"]));을하지 않으면 당신을 downvote해야 할 것입니다. –

1

예 [I 아래 코멘트에 수정을 반영하는 대답을 편집 (후자의 예를 들어 http://www.php.net/get_magic_quotes_gpc 참조), 그것은 이상 - 이스케이프됩니다 문제. 정확히 무엇을하는지에 관계없이 모든 이탈에 대해 동일합니다. 예를 들어, 일반적인 규칙을 다음 문자열에 큰 따옴표를 탈출하려는 경우 : 두 등등

bla \\\"foo\\\" 

및됩니다 후 1 이스케이프는

bla \"foo\" 

된다

bla "foo" 

후. "이스케이프 해제"수는 정확히 "이스케이프 횟수"와 일치해야합니다. 일부 사이트에서 텍스트 필드의 일부 문자를 과도하게 이스케이프 처리하여 간단한 아포스트로피가 출력시 \'이되도록이 문제가 표시 될 수 있습니다. mysql_real_escape에 대한

$string = "I'm Chuck!"; 
mysql_escape_string($string); // I\'m Chuck! 
mysql_escape_string(mysql_escape_string($string)); // "I\\\'m Chuck! 
0

예, 그것은 차이가 있습니다. 스크립트의 다른 모든 인스턴스는 주요 디자인 결함입니다.

물론 DB 클래스를 사용하는 것이 좋습니다.

8

바로 이곳이 당신이 데이터를 저장할 수있는 정보를 제공해드립니다 바로 전에 입니다 :

+0

최고의 포인트! 나는 그것을 스스로 지적해야했다. –

+0

문제를 해결할 수있는 최적의 방법은 아니지만 최선의 방법입니다. –

+0

@ 브레어가 약간 설명해 주실까요? 무슨 문제가 있고 뭐가 최고야? –

관련 문제