2012-11-09 2 views
0

나는 PDO를 사용하고 있으며 사용자가 검색 결과로 선택할 수있는 옵션이 있습니다. 몇 가지 예는 정렬, 결과 수, 페이지 번호 등입니다. 준비된 문을 사용하여 SQL 주입 공격을 방지하기 위해이 데이터의 유효성을 검사했지만 변수가 쿼리에 전달되지 않습니다.PDO로 MySQL 쿼리 옵션을 위해 prepared statement 사용하기

내가 뭘 잘못하고 있니? 결과의 정렬 및 수는 SELECT 메뉴이며 페이지 번호는 숫자를 입력 할 수있는 텍스트 입력 양식입니다.

$query = "SELECT SQL_CALC_FOUND_ROWS * FROM people ORDER BY id :sortBy LIMIT $start, :total"; 
$result = $conn->prepare($query); 
$result->bindValue(":sortBy", $sortBy, PDO::PARAM_STR); 
$result->bindValue(":total", $total, PDO::PARAM_INT); 
+0

"변수가 쿼리에 전달되지 않는다"는 것을 어떻게 결정합니까? – deceze

+1

당신은 왜 모든 것을 묶는 것이 아닌가? 즉'$ start'. –

+0

bindValues를 제거하고 sortBy 및 : totalResults 대신 ASC 및 100을 입력하면 작동합니다. – Zoolander

답변

2

바운드 매개 변수는 쿼리에 전달할 실제 데이터입니다. 실제 제어 명령을 바인드 할 수 없습니다. MySQL은이를 명령이 아닌 데이터로 해석합니다.

대신 정렬 기준으로 보낼 수있는 것은 무엇인지 확인하고 'ASC'또는 'DESC'를 쿼리에 전달하는 것입니다. 사용자가 제공 한 정보를 쿼리에 전달하지 않고 대신 전달할 사전 정의 된 명령 집합을 결정할 때 사용합니다. 주입 위험이 없습니다.

+0

이것은 완전히 사실이 아닙니다. 원하는 것을 바인딩 할 수 있습니다. 문제는 바인딩 할 수없는 것이 아니라 바인딩 된 방식입니다. –

+0

요점은 테이블 식별자와 같은 것을 바인딩하면 MySQL에서 인식하지 못하고 쿼리가 실패한다는 것입니다. – dersam

관련 문제