Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Całościowe filtrowanie danych
Kildyt
post
Post #1





Grupa: Zarejestrowani
Postów: 869
Pomógł: 53
Dołączył: 20.10.2003
Skąd: Przeworsk

Ostrzeżenie: (0%)
-----


Cześć! (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Piszę aktualnie nowe jądro i chcę przy użyciu jeden funkcji przefiltrować dane pod wieloma względami (html, mysql itp.).

Poczytałem trochę na w internecie o filtrowaniu danych, nawet znalazłem bardzo prosty i zrozumiały wykres: link w .pdf.

Napisałem funkcję filter i wygląda ona tak:
  1. <?php
  2. function filter($give, $type) {
  3.    if (!$type OR is_string($type)) {
  4.        $error = new error;
  5.        
  6.        $error -> show('Nie podałeś typu zmiennej podczas filtrowania danych! 1 - string (tekst), 2 - int (liczba całkowita)', '1');
  7.    }
  8.    
  9.    if ($type == "2") {
  10.        $type = "is_int";
  11.    }
  12.    
  13.    if ($type == "1") {
  14.        $type = "is_string";
  15.    }
  16.    
  17.    
  18.    if ($type($give)) {
  19.        return $give;
  20.    } else {
  21.        $error = new error;
  22.        
  23.        $error -> show('Zawartość zmiennej różni się od jej typu! 1 - string (tekst), 2 - int (liczba całkowita)', '1');
  24.    }
  25. }
  26. ?>


Przykładowe zastosowanie funkcji to:
  1. <?php
  2. $title = filter($_GET['title'], 1);
  3. $id = filter($_GET['id'], 2);
  4. ?>


Spis zastosowanych funkcji do przefiltrowania zmiennej (w kolejności zastosowania): stripslashes, escapeshellcmd, strip_tags, htmlspecialchars, mysql_real_escape_string, urlencode.

Jak myślicie, czy ten skrypt jest poprawny? Zmienić szereg wykonywanych funkcji, może jakąś dodać, lub usunąć?

Ten post edytował Kildyt 4.10.2008, 15:34:51
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
szagi3891
post
Post #2





Grupa: Zarejestrowani
Postów: 109
Pomógł: 9
Dołączył: 12.03.2007
Skąd: kraków/tarnobrzeg/baranów/suchorzów

Ostrzeżenie: (0%)
-----


Ja bym proponował inną funkcję. Przy założeniu że dane zapisane są w kodowaniu utf-8 i jeśli się trzymamy tego kodowania to warto było by sprawdzić czy tekst jest poprawnie zakodowany. Jakiś robot mógłby dodać syf do bazy bądź w czymś tam.

Funkcja którą proponuje sprawdza wpierw sekwencję utf-8 a w przypadku błędnej sekwencji podmienia ją na znak '?'
Entecje zamieniane są na znaki w odpowiednim kodowaniu natomiast tylko kilka znaków zawsze jest pozostawianych w postaci entecji. Oczywiści chodzi o znaki które pozostawione same sobie chciały by wejść w interakcję z naszym kodem.

  1. <?php
  2. function clear_text($dane) {
  3.    $UTF8_BAD =
  4.    '([x00-x7F]'.                          # ASCII (including control chars)
  5.    '|[xC2-(IMG:http://forum.php.pl/style_emoticons/default/haha.gif) F][x80-xBF]'.               # non-overlong 2-byte
  6.    '|xE0[xA0-xBF][x80-xBF]'.           # excluding overlongs
  7.    '|[xE1-xECxEExEF][x80-xBF]{2}'.    # straight 3-byte
  8.    '|xED[x80-x9F][x80-xBF]'.           # excluding surrogates
  9.    '|xF0[x90-xBF][x80-xBF]{2}'.        # planes 1-3
  10.    '|[xF1-xF3][x80-xBF]{3}'.            # planes 4-15
  11.    '|xF4[x80-x8F][x80-xBF]{2}'.        # plane 16
  12.    '|(.{1}))';                              # invalid byte
  13.    
  14.    $temp = '';
  15.    
  16.    while (preg_match('/'.$UTF8_BAD.'/S', $dane, $matches))
  17.        {
  18.        if (!isset($matches[2]))
  19.            $temp .= $matches[0];
  20.        else
  21.            $temp .= '?';                                                        //zastępienie błednych sekwencji znakiem '?'
  22.            
  23.        $dane = substr($dane,strlen($matches[0]));
  24.        }
  25.        
  26.    $dane = $temp;
  27.    
  28.    
  29.    $dane = preg_replace('#[x00-x08x0bx0cx0e-x1f]#si', '', $dane);        //usunięcie znaków niewidocznych oprócz entera i tabulacji
  30.    $dane = preg_replace("#r\n?#", "\n", $dane);                                //znormalizowanie znaków nowej linii
  31.    
  32.    $dane = html_entity_decode($dane, ENT_QUOTES, "utf-8" );                     //usunięcie zbędnych entecji
  33.  
  34.    $dane = str_replace("&", "&amp;"   , $dane);                                //zabezpieczenie znaków niebezpiecznych
  35.    $dane = str_replace("<", "&lt;"    , $dane);
  36.    $dane = str_replace(">", "&gt;"    , $dane);
  37.    $dane = str_replace("'", "&apos;"  , $dane);
  38.    $dane = str_replace("`", "&acute;" , $dane);
  39.    $dane = str_replace('"', "&quot;"  , $dane);
  40.    return $dane;
  41.    }
  42. ?>


tam gdzie jest --- (IMG:http://forum.php.pl/style_emoticons/default/haha.gif) --- powinny być dwa znaki : x D

Ten post edytował szagi3891 7.10.2008, 08:56:17
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 06:01