2014-11-27 1 views
1

인수에 $filter 인수를 허용하고 인수의 필터를 기반으로 SQL 테이블에서 데이터를 가져 오는 함수가 있습니다. 처음에는 함수 하나가 하나의 변수 $filter을 가져오고 다른 필터가 여러 필터를 사용하도록 함수 오버로드를 시도했습니다. 하지만 필자는 필자가 필터 태그를 어떻게 위생 처리 할 수 ​​있는지 궁금해하기 시작했습니다.where 절에서 열 이름으로 살균 된 입력 전달

혼란 스러울 수도 있으므로 여기에 몇 가지 예가 나와 있습니다. 예를 들어 사용자가 검색 상자에 입력하여 이라는 이름의 모든 사용자를 표시하려면을 입력합니다. 따라서 $filter_tag은 '이름'을 말하고 '$filter'은 '존'이라고 설정됩니다. 내 PDO 쿼리는 다음과 같이 보일 것입니다 :

$query = "SELECT `name` FROM `users` WHERE "; 
$query .= $filter_tag." = ?"; 

문제는 $filter_tag는 소독되지 않는 것입니다. 내가 위생 처리를하고 변수가 이스케이프되면 쿼리가 작동하지 않습니다. 아마 내가 필요로하는 것보다 더 복잡하게 만들고 있으며 간단한 해결책이 있습니다.

내가 묻는 것을 이해하지 못했다면 의견을 보내주십시오.

답변

6

당신은 유효한 태그 화이트리스트 만들 수 있습니다

if (in_array($filter_tag, ['name', ...], true)) { 
    $query .= $filter_tag . = '?'; 
} 

는 다른 방법으로 모든 잘못된 문자를 제거 할 수 있습니다를,하지만 많은 유효한 열 이름 :

있기 때문에 나는, 화이트리스트 방식을 선호 마지막으로, 위의 코드 대신 조건을 바꿀 수 있으며 주어진 태그가 허용 목록에 나타나지 않으면 오류가 발생합니다. 어떤 경우에는 ->execute()에 전달 된 인수의 수가 쿼리의 자리 표시 자 수와 일치해야하기 때문에 나중에 오류가 발생할 수 있으므로 더 나은 방법이 될 수 있습니다.

+0

완벽하고 방금 내가 찾고있는 것이 었습니다. – ChrisRockGM