2012-05-18 2 views
52

Does $_SESSION['username'] need to be escaped before getting into an SQL query?을 읽었으며 "원본과 상관없이 SQL 쿼리에 전달하는 모든 문자열을 이스케이프해야합니다." 이제 저는이 같은 것이 정말로 기본적인 것임을 압니다. Google 검색 결과가 20,000 개가 넘었습니다. Stackoverflow만으로는 20 페이지의 결과가 있었지만 아무도 실제로 문자열을 이스케이프 처리하는 방법이나 처리 방법을 설명하지 못했습니다. 방금 가정합니다. 나 좀 도와 줄 수있어? 항상 PHP로 웹 앱을 만들고 있기 때문에 배우고 싶습니다.문자열을 벗어나는 것은 무슨 의미입니까?

내가 살펴 보았다 : Inserting Escape Characters, What are all the escape characters in Java?, Cant escape a string with addcslashes(), Escape character, what does mysql_real_escape_string() really do?, How can i escape double quotes from a string in php?, MySQL_real_escape_string not adding slashes?, 내가 갈 수 있지만, 난 당신이 포인트를 얻을 확신 remove escape sequences from string in php. 이것은 게으름이 아닙니다.

+4

PS는 그냥 친구를 물어 나 자신을 바보로 만들지는 않았지만 모든 사람들이 이야기하고있는 것이 무엇인지 궁금해하는 사람들이 많이있을 것이라고 생각했습니다. – Brett

답변

95

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

"Hello World." 

하지만 내 캐릭터가 그 안에 큰 따옴표가 있다면?

"Hello "World."" 

이제 통역사는 내 문자열이 어디에서 끝나는 지 모릅니다. 내 큰 따옴표를 유지하려면 몇 가지 옵션이 있습니다. 의 일부가 될

"Hello \"World.\"" 

을 탈출하고있다 슬래시로 시작되는 모든 견적 이해를 :

'Hello "World."' 

아니면 내가 내 따옴표를 탈출 할 수 있습니다 : 내 문자열 주위에 작은 따옴표를 사용할 수 있습니다 문자열의 값.

쿼리와 관련하여 MySQL에는 혼란을주지 않고 쿼리에서 사용할 수없는 특정 키워드가 있습니다. 우리는 열이 "선택"이라는 된 값의 테이블이 있다고 가정하고, 우리는 그것을 선택하고 싶었 :

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하고, 목표로, 안전한 쿼리를 실행하는 것입니다 및 대형 개발자의 PostgreSQL의 맥락에서 (mysql_real_escape_string 또는 pg_escape_string를 선호 할 때 것을 찾을 수 있지만, 더.

+0

당신은 'mysql_real_escape_string()'을 통해 단순히 값을 전달함으로써이 많은 것들을 처리 할 수 ​​있다고 말했습니까? – Brett

+0

@Brett 문제는 ​​없지만 답변의 끝에 조금 더 추가했습니다. – Sampson

+0

고마워요 @ 조나단 많이 감사하겠습니다. – Brett

15

일부 문자는 사용중인 SQL 데이터베이스에 특별한 의미가 있습니다. 이러한 문자가 쿼리에 사용될 때 공격자가 데이터베이스를 손상시키는 것을 허용하는 등의 예기치 않은 및/또는 의도하지 않은 동작이 발생할 수 있습니다. 이러한 문자가 이스케이프 처리되거나 다른 방식으로 처리되어야하는 방식으로 이러한 문자가 쿼리에 영향을 미치지 않도록하려면이 쿼리에서 특수 문자로 처리하지 않도록 데이터베이스에 지시해야합니다. mysql_real_escape_string()의 경우

그것은 \x00는, \n는, \r는, \', " 및 이들과 같은 \x1a이 탈출하지 않을 경우, MySQL 데이터베이스와 SQL 주입을 포함하는 이전에 언급 한 문제가 발생할 수 있습니다 이스케이프합니다.

+0

@ 감사합니다 존 이것은 좋은 선발 답이었습니다. 나는 그것이 또한 유효한 대답 이었기 때문에 정말로 기쁘게 생각합니다. – Brett

관련 문제