문제

PHP/MySQL에서 문자열을 이스케이프/스트리핑하는 데 문제가 있습니다. 항상 중복된 슬래시가 있는 것 같습니다.


다음 문자열을 예로 들어보겠습니다.

<span style="text-decoration:underline;">underline</span>


데이터베이스에 문자열을 추가할 때 다음과 같이 이스케이프 처리합니다. mysql_real_escape_string() 다음은 데이터베이스에 저장됩니다(편집하다:mysql 앱으로 직접 데이터베이스를 쿼리하여 이를 확인했습니다.

<span style=\\\"text-decoration:underline;\\\">underline</span>


데이터베이스에서 다시 읽을 때 문자열을 전달합니다. stripslashes() 다음이 반환됩니다.

<span style=\"text-decoration:underline;\">underline</span>


따옴표는 여전히 이스케이프 처리되어 있으므로 HTML이 깨지고 텍스트에 밑줄이 그어지지 않습니다.


  1. 왜? mysql_real_escape_string() 세 개의 슬래시를 추가하고 stripslashes() 두 개의 슬래시를 제거 하시겠습니까?나는 둘 다 하나의 슬래시를 추가/제거할 것으로 기대합니다.
  2. 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
  3. 내가 올바른 방식으로 접근하고 있습니까?
도움이 되었습니까?

해결책

최고의 솔루션

php.ini 파일에서 다음과 같은 가능성이 있습니다. magic_quotes_gpc 지시어가 on으로 설정되어 있습니다.보안상의 이유로 이 기능을 비활성화해야 합니다.php.ini 파일에 접근할 수 없는 경우(예:공유 호스트에서) .htaccess 지시문을 사용하여 항상 동일한 작업을 수행할 수 있습니다(아파치 서버라고 가정).

php.ini에서

magic_quotes_gpc Off

.htaccess 파일에서:

php_flag magic_quotes_gpc Off

왜 이런 일이 발생합니까?

이런 일이 일어나는 이유는 다음과 같은 논리의 과정 때문이다.

  1. 이스케이프가 필요한 문자열이 서버로 전송됩니다.
    • This is my string. It's awesome.
  2. Magic Quotes는 코드에 도달하기 전에 아포스트로피를 이스케이프합니다.
    • This is my string. It\'s awesome
  3. mysql_real_escape_string 이제 이스케이프할 두 문자, 즉 백슬래시가 있습니다. \\ 아포스트로피도 그렇고 \'.
    • This is my string. It\\\'s awesome
  4. 이 새로운 슈퍼 이스케이프 문자열은 데이터베이스에 저장됩니다.
  5. 문자열이 데이터베이스에서 검색되면 해당 문자열이 다음으로 전달됩니다. stripslashes.이렇게 하면 3단계에서 추가된 두 개의 이스케이프가 제거되지만 백슬래시 중 하나가 이스케이프되었으므로 stripslashes 속한다고 생각합니다.
    • This is my string. It\'s awesome

백슬래시 수가 늘어날 때마다 이러한 문자열을 데이터베이스에 다시 제출하면 이 문제가 실제로 해결되지 않을 수 있습니다.

대체 솔루션

빠르고 쉬운 대안은 다음에 의해 추가된 슬래시를 간단히 제거하는 것입니다. magic_quotes 문자열을 전달하기 전에 mysql_real_escape_string.

$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);

다른 팁

데이터베이스에 문자열을 추가할 때 다음과 같이 이스케이프 처리합니다. mysql_real_escape_string() 다음이 데이터베이스에 저장됩니다.

<span style=\\\"text-decoration:underline;\\\">underline</span>

아니요, 그렇지 않습니다.SQL 쿼리에서 문자열을 이스케이프하면 쿼리의 데이터만 전송됩니다.데이터베이스는 추가 슬래시 없이 쿼리를 구문 분석하고 데이터를 데이터베이스에 저장합니다.따라서 데이터베이스에서 데이터를 검색할 때 다음을 수행해야 합니다. ~ 아니다 무엇이든 탈출하세요.그것은 일반적인 오해입니다.

출력에 과도한 슬래시가 있는 경우 아마도 매직 따옴표가 켜져 있을 것입니다. 꺼 줘.

편집하다:

mysql> create table foo (bar text) ;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO foo (bar) VALUES ("<span style=\\\"text-decoration:underline;\\\">underline</span>");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM foo;
+-------------------------------------------------------------+
| bar                                                         |
+-------------------------------------------------------------+
| <span style=\"text-decoration:underline;\">underline</span> | 
+-------------------------------------------------------------+
1 row in set (0.00 sec)

보시다시피, 쿼리에는 데이터베이스 내에 데이터가 나타나는 것보다 한 단계 더 많은 이스케이프 수준이 있으며 결과적으로 쿼리할 때 데이터가 어떻게 나오는지 알 수 있습니다.귀하의 경우에는 무엇입니까? 아마 계속해서 마술 따옴표를 켠 다음 쿼리에 포함하기 전에 문자열을 이스케이프 처리한다는 것입니다.이로 인해 이중 이스케이프가 발생하여 데이터가 변조됩니다.적절한 해결책은 지금처럼 문자열을 계속 이스케이프하되 마법 따옴표를 끄는 것입니다.그리고 ~하지 않다 데이터베이스에서 나오는 데이터에 대해 무엇이든 수행합니다.시스템에 이미 있는 데이터를 먼저 정리해야 한다는 점에 유의하세요.

만약에 get_magic_quotes_gpc() SERVER이(가) 꺼져 있으므로 우리만 사용할 수 있습니다.

$data= mysql_real_escape_string($_POST['data']);

만약에 get_magic_quotes_gpc() SERVER에 켜져 있습니다. 사용해야 합니다.

$data= mysql_real_escape_string(stripslashes($_POST['data']));

그렇지 않으면 데이터에 백슬래시 두 개를 추가하세요.

또 다른 해결책은 우리가 사용할 수 있는 것입니다. stripslashes($data) 단지 use만 사용한다면 datadase에서 가져오는 동안 mysql_real_escape_string($_POST['data']);

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top