2017-02-19 13 views
5

Pracuję w osobistym projekcie i oprócz użycia przygotowanych oświadczeń, chciałbym użyć każdego wejścia jako zagrożenia. W tym celu wykonałem prostą funkcję.Bezpieczeństwo PHP (strip_tags, htmlentities)

function clean($input){ 
if (is_array($input)){ 
    foreach ($input as $key => $val){ 
     $output[$key] = clean($val); 
    } 
}else{ 
    $output = (string) $input; 
    if (get_magic_quotes_gpc()){ 
     $output = stripslashes($output); 
    } 
    $output = htmlentities($output, ENT_QUOTES, 'UTF-8'); 

} 
return $output; 
} 

Czy to wystarczy, czy powinienem użyć następującego kodu?

 $output = mysqli_real_escape_string($base, $input); 
     $output = strip_tags($output); 

Niestety to może być głupie pytanie, ale chciałbym, aby uniknąć problemu ze mną kod :) Dzięki za pomoc

+0

Korzystanie sporządzanych sprawozdań jest wystarczająco bezpieczne i nie wymagają do ucieczki dane w jakikolwiek sposób. Uciekanie jest konieczne tylko wtedy, gdy łączysz zapytania SQL z danymi wejściowymi, co nie ma miejsca w przypadku korzystania z Przygotowanych instrukcji. –

+1

DBMS automatycznie dezynfekuje parametry zawarte w przygotowanej instrukcji na podstawie oczekiwanego typu danych i kodowania. Jeśli ręcznie wychodzisz z łańcucha, a następnie wysyłasz go jako gotowy parametr instrukcji, w rzeczywistości zmniejszasz jego bezpieczeństwo. – apokryfos

+1

Jeśli masz czas, naucz się używać 'PDO' do obsługi interakcji z bazą danych. http://php.net/manual/en/book.pdo.php –

Odpowiedz

5

Cieszę swoje wysiłki. Musisz, przyjazny członek społeczności, rozważ rozłączenie swoich operacji.

) Czy jedna funkcja/rutynowe/klasy/metody filtrowania wejście (filter_input_array(), strip_tags(), str_ireplace(), trim(), etc ...). Możesz tworzyć funkcje, które używają pętli do filtrowania. Sztuczki takie jak podwójne kodowanie, jednorazowe fałszowanie i inne mogą pokonać pojedyncze użycie takich rzeczy, jak strip_tags().

Oto metoda otoki strip_tags() z mojej klasy Sanitizer. Zwróć uwagę, jak porównuje starą wartość z nową wartością, aby sprawdzić, czy są one równe. Jeśli nie są równe, nadal używają strip_tags(). Mimo, że przed wykonaniem tej metody jest całkiem sporo wstępnego sprawdzenia INPUT_POST/$ _POST. Inna wersja tego przy użyciu trim() jest faktycznie wykonywana przed tym.

private function removeHtml(&$value) 
{  
    if (is_scalar($value)) { 
     do { 
      $old = $value; 
      $value = strip_tags($value); 

      if ($value === $old) { 
       break; 
      } 
     } while(1); 
    } else if (is_array($value) && !empty($value)) { 
     foreach ($value as $field => &$string) { 
      do { 
       $old = $string; 
       $string = strip_tags($string); 

       if ($string === $old) { 
        break; 
       } 
      } while (1); 
     } 
    } else { 
     throw new Exception('The data being HTML sanitized is neither scalar nor in an array.'); 
    } 

    return; 
} 

) Mają jeszcze jeden walidacji wejścia (filter_var_array(), preg_match(), mb_strlen, etc ...)

Wtedy, gdy dane muszą przełączać konteksty ...

A) W przypadku baz danych należy użyć przygotowanych instrukcji (najlepiej: PDO).

B) W przypadku zwrotu/nadawania wejście użytkownika do przeglądarki, ucieczka wyjście z htmlentities() lub htmlspecialchars odpowiednio.

Pod względem magicznych cytatów najlepszym rozwiązaniem jest po prostu wyłączyć to w php.ini.

Teraz, z tymi różnymi konstrukcjami mającymi własne obszary odpowiedzialności, wszystko, co musisz zrobić, to zarządzać przepływem logiki i danych w pliku obsługi. Obejmuje to dostarczanie użytkownikowi komunikatów o błędach (w razie potrzeby) oraz obsługę błędów/wyjątków.

Nie ma potrzeby natychmiastowego korzystania z htmlentities() lub htmlspecialchars, jeśli dane przechodzą z formularza HTML bezpośrednio do bazy danych. Punktem ucieczki danych jest zapobieganie interpretowaniu go jako instrukcji wykonywalnych w nowym kontekście. Nie ma niebezpieczeństwa, które można rozwiązać podczas przesyłania danych do silnika zapytań SQL (dlatego filtrujesz i sprawdzasz poprawność danych wejściowych i używasz (PDO) przygotowanych instrukcji).

Jednak po danych są pobierane z tabel bazy danych i jest bezpośrednio przeznaczone dla przeglądarki, ok, teraz używać htmlentities() lub htmlspecialchars. Utwórz function, który używa pętli for lub foreach do obsługi tego scenariusza.

Oto urywek z mojego Escaper klasy

public function superHtmlSpecialChars($html) 
{ 
    return htmlspecialchars($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false); 
} 

public function superHtmlEntities(&$html) 
{ 
    $html = htmlentities($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false); 
} 

public function htmlSpecialCharsArray(array &$html) 
{  
    foreach ($html as &$value) { 
     $value = $this->superHtmlSpecialChars($value); 
    } 

    unset($value); 
} 

public function htmlEntitiesArray(array &$html) 
{  
    foreach ($html as &$value) { 
     $this->superHtmlEntities($value); 
    } 

    unset($value); 
} 

Będziesz musiał dostosować swój kod do własnych upodobań i sytuacji.

Uwaga, jeśli planujesz przetwarzanie danych przed wysłaniem ich do przeglądarki, najpierw wykonaj przetwarzanie, a następnie uciec z wygodną funkcją zapętlenia htmlentities() lub htmlspecialchars.

Możesz to zrobić!

+0

To jest świetna odpowiedź. Myślę, że pierwsze zdanie powinno być sformułowane mocniej: musisz * rozdzielić * swoje operacje, ponieważ * muszą * zdarzyć się w różnych miejscach, aby spełnić swoje cele. Jeśli chodzi o magiczne cytaty, [ostatnia wersja PHP do ich obsługi] (http://php.net/manual/en/security.magicquotes.php) była 5.3, * która przestała otrzymywać oficjalne poprawki bezpieczeństwa [ponad 2,5 roku temu ] (http://php.net/eol.php) *. – IMSoP

+1

@IMSoP Dziękujemy. Pamiętam, że zaczynałem i musiałem studiować bezpieczeństwo informacji. Znajomość * dlaczego * robisz coś (filtr/sprawdzanie poprawności/ucieczkę) ma duże znaczenie. –

+0

Niesamowita odpowiedź. Dzięki! – Tiago

0

scenariusz użycia zarówno strip_tags() and htmlentities or htmlspecialchars().

1.) Jeśli chcesz zdejmować żadnych elementów HTML może być formą wejściowe, które mogą być podatne na atak XSS, a następnie użyj funkcji strip_tags() przed dokonaniem wstawienie do bazy przykładu

$data= strip_tags('<b>Hello</b>'); 

Twoje wyjście będzie "Cześć" i to jest to, co należy przekazać serwerowi.

2.) Jeśli chcesz wydrukować dane w przeglądarce lub na ekranie, możesz użyć htmlentities() or htmlspecialchars() poniżej, aby użyć scenariusza, w którym można go użyć.

//DB PDO Connect.... 
$result2 = $db->prepare('select * from users where uid=:uid'); 
     $result2->execute(array(':uid' =>'1')); 

while ($row = $result2->fetch()) { 


$pic=htmlentities($row['profilepic'], ENT_QUOTES, "UTF-8"); 
} 

Można wtedy print $ pic gdziekolwiek chcesz i być wolne od ataku XSS ....

Powiązane problemy