나는 읽고 있었다 합니까 $ _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_string
PostgreSQL의 맥락에서 (.
답변
일부 문자는 사용중인 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
, "
, 및;
인터프리터는 \
토큰 을 이은 캐릭터에 따라 무엇을해야하는지 이미 알고 있습니다 (또는 취할 수있는 미리 설정된 경로가 있습니다) . 따라서이 경우 "
문자열 끝 명령이 아닌 문자로 처리합니다.