2013-07-31 5 views
0

우선 SQL 인젝션, XSS 공격 등의 대부분은 GET 매개 변수를 사용하여 URL을 통해 발생합니다.URL 확인 함수가 false를 반환합니까? PHP

그래서 나는 모두를 청소하고 불법적 인 단어가 있는지 찾아야합니다. 그렇다면 404 페이지로 나가십시오.

그래서이 제 기능입니다 :

private static function cleanPath() 
    { 
     if (isset($_GET)) 
     { 
      $count  = 0; 
      $illegal = array 
      (
       '<?', '<?php', '?>', '(', ')', 
       '{', '}', 'SELECT', '*', 'FROM', 
       'WHERE', 'select', 'from', 'where', 
       'DELETE', 'delete', 'echo', 'print', 
       'html', 'div', 'class', 'function', 
       'prepare', 'query', 'execute', 'exec_', 
       '_', '++', 'bindvalue', 'static', 
       '$' 
      ); 

      foreach ($illegal as $i) 
      { 
       foreach ($_GET as $key => $value) 
       { 
        $check = strpos($key, $i); 
        if (!$check) 
        { 
         $count++; 
        } 
       } 
      } 

      if ((int)$count == count($illegal)) 
      { 
       return true; 
      } 
      else 
      { 
       echo $count . ' array count:' . count($illegal) . '<br />'; 
       return false; 
      } 
     } 
    } 

그러나이 기능이 제대로 작동하지 않는 것처럼 보인다. ?section=register&sec

false를 반환합니다

와 나는이 링크를 입력합니다.

나는이 링크를 입력 할 때 : ?section=register&section

그것은 true를 돌려줍니다, 나는 섹션 외에 아무것도 입력하면 false를 반환합니다. 왜 그런가요?

당신은 내가 이미 디버깅보고, 그게 반환 무엇과 같이

62 array count:31 

그래서 $count = 62 and array count = 31

은 왜 62로 이동 하는가? 카운터를 두 배로 늘리는 것 같습니다. 내가 뭘 잘못 했니? 모든 것을 확인하는 경우

+3

당신은 모든 나쁜 단어를 필터링하지 않을 것입니다. 그렇게하려는 시도는 쓸데없는 것입니다. 좋은 단어를 허용하지 마십시오. – Anigel

+1

이 문제는 이미 해결되었습니다. [PDO] (http://www.php.net/manual/en/class.pdo.php)를 사용하는 것이 정말 쉽습니다. – Blazemonger

+0

PHP를/PDO 및 htmlspecialchars()를 사용하여 XSS를 막을 수 있습니다. –

답변

3

당신의 논리에 의해 간다, 실제 비교가 될 것이라고 확인 : 카운터가 모든 불법 용어에 대한 모든 GET 매개 변수에 대한 증가되는

if ((int)$count == (count($_GET) * count($illegal))) 

때문이다.

당신이이 문제에 대해 사용하는 접근 방식은 광범위하지 않을 수는 있지만 거의 완료되지는 않았습니다.

불법적 인 값을 방지하는 프로그래밍 구성 요소를 사용하는 것이 좋습니다 (Anigel은 언급 한 바와 같이 원하는 것을 허용하고 있음). 잘못된 구성을 검색하는 것보다 낫습니다.

관련 문제