2013-05-01 3 views
7

우선, 사람들이 저장 프로 시저를 사용하여 쿼리를 다시 사용하고 이스케이프 처리를 수행하도록하고 싶습니다. 그러나 많은 개발자가 mysqli_real_escape_string은 SQL 주입을 100 % 방지 할 수 없다고 말했습니다. 누군가가 이것을 제공 할 수 있습니까? 내가 mysqli_real_escape_string항상 문자열을하지만 당신은 당신이 번호를 확인하지 않는 간파 할 수있는 숫자 값에 대해 잘 될 것이라고 말할 것입니다 주제에 내 제한된 지식에서mysqli_real_escape_string이 SQL 인젝션을 막지 못하는 이유는 무엇입니까?

은 INT, 플로트, 더블, 등

입니다

편집 : 중요한 것을 추가하는 것을 잊어 버렸습니다. charset이 UTF8이고 그에 따라 mysqli_set_charset이 호출되었다고 가정합니다. 내가 본 유일한 인젝션은 소수의 문자 집합에 의존합니다 (어느 것도 UTF8이 아닙니다).

+6

(mysqli_real_escape_string 모든 바로이 자리 처리하는 데 사용할 수있는 동안) mysql_real_escape_string를 걸어 다니는 SQL 주입을() (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) –

+0

+1, JW 링크입니다. –

+0

링크에 의한 대답은 내 취향에 너무 화려합니다. –

답변

6
당신은 클라이언트 인코딩을 설정하는 mysqli_set_charset()를 사용하고있는 한

mysqli_real_escape_string()문자열을 포맷하는 데 사용됩니다, 그것은 완벽하게 안전합니다.

그러나, 귀하의 질문에 대신 막후 처리 (자리 기반 쿼리 또는 적어도 PDO의 quote() -like 함수의 형태로하는 을 탈출 않는, 바로 응용 프로그램 코드에서이 기능을 사용 묵시적 경우) 즉시 주입 할 수 있습니다.

그것은 문제가되는 자체 기능을 것이 아니라, 그것을 사용하는 방법 :

  • 가 필요한 형식의 부분, 하나는 쉽게 다른 부분을 잊고 문제로 풀 수처럼
  • 심지어는 문자열을 포맷하지 않고 쉽게 이스케이프 할 때 도움이되지 않는 또 다른 리터럴을 쉽게 오용 할 수 있습니다.
  • 둘째로, 응용 프로그램 코드에서 올바르게 사용되면 개발자가 모든 리터럴 형식을 적절하게 형식화하도록 강제 할 수 없으므로 사용법이 일관 적이 지 않거나 가끔씩 사용됩니다. 이것은 다시 부정확과 주입으로 이어질 수 있습니다.

즉, 당신은 항상 쿼리에서 데이터를 표현하기 위해 자리를 사용하는 이유

+0

큰 따옴표가 붙은 리터럴을 사용하는 경우 'NO_BACKSLASH_ESCAPES' 모드가 추가로 필요합니다 (http://stackoverflow.com/a/23277864). – eggyal

관련 문제