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


84

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

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


10
추신 : 그냥 친구에게 물어보고 나 자신을 바보로 만들지 않았을 수도 있지만 모두가 이야기하는 것이 무엇인지 궁금해하는 나처럼 많은 사람들이있을 것이라고 생각했습니다.
Brett

답변:


136

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

"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의 맥락에서 (.


6
SQL 인젝션의 문제를 해결하기 위해 문자열 이스케이프를 수행하는 것은 나쁜 관행으로 간주되며 제대로 수행되지 않으면 (특히 특정 유형의 기형 멀티 바이트 문자 공격을 처리 할 때) 보안 문제로 쉽게 이어질 수 있습니다. 이러한 이유로 문자열 이스케이프를 사용하지 말고 대신 매개 변수가있는 SQL 쿼리 또는 저장 프로 시저를 사용하십시오.
Cheekysoft

22

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

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


1

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

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

$txt = "Hello world!";

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

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

$txt = "this \" is escaped";

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.