PHP mysql_real_escape_string() -> 여러 개의 슬래시를 남기는 스트립슬래시()
-
19-09-2019 - |
문제
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이 깨지고 텍스트에 밑줄이 그어지지 않습니다.
- 왜?
mysql_real_escape_string()
세 개의 슬래시를 추가하고stripslashes()
두 개의 슬래시를 제거 하시겠습니까?나는 둘 다 하나의 슬래시를 추가/제거할 것으로 기대합니다. - 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
- 내가 올바른 방식으로 접근하고 있습니까?
해결책
최고의 솔루션
php.ini 파일에서 다음과 같은 가능성이 있습니다. magic_quotes_gpc
지시어가 on으로 설정되어 있습니다.보안상의 이유로 이 기능을 비활성화해야 합니다.php.ini 파일에 접근할 수 없는 경우(예:공유 호스트에서) .htaccess 지시문을 사용하여 항상 동일한 작업을 수행할 수 있습니다(아파치 서버라고 가정).
php.ini에서
magic_quotes_gpc Off
.htaccess 파일에서:
php_flag magic_quotes_gpc Off
왜 이런 일이 발생합니까?
이런 일이 일어나는 이유는 다음과 같은 논리의 과정 때문이다.
- 이스케이프가 필요한 문자열이 서버로 전송됩니다.
This is my string. It's awesome.
- Magic Quotes는 코드에 도달하기 전에 아포스트로피를 이스케이프합니다.
This is my string. It\'s awesome
mysql_real_escape_string
이제 이스케이프할 두 문자, 즉 백슬래시가 있습니다.\\
아포스트로피도 그렇고\'
.This is my string. It\\\'s awesome
- 이 새로운 슈퍼 이스케이프 문자열은 데이터베이스에 저장됩니다.
- 문자열이 데이터베이스에서 검색되면 해당 문자열이 다음으로 전달됩니다.
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']);