[php] 문자열을 이스케이프한다는 것은 무엇을 의미합니까?

나는 읽고 있었다 합니까 $ _SESSION을 [ ‘이름’] SQL 쿼리에 들어가기 전에 이스케이프 할 필요가? 그리고 “원본에 관계없이 SQL 쿼리에 전달하는 모든 문자열을 이스케이프해야합니다”라고 말했습니다. 이제 저는 이와 같은 것이 정말 기본이라는 것을 압니다. Google 검색에서 2 만 개가 넘는 결과가 나타났습니다. Stackoverflow만으로는 20 페이지의 결과가 있었지만 실제로 문자열 이스케이프가 무엇인지 또는 어떻게 수행하는지 설명하는 사람은 없습니다. 그냥 가정합니다. 도와주세요? 언제나처럼 PHP로 웹 앱을 만들고 있기 때문에 배우고 싶습니다.

나는 보았다 :
Inserting Escape Characters , Java의 모든 이스케이프 문자무엇입니까? ,
addcslashes ()와 문자열 탈출 질수 ,
이스케이프 문자를 ,
는 mysql_real_escape_string 무엇을 () 정말이야? ,
PHP의 문자열에서 큰 따옴표를 어떻게 이스케이프 할 수 있습니까? ,
MySQL_real_escape_string이 슬래시를 추가하지 않습니까? ,
PHP의 문자열에서 이스케이프 시퀀스 제거 계속할 수 있지만 요점을 알 수 있습니다. 이것은 게으름이 아닙니다.



답변

문자열을 이스케이프하는 것은 해당 문자열에 사용 된 따옴표 (및 기타 문자)의 모호성을 줄이는 것을 의미합니다. 예를 들어 문자열을 정의 할 때 일반적으로 큰 따옴표 나 작은 따옴표로 묶습니다.

"Hello World."

하지만 내 문자열에 큰 따옴표가 있으면 어떻게 될까요?

"Hello "World.""

이제 모호함이 있습니다. 인터프리터는 내 문자열이 끝나는 위치를 모릅니다. 큰 따옴표를 유지하려면 몇 가지 옵션이 있습니다. 내 문자열 주위에 작은 따옴표를 사용할 수 있습니다.

'Hello "World."'

또는 내 따옴표를 벗어날 수 있습니다.

"Hello \"World.\""

슬래시가 앞에 오는 따옴표는 이스케이프 처리 되며 문자열 값의 일부로 이해됩니다.

쿼리와 관련하여 MySQL에는 혼란을 일으키지 않고 쿼리에 사용할 수없는 특정 키워드가 있습니다. 열 이름이 “Select”인 값 테이블이 있고이를 선택한다고 가정합니다.

SELECT select FROM myTable

이제 쿼리에 약간의 모호성을 도입했습니다. 쿼리 내에서 백틱을 사용하여 모호성을 줄일 수 있습니다.

SELECT `select` FROM myTable

이것은 필드 이름을 선택할 때 잘못된 판단을 사용하여 도입 한 혼란을 제거합니다.

이것의 많은 부분은 단순히 당신의 값을 전달함으로써 당신을 위해 처리 될 수 있습니다 mysql_real_escape_string(). 아래 예에서는 쿼리에 문제가 발생하지 않도록 사용자가 제출 한 데이터를이 함수를 통해 전달하고 있음을 알 수 있습니다.

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

다른 방법은 같은 이스케이프 문자열, 존재 add_slashes, addcslashes, quotemeta등, 목표로, 안전한 쿼리를 실행하고 많은 개발자들이 선호 할 때 찾을 수 있습니다 불구하고 mysql_real_escape_string또는 pg_escape_stringPostgreSQL의 맥락에서 (.


답변

일부 문자는 사용중인 SQL 데이터베이스에 특별한 의미가 있습니다. 이러한 문자가 쿼리에 사용되면 공격자가 데이터베이스를 손상시키는 것을 포함하여 예상치 못한 및 / 또는 의도하지 않은 동작을 유발할 수 있습니다. 이러한 문자가 이러한 방식으로 쿼리에 영향을주지 않도록하려면 이스케이프 처리하거나 다른 방식으로 말하려면 데이터베이스에이 쿼리에서 특수 문자로 처리하지 않도록 지시해야합니다.

의 경우 mysql_real_escape_string()는 탈출 \x00, \n, \r, \, ', "\x1a이들로, 탈출하지 않는 경우, MySQL 데이터베이스와 SQL 주입을 포함하는 이전에 언급 한 문제가 발생할 수 있습니다.


답변

간단하게하기 위해 기본적으로 백 슬래시 “\”가 런타임 동안 인터프리터에 대한 명령이라고 상상할 수 있습니다.

예를 들어이 문장을 해석하는 동안 :

$txt = "Hello world!";

어휘 분석 단계에서 (또는 개별 토큰으로 문까지 분할 할 때)이이 토큰이 확인 될 것입니다
$, txt, =, ", Hello world!, ", 및;

그러나 문자열 내의 백 슬래시는 추가 토큰 집합을 유발하고 바로 뒤에 오는 문자로 작업을 수행하는 명령으로 해석됩니다.

$txt = "this \" is escaped";

다음 토큰 결과 :
$, txt, =, ", this, \, ", is escaped, ", 및;

인터프리터는 \토큰 을 이은 캐릭터에 따라 무엇을해야하는지 이미 알고 있습니다 (또는 취할 수있는 미리 설정된 경로가 있습니다) . 따라서이 경우 "문자열 끝 명령이 아닌 문자로 처리합니다.


답변