Najwyższa funkcja czystości/bezpieczeństwa

Mam wiele wejść użytkownika z $_GET i $_POST... W tej chwili zawsze piszę mysql_real_escape_string($_GET['var'])..

Chciałbym wiedzieć, czy można zrobić funkcję, która zabezpiecza, ucieka i czyści $_GET/$_POST tablice od razu, więc nie będziesz musiał sobie z tym radzić za każdym razem, gdy pracujesz z wejściami użytkownika i tym podobne.

Myślałem o funkcji, np cleanMe($input), a wewnątrz niej powinna mysql_real_escape_string, htmlspecialchars, strip_tags, stripslashes (myślę, że to wszystko, aby było czyste i bezpieczne), a następnie return the $input.

Czy to możliwe? Tworzenie funkcji, która działa dla wszystkich $_GET i $_POST, więc zrobisz tylko to:

$_GET  = cleanMe($_GET);
$_POST = cleanMe($_POST);

Więc w Twoim kodzie później, gdy pracujesz z np $_GET['blabla'] lub $_POST['haha'], są one zabezpieczone, rozebrane i tak dalej?

Próbowałem się trochę:

function cleanMe($input) {
   $input = mysql_real_escape_string($input);
   $input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');
   $input = strip_tags($input);
   $input = stripslashes($input);
   return $input;
}
Author: Scott Arciszewski, 2010-11-19

7 answers

Idea ogólnej funkcji sanitarnej jest pojęciem zepsutym.

Istnieje jedna właściwa metoda sanitarna dla każdego celu. Uruchamianie ich wszystkich bez rozróżnienia na łańcuchu często je łamie - Ucieczka fragmentu kodu HTML dla zapytania SQL spowoduje złamanie go w celu użycia na stronie internetowej i vice versa. Kanalizacja powinna być zastosowana tuż przed przy użyciu danych:

  • Przed uruchomieniem zapytania do bazy danych. Właściwa metoda sanitarna zależy od biblioteki, którą użyj; są one wymienione w Jak mogę zapobiec SQL injection w PHP?

  • htmlspecialchars() dla bezpiecznego wyjścia HTML

  • preg_quote() do użycia w wyrażeniu regularnym

  • escapeshellarg() / escapeshellcmd() do użycia w Komendzie zewnętrznej

  • Itd. itd.

Używanie" jednego rozmiaru dla wszystkich " funkcji sanitarnej jest jak używanie pięciu rodzajów wysoce toksycznego środka owadobójczego na roślinie, która z definicji może zawierać tylko jeden rodzaj robaka - tylko po to, aby dowiedzieć się, że twoje rośliny są porażone szóstym rodzajem, na którym nie działają żadne środki owadobójcze.

Zawsze używaj tej jednej właściwej metody, najlepiej prosto przed przekazaniem danych do funkcji. nigdy mieszaj metody, chyba że musisz.

 120
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:26

Nie ma sensu po prostu przekazywać danych wejściowych przez wszystkie te funkcje. Wszystkie te funkcje mają różne znaczenia. Dane nie stają się "czystsze", wywołując więcej funkcji escape.

Jeśli chcesz przechowywać dane użytkownika w MySQL musisz użyć tylko mysql_real_escape_string. Następnie jest w pełni zabezpieczony, aby bezpiecznie przechowywać w bazie danych.

EDIT

Zwróć również uwagę na problemy, które pojawiają się podczas korzystania z innych funkcji. Jeśli klient wyśle np. nazwę Użytkownika do serwera, a username zawiera ampersand (&), nie chcesz wywoływać htmlentities przed zapisaniem go w bazie danych, ponieważ wtedy nazwa użytkownika w bazie danych będzie zawierać &.

 7
Author: Tomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 10:19:29

Szukasz filter_input_array(). Sugeruję jednak użycie tego tylko do walidacji/sanityzacji w stylu biznesowym, a nie filtrowania danych wejściowych SQL.

Dla ochrony przed SQL injection, użyj parametryzowanych zapytań z mysqli lub PDO.

 6
Author: Alan Pearce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 10:21:15

Problem polega na tym, że coś czystego lub bezpiecznego dla jednego użycia, nie będzie dla innego : czyszczenie dla części ścieżki, dla części zapytania mysql, dla wyjścia html( jako html, lub w javascript lub w wartości wejścia), dla xml może wymagać różnych rzeczy, które są sprzeczne.

Ale pewne globalne rzeczy można zrobić. Spróbuj użyć filter_input , aby uzyskać dane wejściowe użytkownika. I użyj prepared statements do zapytań SQL.

Chociaż zamiast funkcji do-it-all, można Utwórz klasę, która zarządza Twoimi danymi wejściowymi. Coś w tym stylu:

class inputManager{
  static function toHTML($field){
    $data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS);
    return $data;
  }
  static function toSQL($field, $dbType = 'mysql'){
    $data = filter_input(INPUT_GET, $field);
    if($dbType == 'mysql'){
      return mysql_real_escape_string($data);
    }
  }
}

Z tego typu rzeczami, jeśli widzisz jakieś $_POST, $GET, $_REQUEST lub $_COOKIE w kodzie, wiesz, że musisz to zmienić. A jeśli pewnego dnia będziesz musiał zmienić sposób filtrowania wejść, po prostu zmień klasę, którą stworzyłeś.

 3
Author: Arkh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 10:22:49

Czy Mogę zasugerować zainstalowanie "mod_security", jeśli używasz apache i masz pełny dostęp do serwera?!
To rozwiązało większość moich problemów. Jednak nie polegaj tylko na jednym lub dwóch rozwiązaniach, zawsze pisz bezpieczny kod ;)
UPDATE Found this PHP IDS (http://php-ids.org;); wydaje się ładne:)

 1
Author: Filipe YaBa Polido,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-20 01:41:25
<?php
function sanitizeString($var)
{
    $var = stripslashes($var);
    $var = strip_tags($var);
    $var = htmlentities($var);
    return $var;
}

function sanitizeMySQL($connection, $var)
{
    $var = $connection->real_escape_string($var);
    $var = sanitizeString($var);
    return $var;
}
?>
 0
Author: vuchkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-11 19:08:10

I used that pass array or get, post

function cleanme(&$array)
{ 
 if (isset($array))
 {
     foreach ($array as $key => $value)
     {
          if (is_array($array[$key]))
          {
           secure_array($array[$key]);
          }
          else 
          {
            $array[$key] = strip_tags(mysql_real_escape_string(trim($array[$key])));
          }
     }
 }
}

Użycie:

cleanme($_GET);   
cleanme($_POST);
 -1
Author: user889030,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-21 16:48:07