2014-12-27 3 views
1
// Check and set search 
if($_POST['searchQuery'] !== "null"){ 
    $search = $_POST['searchQuery']; 

    $search = explode(' ', $search); 


    //long words are more than 4 
$longwords = ''; 
$shortwords = ''; 


$searchCount = count($search); 

foreach ($search as $word) { 
    $word = trimplural($word); 

    if ($searchCount > 1){ 

     if (strlen($word) > 3) { 
      if (!in_array($word,array('sale','brand','lots'))){ 
        $longwords.=' +'.$word; 
        } //check for words 
     }else{ //else 3 letters 
        if (strlen($word) == 3) { 
         if (!in_array($word,array('and','the','him','her','for','new','you'))){ 
           $shortwords.= " OR (fname LIKE '%$word%' OR lname LIKE '%$word%') "; 
          } //search for words 
        }//strlen == 3 
     } 

    }else{//else searchcount == 1 
          if (!in_array($word,array('and','the','him','her','for','new','you'))){ 
           $shortwords.= " OR (fname LIKE '%$word%' OR lname LIKE '%$word%') "; 
         } 
    } 


} 



}else{ 
    $search = null; 
} 

는 SQL이다 :검색 쿼리가 안전하지 않은

$sql = "SELECT * FROM people WHERE MATCH (lname,fname) AGAINST (:longwords IN BOOLEAN MODE) $shortwords LIMIT " . $postnumbers . " OFFSET ".$offset; 
    $q1 = $conn->prepare($sql) or die("failed!"); 
    $q1->bindParam(':uniid', $uniid, PDO::PARAM_STR); 
    $q1->bindParam(':longwords', $longwords, PDO::PARAM_STR); 
    $q1->execute(); 

나는 위의 코드를 같이 사용하여 생성되는 검색 쿼리가, 나는이 MySQL의 전체 텍스트 검색 및 LIKE 쿼리의 결합 사용하고 싶습니다. 이 작업을 수행하기 위해 SQL 쿼리의 일부를 변수 $shortwords에 추가하여 작동하도록 LIKE 부분을 가져 왔지만 SQL 주입 때문에이 옵션이 가장 좋음을 이해합니다.

SQL에 구현하기 전에이 쿼리를 '더 안전하게'만들거나 출력 결과를 삭제할 수 있습니까?

답변

1

절을 만들 때 문자열에 추가하기 전에 $ word 변수에 PDO :: quote를 사용하면 위생적으로 값을 이스케이프 처리합니다. 그렇다면 단축 문구를 사용하여 Param을 바인딩 할 필요는 없지만 동일한 기능을 얻을 수 있습니다. 오프셋 및 postnumbers 사출 정말 취약하지 않습니다 동안

if (!in_array($word,array('and','the','him','her','for','new','you'))){ 
    $safe = $conn->quote('%'.$word.'%'); 
    $shortwords.= " OR (fname LIKE $safe OR lname LIKE $safe) "; 
} //search for words 

것은 여전히 ​​쿼리가 더 읽기 쉽게 만들 것이다, 너무 바인드 좋을 수도 있지만 그게 단지 :

이 같은 작업을해야합니다 내 의견.

또한 foreach 외부에서 단어 목록 배열을 정의하는 것이 좋습니다. 현재 인터프리터는 루프를 반복 할 때마다 배열을 다시 작성합니다. 다시 말하지만, 큰 거래는 아니지만 언급할만한 가치가 있습니다.

+0

답장을 보내 주셔서 감사합니다. 불행히도 짧은 단어 목록은 최종 결과에서이 단어들을 제외시킵니다. – neeko

+0

다시 한번 감사드립니다! PDO :: quote를 어떻게 사용하는지 예제를 제공 할 수 있습니까? 그리고 큰 외침 나는 다른 매개 변수들 역시 묶을 것입니다! – neeko

+0

@neeko, 환영합니다. 도움이 될 수있어서 기쁩니다! – superultranova