2013-07-05 2 views
0

저는 약간의 프로젝트를 진행 중이고 뇌사 상태가되었으므로 여기 누군가가 제 코더 블록을 물리 칠 수 있도록 도와 줄 수 있기를 바랍니다.foreach 루프를 종료하고 결과를 검색하십시오.

어떤 값 (있는 경우)이 페이지 (위치)에 전달되는지에 따라 콘텐츠 표시를 변경하는 php를 사용하여 페이지를 만들려고합니다. 다른 위치를 저장 한 수신 허용 목록 배열을 만들었습니다. 먼저 일치 목록에 하나의 콘텐츠 집합이 표시되면 수신 허용 목록에 대해 전달 된 값을 확인합니다.

일치하지 않는 경우 theres가 단순한 오타 일 수 있는지 확인하기 위해 유사성 테스트를 실행 중이며 여전히 사람들이 원하는 페이지로 이동할 수 있지만 이것이 내가 갇혀있는 곳입니다.

나는 누군가가 ----

www.example.co.uk/location.php <을 입력 할 수있는 일반적인 위치 페이지를

www.example.co.uk/를로드 할 것을 바라고 있어요 location.php? loc = Bishops-Stortford < 타겟 위치 페이지를로드하려면

www.example.co.uk/location.php?loc=Bishop-Stortford < ---- 타겟을로드하십시오. 위치가 잘못되어도 페이지가 90 % 이상 일치합니다.

www.example.co.uk/location.php?loc=?php echo "귀하의 사이트를 해킹했습니다."; ?> ---- 잘하면 내 시스템은 불쾌한 코드 삽입을 무력화 할 것이다

나는 내가 가진 것을 볼 수 있도록 아래에 나의 코드를 게시 할 것이다.

<?php 
     $loc = ""; 
     $safelist = array("Bishops Stortford", "Braintree", "Chelmsford", "Dunmow", "Harlow", "Hertford", "Saffron Walden", "Sawbridgeworth", "Stansted", "Ware", 
        "Essex", "Hertfordshire"); 

     if(isset($_GET["loc"])) { 
      /* Gets the value of loc if set, replaces hyphens with spaces and capitalises first letters of words converting the rest to lowercase. */ 
      $loc = ucwords(strtolower(str_replace("-", " ", $_GET["loc"]))); 
     } 

     /* Is word in safelist */ 
     if (in_array($loc, $safelist)) { 
      /* Yes */ 
      if (($loc == "Essex") or ($loc == "Hertfordshire")) { 
       $county = True; 
      } else { 
       $county = False; 
      } 

      if ($county == False) { 
       echo "\"" . $loc . "\" is not a county"; 
      }else{ 
       echo "\"" . $loc . "\" is a county"; 
      } 
     } else { 
      /* No, Is string 90% similar to any entry within the safelist? */ 
      foreach ($safelist as $safeword) {  
       similar_text($safeword, $loc, $percent); 
       echo $safeword . " " . $loc . " " . $percent . "<br />"; 

       if ($percent >= 90) { 

      } 
     } 


    ?> 

if ($ percent> = 90)에 대해 어떻게 해야할지 생각할 수 없습니다. 루프를 종료하고 처음 90 % 이상 일치하는 결과를 얻고 싶지만 100 % 확신 할 수는 없습니다.

코드 삽입을 처리하는 가장 좋은 방법은 무엇입니까? www.example.co.uk/location.php?loc=?php echo "내가 귀하의 사이트를 해킹했습니다."; ?>

+0

당신이있어 이후 : – Barmar

+0

나는 그 질문을 이해하지 못한다. 에코 한 모든 내용이 페이지에 표시되므로 결과를 검색하기 위해 아무 것도 할 필요가 없습니다. – Barmar

+0

나는 디버깅을 위해 에코를 꺼낼 것이다. 내 머리 속에서 볼 수있는 방법은 foreach 루프를 사용하여 배열 내의 각 문자열을 페이지에 전달 된 문자열과 비교하는 것입니다. 백분율 값이 90 % 이상일 때 루프를 종료하고 근접한 배열의 값을 가져온 다음 해당 값을 사용하여 페이지 콘텐츠를로드합니다. 90 % 범위 내에서 일치하는 항목이 발견되지 않으면 악의적 인 것처럼 코드를 처리하고 싶습니다. –

답변

1

나는 이것이 당신이 원하는 생각 :

 foreach ($safelist as $safeword) {  
      similar_text($safeword, $loc, $percent); 
      echo $safeword . " " . $loc . " " . $percent . "<br />"; 
      if ($percent >= 90) { 
       $loc = $safeword; 
       $county = true; 
       break; 
      } 
     } 

는만큼 당신이 사용자 입력에 eval()를 호출하지 않는 한, 당신이 그들을 PHP 문을 주입에 대해 걱정할 필요가 없습니다. 어떤 것을 반향하면 브라우저에 보내지 만 PHP에서는 다시 실행하지 않습니다. 그러나 HTML 마크 업, 심지어 자바 스크립트까지 포함될 수 있으므로 사용자의 브라우저를 납치 할 수 있으므로 출력물을 여전히 살균해야합니다. 페이지에 출력을 표시하는 경우, 그것을 인코딩하는 htmlentities()를 사용

echo "Greetings, " . htmlentities($first_name); 
+0

감사합니다. Barmar. 난 당신의 코드를 사용하고 읽기 때문에 디버깅을 위해 적응 - 의 foreach ($의은 SafeWord로 $ 수신 허용 목록) {\t \t \t \t \t \t \t similar_text ($의은 SafeWord, $ loc를, $의 퍼센트); \t \t \t \t \t echo $ safeword. "". $ loc. "". $ 퍼센트. "
"; \t \t \t \t \t \t \t \t \t \t 경우 ($ %의> = 90) { \t \t \t \t \t \t $ LOC = $은 SafeWord; \t \t \t \t \t \t echo "루프가 부러 졌기 때문에". $ loc. "에서 일치합니다". $ 퍼센트. "%"; \t \t \t \t \t \t 브레이크; \t \t \t \t \t \t} –

+0

\t \t \t \t \t 나는 HTML 페이지에 출력을 살균에 대한 약간의 조언을 덧붙였다. – Barmar

0

을 내가, 내가 그것을 구조 조정을 것 같은 것을 생각 : 당신이 아무것도하지 않는 때문에, Barmar처럼

$loc = ""; 
$safelist = array("Bishops Stortford", "Braintree", "Chelmsford", "Dunmow", "Harlow", "Hertford", "Saffron Walden", "Sawbridgeworth", "Stansted", "Ware", 
       "Essex", "Hertfordshire"); 
if(isset($_GET["loc"])) { 
    /* Gets the value of loc if set, replaces hyphens with spaces and capitalises first letters of words converting the rest to lowercase. */ 
    $loc = ucwords(strtolower(str_replace("-", " ", $_GET["loc"]))); 
} 
$good = ''; 
if (in_array($loc, $safelist)) { 
    $good = $loc; 
} else { 
    foreach ($safelist as $safeword) {  
     similar_text($safeword, $loc, $percent); 
     echo $safeword . " " . $loc . " " . $percent . "<br />"; 
     if ($percent >= 90) { 
      $good = $safeword; 
     } 
    } 
} 
if (! empty($good)){ 
    /* Yes */ 
    if (($good == "Essex") or ($good == "Hertfordshire")) { 
     $county = True; 
    } else { 
     $county = False; 
    } 

    if ($county == False) { 
     echo "\"" . $good . "\" is not a county"; 
    }else{ 
     echo "\"" . $good . "\" is a county"; 
    } 
    //And whatever else you want to do with the good location... 
} 

말을 입력 값은 배열과 비교하는 것 외에는 공격의 위험이 없습니다.

function escape_value($value) 
{ 
    if($this->real_escape_string_exists) 
    { 
     if($this->magic_quotes_active){$value = stripslashes($value);} 
     $value = mysql_real_escape_string($value); 
    } 
    else 
    { 
     if(!$this->magic_quotes_active){$value = addslashes($value);} 
    } 
    return $value; 
} 
0

귀하의 질문의 두 번째 부분에 대답하기 위해, 나는 htmlentities는 데이터베이스에 저장할 전에 입력 데이터에이 기능과 같은에서 화면에 직접 출력 데이터에 사용 `eval ($ loc)`을 호출하지 않으면 PHP 문을 그 안에 넣으면 아무 효과가 없습니다.
관련 문제