2009-10-13 4 views
5

역사적으로는, 나는 항상 데이터베이스를 만지고 끝 사용자로부터 파생 된 모든 입력 PHP 바운드 매개 변수가있는 MySQLi 준비 쿼리가 안전합니까?

mysql_real_escape_string() 

을 사용했습니다.

이제 MySQLi로 완전히 변환되었고 바인딩 된 매개 변수가있는 준비된 쿼리를 사용하고 있으므로 SQL 주입 공격의 가능성을 효과적으로 제거 했습니까?

내가 더 이상

mysql_real_escape_string()? 

필요 말을하지, ​​내가 잘못 알고 이것은 나의 이해와 내 프로젝트의 기초 : http://sourceforge.net/projects/mysqldoneright/files/Base/MysqlDoneRight-0.23.tar.gz/download

이것은 내가 잘못 같은 생각 싶어 일이 아닙니다 내가 그것을 발표 했으므로 다른 사람들에게도 영향을 줄 수 있습니다.

모든 사용자 입력은 이제 bind_parms로 끝납니다.
준비 단계에서 제공된 쿼리는 정적입니다.

답변

6

너무 간단하지 않습니다. 대신 리터럴 값 만 대신에 SQL 식으로 응용 프로그램 변수를 보간의 바인딩 매개 변수를 사용할 수 있습니다

$sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe 

$sql = "SELECT * FROM MyTable WHERE id = ?"; // safe 

하지만 당신은 리터럴 값 외에 쿼리의 일부 동적을해야하는 경우?

$sql = "SELECT * FROM MyTable ORDER BY ".$_GET["sortcolumn"]; // not safe 

$sql = "SELECT * FROM MyTable ORDER BY ?"; // doesn't work! 

매개 변수는 항상 열 식별자가 아니라 값으로 해석됩니다. 과 다른 ORDER BY 'score'을 사용하여 쿼리를 실행할 수 있으며 매개 변수를 사용하면 앞의 것으로 해석됩니다. 즉 score 열의 값이 아닌 상수 문자열 'score'이 해석됩니다.

동적 SQL을 사용하고 응용 프로그램 변수를 쿼리에 삽입하여 원하는 결과를 얻는 경우가 많이 있습니다. 이 경우 검색어 매개 변수가 도움이되지 않습니다. SQL 인젝션 결함을 예방하기 위해서는 여전히 방심하지 않고 코드를 방어해야합니다.

이 작업은 프레임 워크 또는 데이터 액세스 라이브러리에서 수행 할 수 없습니다. SQL 삽입 결함을 포함하는 SQL 쿼리 문자열을 항상 생성 할 수 있으며 데이터 액세스 라이브러리가 SQL 쿼리를보기 전에이 작업을 수행해야합니다. 그렇다면 어떻게 의도적이고 결함이 있는지를 어떻게 알 수 있습니까? 여기

이 방법은 보안 SQL 쿼리를 달성하기 위해 다음과 같습니다

  • 필터 입력. SQL 쿼리에 삽입되는 모든 가변 데이터를 추적합니다. 잘못된 문자를 제거하려면 filters 입력을 사용하십시오.예를 들어, 정수를 예상 할 경우 입력이 정수로 제한되어 있는지 확인하십시오.

  • 출력을 이스케이프 처리합니다.이 컨텍스트의 출력은 데이터베이스 서버에 보내는 SQL 쿼리가 될 수 있습니다. 값에 대해 SQL 쿼리 매개 변수를 사용할 수 있다는 것을 알고 있지만 열 이름은 무엇입니까? mysql_real_escape_string()이 문자열 값을위한 것과 같이 식별자에 대해 이스케이프/인용 기능이 필요합니다.

  • 코드 리뷰. 누군가가 두 번째 눈 쌍이되도록하고 SQL 코드를 살펴보고 위의 두 기술을 사용하지 않은 곳을 찾을 수 있도록 도와줍니다.

+0

예. ORDER BY를 할 수 없다는 것을 알았습니까? 비트와 매개 변수. 좋은 대답. –

+0

내가 downvote있어? Downvoter, 당신은이 대답이 만족스럽지 않다고 생각하는 이유를 묘사해야합니다. 아마 나는 그것을 향상시킬 수있다. –

13

예. 준비된 쿼리를 사용하면 매개 변수를 이스케이프 처리합니다.

+0

짧고, 달콤하며 정확합니다. – ceejayoz

+0

감사합니다. 그냥 내가 뭔가 확실한 것을 놓치지 않았는지 확인하고 싶었습니다. 나는 그것을하는 경향이있다. –

1

매개 변수를 준비된 명령문에 바인딩하면 데이터를 자동으로 이스케이프하므로 이스케이프 처리해야 이스케이프 처리가 완료됩니다. 이중 탈출은 대개 ​​나쁜 일입니다. 최소한 나중에 추가 이스케이프 문자를 사용하면 추악한 결과가 발생합니다.

관련 문제